## Description Adds an admin-only Intercom import workflow under Settings > Data. Admins can connect an Intercom access token, start named historical contact/conversation imports, monitor active and previous import runs, review paginated skip/error logs, download skip logs, and route imported conversations into source-bucket API inboxes that can be renamed later. The import path stores durable source mappings, batches Intercom contact/conversation pages through Sidekiq, records already-imported records as skipped, and writes historical messages without normal outbound delivery callbacks. The PR also includes the Intercom import PRD/TDD document for review context. Closes [CW-7519](https://linear.app/chatwoot/issue/CW-7519/explore-intercom-import) ## Type of change - [ ] Bug fix (non-breaking change which fixes an issue) - [x] New feature (non-breaking change which adds functionality) - [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) - [x] This change requires a documentation update ## How Has This Been Tested? Tested importing using actual data through integration. Screenshots: <img width="1800" height="948" alt="Screenshot 2026-07-02 at 10 48 48 PM" src="https://github.com/user-attachments/assets/e74d9ed6-0bca-47de-b6ef-e589afcddfde" /> <img width="1800" height="1008" alt="Screenshot 2026-07-02 at 10 49 03 PM" src="https://github.com/user-attachments/assets/1bd12fdb-0a47-4287-ac1d-ea308e70a9cd" /> <img width="1800" height="1005" alt="Screenshot 2026-07-02 at 10 49 21 PM" src="https://github.com/user-attachments/assets/3d8145f5-1794-4cc3-b3fa-de5cd80e6ca3" /> <img width="1800" height="1002" alt="Screenshot 2026-07-02 at 10 49 38 PM" src="https://github.com/user-attachments/assets/6f818efd-4193-43c2-84eb-66970dca4490" /> Passed locally: ```sh eval "$(rbenv init -)" && bundle exec rspec spec/models/data_import_spec.rb spec/jobs/data_import_job_spec.rb spec/requests/api/v1/accounts/data_imports_spec.rb spec/requests/api/v1/accounts/integrations/intercom_spec.rb spec/jobs/data_imports/intercom/import_jobs_spec.rb spec/services/data_imports/intercom/importer_spec.rb spec/services/data_imports/intercom/placeholder_inbox_builder_spec.rb spec/services/data_imports/intercom/source_bucket_spec.rb ``` ```sh eval "$(rbenv init -)" && bundle exec rubocop app/controllers/api/v1/accounts/data_imports_controller.rb app/controllers/api/v1/accounts/integrations/intercom_controller.rb app/jobs/data_imports/intercom app/models/data_import.rb app/models/data_import_error.rb app/models/data_import_item.rb app/models/data_import_mapping.rb app/models/integrations/hook.rb app/policies/data_import_policy.rb app/policies/hook_policy.rb app/services/data_imports/intercom db/migrate/20260702000000_expand_data_imports_for_intercom_imports.rb db/migrate/20260702000001_create_data_import_items.rb db/migrate/20260702000002_create_data_import_mappings.rb db/migrate/20260702000003_create_data_import_errors.rb spec/jobs/data_imports/intercom spec/requests/api/v1/accounts/data_imports_spec.rb spec/requests/api/v1/accounts/integrations/intercom_spec.rb spec/services/data_imports/intercom ``` ```sh pnpm exec eslint app/javascript/dashboard/api/dataImports.js app/javascript/dashboard/api/integrations.js app/javascript/dashboard/routes/dashboard/settings/data/Index.vue app/javascript/dashboard/routes/dashboard/settings/data/Show.vue app/javascript/dashboard/routes/dashboard/settings/data/data.routes.js app/javascript/dashboard/routes/dashboard/settings/data/importStatus.js app/javascript/dashboard/routes/dashboard/settings/integrations/Intercom.vue app/javascript/dashboard/routes/dashboard/settings/integrations/integrations.routes.js app/javascript/dashboard/routes/dashboard/settings/settings.routes.js app/javascript/dashboard/components-next/sidebar/Sidebar.vue app/javascript/dashboard/routes/dashboard/settings/inbox/Index.vue ``` ```sh git diff --check ``` Note: the RSpec boot logs the existing local `chatwoot_dev` purge warning because other database sessions are open, then continues and completes with 52 examples, 0 failures. ## Checklist: - [x] My code follows the style guidelines of this project - [x] I have performed a self-review of my code - [ ] I have commented on my code, particularly in hard-to-understand areas - [x] I have made corresponding changes to the documentation - [ ] My changes generate no new warnings - [x] I have added tests that prove my fix is effective or that my feature works - [x] New and existing unit tests pass locally with my changes - [ ] Any dependent changes have been merged and published in downstream modules --------- Co-authored-by: Shivam Mishra <scm.mymail@gmail.com> Co-authored-by: Sivin Varghese <64252451+iamsivin@users.noreply.github.com> Co-authored-by: iamsivin <iamsivin@gmail.com>
66 lines
2.2 KiB
JavaScript
66 lines
2.2 KiB
JavaScript
export const FEATURE_FLAGS = {
|
|
AGENT_BOTS: 'agent_bots',
|
|
AGENT_MANAGEMENT: 'agent_management',
|
|
ASSIGNMENT_V2: 'assignment_v2',
|
|
ADVANCED_ASSIGNMENT: 'advanced_assignment',
|
|
AUTO_RESOLVE_CONVERSATIONS: 'auto_resolve_conversations',
|
|
AUTOMATIONS: 'automations',
|
|
CAMPAIGNS: 'campaigns',
|
|
WHATSAPP_CAMPAIGNS: 'whatsapp_campaign',
|
|
WHATSAPP_MANUAL_TRANSFER: 'whatsapp_manual_transfer',
|
|
CANNED_RESPONSES: 'canned_responses',
|
|
CRM: 'crm',
|
|
CUSTOM_ATTRIBUTES: 'custom_attributes',
|
|
DATA_IMPORT: 'data_import',
|
|
INBOX_MANAGEMENT: 'inbox_management',
|
|
INTEGRATIONS: 'integrations',
|
|
LABELS: 'labels',
|
|
MACROS: 'macros',
|
|
HELP_CENTER: 'help_center',
|
|
REPORTS: 'reports',
|
|
TEAM_MANAGEMENT: 'team_management',
|
|
VOICE_RECORDER: 'voice_recorder',
|
|
AUDIT_LOGS: 'audit_logs',
|
|
INBOX_VIEW: 'inbox_view',
|
|
SLA: 'sla',
|
|
CHANNEL_EMAIL: 'channel_email',
|
|
CHANNEL_FACEBOOK: 'channel_facebook',
|
|
CHANNEL_WEBSITE: 'channel_website',
|
|
CUSTOM_REPLY_DOMAIN: 'custom_reply_domain',
|
|
CUSTOM_REPLY_EMAIL: 'custom_reply_email',
|
|
DISABLE_BRANDING: 'disable_branding',
|
|
EMAIL_CONTINUITY_ON_API_CHANNEL: 'email_continuity_on_api_channel',
|
|
INBOUND_EMAILS: 'inbound_emails',
|
|
IP_LOOKUP: 'ip_lookup',
|
|
LINEAR: 'linear_integration',
|
|
CAPTAIN: 'captain_integration',
|
|
CUSTOM_ROLES: 'custom_roles',
|
|
CHATWOOT_V4: 'chatwoot_v4',
|
|
CHANNEL_INSTAGRAM: 'channel_instagram',
|
|
CHANNEL_TIKTOK: 'channel_tiktok',
|
|
CHANNEL_VOICE: 'channel_voice',
|
|
CONTACT_CHATWOOT_SUPPORT_TEAM: 'contact_chatwoot_support_team',
|
|
CAPTAIN_CUSTOM_TOOLS: 'custom_tools',
|
|
CAPTAIN_V2: 'captain_integration_v2',
|
|
CAPTAIN_TASKS: 'captain_tasks',
|
|
CAPTAIN_DOCUMENT_AUTO_SYNC: 'captain_document_auto_sync',
|
|
SAML: 'saml',
|
|
COMPANIES: 'companies',
|
|
ADVANCED_SEARCH: 'advanced_search',
|
|
CONVERSATION_REQUIRED_ATTRIBUTES: 'conversation_required_attributes',
|
|
CONVERSATION_UNREAD_COUNTS: 'conversation_unread_counts',
|
|
UNREAD_COUNT_FOR_FILTERS: 'unread_count_for_filters',
|
|
};
|
|
|
|
export const PREMIUM_FEATURES = [
|
|
FEATURE_FLAGS.SLA,
|
|
FEATURE_FLAGS.CAPTAIN,
|
|
FEATURE_FLAGS.CAPTAIN_CUSTOM_TOOLS,
|
|
FEATURE_FLAGS.CUSTOM_ROLES,
|
|
FEATURE_FLAGS.AUDIT_LOGS,
|
|
FEATURE_FLAGS.HELP_CENTER,
|
|
FEATURE_FLAGS.SAML,
|
|
FEATURE_FLAGS.CONVERSATION_REQUIRED_ATTRIBUTES,
|
|
FEATURE_FLAGS.ADVANCED_ASSIGNMENT,
|
|
];
|