Skip to main content

Open-source alternatives guide

How to Migrate from Intercom to Chatwoot 2026

Migrate from Intercom to Chatwoot: replace live chat, helpdesk, and omnichannel support with open source and save up to 90% on per-seat costs in 2026.

·OSSAlt Team
Share:

How to Migrate from Intercom to Chatwoot 2026

Intercom's pricing starts at $39/seat/month for the Starter plan and scales to $139/seat for Pro. A 10-seat support team pays $4,680–16,680/year before add-ons. Chatwoot provides live chat, helpdesk, omnichannel support, and customer contact management — self-hosted, no per-seat fees, MIT licensed. Here's how to switch.

TL;DR

Deploy Chatwoot with Docker, replace the Intercom chat widget with Chatwoot's widget, export contacts from Intercom and import them via the Chatwoot API, recreate canned responses and automation rules, and configure your other channels (email, WhatsApp, social). Most teams complete the migration in 1-2 weeks.

Key Takeaways

  • Chatwoot supports the same core channels as Intercom: website chat, email, WhatsApp, Facebook, Twitter, Telegram
  • Canned responses, team assignment, labels, and conversation routing all have Chatwoot equivalents
  • Intercom's Fin AI bot has no Chatwoot equivalent — Chatwoot's bot is basic
  • Help center/knowledge base is not built into Chatwoot — use BookStack, Outline, or Docusaurus separately
  • Chatwoot's user-level pricing is flat: self-hosted is free, cloud starts at $19/month for 5 agents (not per-seat)
  • The widget code swap is 5 minutes; the data migration and team training are the longer work

Why Teams Leave Intercom

Intercom built an excellent product but adopted an enterprise pricing model aggressively. The per-seat pricing is structured to be painful as teams grow. A startup with 5 support agents pays $195-695/month. A mid-sized company with 20 agents pays $780-2,780/month. The bill scales linearly with headcount, which makes growth expensive.

Beyond cost, Intercom has become a platform for multiple products — Messenger, Fin AI, Product Tours, Help Center, Outbound Campaigns — with each requiring separate configurations and potentially separate plans. Teams that just need live chat and a helpdesk are paying for platform complexity they don't use.

Chatwoot focuses on the core support workflow: conversations, contacts, and routing. It does this well across multiple channels — web chat, email, social, and messaging apps — without the pricing structure that scales with team size.

For comparison with other customer communication tools, see best open source CRM software for the broader contact management landscape.

What Maps

Intercom FeatureChatwoot Equivalent
✅ Messenger (live chat)Website inbox (widget)
✅ Inbox (helpdesk)Conversations
✅ Email supportEmail inbox
✅ Social channelsFacebook, Twitter, WhatsApp, Telegram
✅ Canned responsesCanned responses
✅ Team assignmentTeam assignment
✅ Labels/TagsLabels
⚠️ Custom botsBasic bot (limited)
⚠️ Product toursNot available
❌ Outbound campaignsNot available (use Listmonk)
❌ Help center/articlesNot built-in (use BookStack or Outline)
❌ Series (automation flows)Basic automation rules

Step 1: Deploy Chatwoot

git clone https://github.com/chatwoot/chatwoot.git
cd chatwoot
cp .env.example .env

Edit .env and set the required variables:

# Required settings
FRONTEND_URL=https://support.yourdomain.com
SECRET_KEY_BASE=generate-with-openssl-rand-base64-64
POSTGRES_HOST=db
POSTGRES_USER=chatwoot
POSTGRES_PASSWORD=secret

# Email configuration
MAILER_SENDER_EMAIL=support@yourdomain.com
SMTP_ADDRESS=smtp.example.com
SMTP_PORT=587
SMTP_USERNAME=user@yourdomain.com
SMTP_PASSWORD=your-smtp-password

Then start the services:

docker compose up -d

After the first run, prepare the database:

docker compose exec rails bundle exec rails db:chatwoot_prepare

Create your admin account by visiting https://support.yourdomain.com and completing the setup wizard. For production, add nginx as a reverse proxy with Let's Encrypt SSL.

Chatwoot requires PostgreSQL, Redis, and the Rails application. The full stack runs on a 2 GB RAM VPS. With active agent teams handling hundreds of conversations per day, a 4 GB VPS provides headroom for peaks.

Step 2: Replace the Chat Widget

Remove Intercom:

<!-- DELETE THIS -->
<script>
  window.intercomSettings = { api_base: "...", app_id: "YOUR_ID" };
</script>
<script>(function(){var w=window;var ic=w.Intercom;...})()</script>

Add Chatwoot:

<script>
  window.chatwootSettings = { position: "right", type: "standard", launcherTitle: "Chat with us" };
  (function(d,t) {
    var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
    g.src="https://support.yourdomain.com/packs/js/sdk.js";
    g.defer=true; g.async=true;
    s.parentNode.insertBefore(g,s);
    g.onload=function(){
      window.chatwootSDK.run({
        websiteToken: 'YOUR_TOKEN',
        baseUrl: 'https://support.yourdomain.com'
      })
    }
  })(document,"script");
</script>

Find your website token in Chatwoot under Settings → Inboxes → Website → Settings.

Identify users (equivalent to Intercom's user tracking):

window.$chatwoot.setUser('user-id', {
  email: 'user@example.com',
  name: 'Jane Doe',
  avatar_url: 'https://example.com/avatar.png',
  company_name: 'Acme Inc',
  phone: '+1234567890',
});

The setUser call links conversations to your existing customer records. This is important for customer context — support agents can see which user they're talking to and pull up their account history. The user ID should be your internal customer ID so you can correlate Chatwoot conversations with your database records.

React/Next.js integration:

// components/ChatwootWidget.tsx
'use client';
import { useEffect } from 'react';

declare global {
  interface Window {
    chatwootSDK: { run: (config: object) => void };
    $chatwoot: { setUser: (id: string, attrs: object) => void };
  }
}

export function ChatwootWidget({ userId, email, name }: {
  userId: string;
  email: string;
  name: string;
}) {
  useEffect(() => {
    const script = document.createElement('script');
    script.src = 'https://support.yourdomain.com/packs/js/sdk.js';
    script.defer = true;
    script.async = true;
    script.onload = () => {
      window.chatwootSDK.run({
        websiteToken: process.env.NEXT_PUBLIC_CHATWOOT_TOKEN,
        baseUrl: 'https://support.yourdomain.com',
      });
      window.$chatwoot?.setUser(userId, { email, name });
    };
    document.head.appendChild(script);
  }, [userId, email, name]);

  return null;
}

Step 3: Export and Import Contacts

Export from Intercom:

  1. Intercom → ContactsExport → download CSV

Import to Chatwoot via API:

import requests
import csv

CHATWOOT_URL = "https://support.yourdomain.com"
API_KEY = "your-user-access-token"
ACCOUNT_ID = 1

with open('intercom-contacts.csv') as f:
    contacts = list(csv.DictReader(f))

for contact in contacts:
    requests.post(
        f"{CHATWOOT_URL}/api/v1/accounts/{ACCOUNT_ID}/contacts",
        headers={"api_access_token": API_KEY},
        json={
            "name": contact.get("Name", ""),
            "email": contact.get("Email", ""),
            "phone_number": contact.get("Phone", ""),
            "company_name": contact.get("Company", ""),
        }
    )

Import contacts in batches and include a delay between requests if you have thousands of contacts — the Chatwoot API has rate limits. The import creates contact records without conversation history (Intercom conversation history doesn't transfer).

Step 4: Set Up Canned Responses

Canned responses are your most reused support replies. Recreate them from Intercom's saved replies:

  1. Chatwoot → SettingsCanned Responses
  2. Click Add Canned Response
  3. Set a short name (the trigger) and the full response text
  4. Save

Agents type / followed by the short name in any conversation to insert the canned response. This works identically to Intercom's saved replies. Export your Intercom saved replies (Settings → Saved Replies → Export) to get a complete list before rebuilding them.

Step 5: Configure Automation Rules

Replace Intercom's basic automation with Chatwoot's automation rules:

  1. SettingsAutomation
  2. Create rules triggered by conversation events:
Rule: Auto-assign billing conversations
Trigger: Conversation Created
Condition: Content contains "billing" OR "invoice" OR "payment"
Action: Assign to Team → Billing Team

Rule: Auto-label urgent
Trigger: Conversation Created
Condition: Subject contains "urgent" OR "emergency"
Action: Add Label → urgent

Rule: Auto-respond after hours
Trigger: Conversation Created
Condition: Time is outside business hours
Action: Send Message → "We're offline right now. We'll respond within 24 hours."

Chatwoot's automation is less sophisticated than Intercom's Series (which support multi-step flows with delays and branching). For complex automation workflows, integrate Chatwoot's webhooks with n8n or a custom backend.

Step 6: Connect Additional Channels

Chatwoot's inbox system connects multiple communication channels to a single conversation view:

ChannelSetup
EmailIMAP/SMTP configuration in Inbox settings
WhatsAppMeta Business API or Twilio integration
Facebook MessengerFacebook App configuration
Twitter/XTwitter Developer App
TelegramBot Token from @BotFather
InstagramMeta Business API

Each channel appears as a separate inbox in Chatwoot. Agents see all conversations across all channels in a unified view. Routing rules can assign channels to specific teams — for example, routing all WhatsApp conversations to the mobile support team.

Why Migrate from Intercom?

Intercom built a genuinely excellent customer communication platform. The problem is the pricing architecture: $39 per seat per month for the Starter plan, $85 per seat per month for Pro, and $139 per seat per month at the top tier. These numbers compound fast. A 5-seat team on the Starter plan pays $195 per month — $2,340 per year — just for basic live chat and inbox. At Pro, that same 5-seat team pays $425 per month, or $5,100 per year. When you scale to 10 seats, Starter costs $4,680 per year and Pro costs $10,200 per year. At 20 seats, you are looking at $9,360 per year on Starter or $20,400 per year on Pro, before add-ons like Fin AI, Surveys, and Proactive Support.

Chatwoot is MIT licensed, which means you can self-host it on your own infrastructure with zero per-seat fees. The only cost is your server — a 2 GB RAM VPS runs Chatwoot for $15-20 per month regardless of whether you have 5 agents or 50. The savings at different team sizes are significant:

  • 5 seats: Save $1,800 to $4,800 per year compared to Intercom Starter or Pro
  • 10 seats: Save $4,320 to $9,960 per year
  • 20 seats: Save $9,000 to $20,040 per year

Chatwoot covers the features that most support teams actually use: live chat widget, email inbox, WhatsApp, Facebook Messenger, Twitter/X, Telegram, Instagram, and Line. All of these channels feed into a single unified inbox. Conversations are routed to agents or teams with the same flexibility as Intercom. Labels, canned responses, and automation rules are all present and work well.

Chatwoot is not a feature-for-feature replacement for Intercom's expanded product suite — there is no equivalent to Intercom's Fin AI bot, Product Tours, or Help Center built in. But for teams whose Intercom usage centers on live chat and helpdesk operations, Chatwoot delivers the same core workflow at a dramatically lower cost. For a broader view of the open source customer support landscape, the best open source alternatives to Intercom 2026 guide covers additional platforms worth considering alongside Chatwoot.

Setting Up Channels Beyond Live Chat

The live chat widget replacement is the most visible part of the migration, but Chatwoot's inbox system is designed for omnichannel support from the ground up. Every channel you add appears as a separate inbox, and all conversations across all inboxes land in the same unified agent view.

Email inbox setup requires IMAP and SMTP credentials. Go to Settings → Inboxes → Add Inbox → Email. Enter your support email address, then configure the IMAP server (for incoming mail, typically using port 993 with SSL) and SMTP server (for outgoing mail, typically port 587 with STARTTLS). Once configured, emails sent to your support address appear in Chatwoot as conversations, and replies sent from Chatwoot are delivered via your SMTP server from your support address. This is functionally identical to how shared inboxes work in Intercom.

WhatsApp integration uses either the Meta Business API (no ongoing fees, but requires a Meta Business account and phone number verification) or the Twilio integration (simpler setup, but adds per-message fees). For most teams, the Meta Business API route is the better long-term choice. Facebook Messenger and Instagram connect through a Facebook App configuration in your Meta developer account. The process takes about 30 minutes and requires admin access to your Facebook Page. Telegram is the simplest social integration: create a bot via @BotFather, copy the bot token into Chatwoot, and Telegram messages to your bot appear immediately in the inbox.

Agents log into Chatwoot and see a single conversation list. Whether a message arrived via website chat, email, WhatsApp, or Telegram, it looks the same in the interface. Agents reply from the same view without needing to switch between platforms. Each inbox can have its own team assignment and routing rules, so specialized agents handle the right channel without seeing conversations outside their scope.

Team Organization and Routing

Chatwoot's team structure maps closely to how Intercom organizes support teams. Teams are groups of agents — you might have a Billing team, a Technical Support team, and a Customer Success team, each with different members. Conversations can be assigned to a team (which notifies all team members) or to a specific agent. The assignment dropdown in the conversation sidebar works identically to Intercom's assignment UI.

Automation rules handle routing logic. A rule fires when a conversation is created or updated, checks conditions you define (message content contains certain keywords, the inbox it came from, the contact's attributes, time of day), and executes actions (assign to team, assign to agent, add label, send automated message). Building routing automations takes 30-60 minutes to recreate most of what Intercom handles automatically. Chatwoot evaluates rules in order, so arrange them from most specific to most general.

Labels in Chatwoot are equivalent to Intercom's tags. Apply labels to conversations to categorize them — "billing", "bug", "feature-request", "escalated" — and filter your inbox view by label. Labels support quick filtering and are visible on conversation cards in the list view. Create all labels before starting the migration so agents have a consistent taxonomy from day one.

SLA management is available in Chatwoot Cloud Pro and Enterprise plans. For self-hosted deployments, SLA policies can be approximated with automation rules that flag conversations that have been open longer than a threshold and apply an "overdue" label. Custom views save filtered conversation lists for quick access — create a view showing all unassigned conversations in a given inbox, or all conversations labeled "urgent" across all inboxes. These replace Intercom's saved segment views and give agents a focused working queue without manual filtering each session.

Exporting Intercom Data

Before switching to Chatwoot, export your Intercom data to preserve customer records and conversation history. In Intercom, navigate to Settings → General → Data Export. Intercom allows exporting Contacts as a CSV file with name, email, phone, company, and custom attributes. Export this before your subscription ends — you may lose access to historical data after cancellation.

Conversation history is more limited to export. Intercom supports exporting conversation data in CSV format, but the export is flat and loses threading and attachment context. The practical approach is to accept that historical conversation history will not transfer to Chatwoot cleanly. Instead, focus on exporting and importing your contact list, which gives agents customer context even without full conversation history. If specific historical conversations are critical for compliance or audit purposes, export them from Intercom and store them in a separate archive outside of your support platform.

The Python import script in Step 3 handles the contact import. Run it in batches of 100-500 contacts to stay within Chatwoot's API rate limits, and add a short delay between requests for large contact lists with tens of thousands of records.

Common Pitfalls

Missing Intercom features surprise teams who have grown dependent on Intercom's broader platform. Product Tours (in-app onboarding flows) require a separate tool — Shepherd.js is a popular open source option. Outbound campaigns (proactive messages to users) are not available in Chatwoot — use Listmonk for email campaigns or a PostHog feature flag system for in-app messages. The Help Center (knowledge base) is not built into Chatwoot — run BookStack or Outline as a separate self-hosted wiki. Planning for these replacements before the migration prevents the situation where teams migrate away from Intercom but then immediately need to re-evaluate other tools to fill gaps.

Chatbot limitations are the most common disappointment. Chatwoot's built-in bot handles simple keyword matching and predefined responses, but it has nothing close to Intercom's Fin AI. For AI-powered chat responses, integrate Chatwoot's webhooks with the OpenAI API and build a custom bot that receives webhook events and replies via the Chatwoot API. This is a multi-day engineering project, not an out-of-the-box feature.

WhatsApp Business API complexity catches teams off guard. Setting up WhatsApp through the Meta Business API requires verifying your business, registering a dedicated phone number, and going through Meta's approval process. This can take 1-2 weeks. Plan for this before announcing a cutover date.

Email deliverability issues are preventable but common. Chatwoot sends email replies via your configured SMTP server. Ensure your sending domain has SPF, DKIM, and DMARC records configured correctly. Outgoing emails sent from a misconfigured domain will land in spam for your customers. Verify deliverability with a tool like mail-tester.com before going live.

For a more comprehensive look at differences between Chatwoot and Zendesk-style helpdesk platforms, the how to migrate from Zendesk to Chatwoot 2026 guide covers workflows specific to ticket-based support pipelines. Teams wanting a deeper analysis of the Chatwoot feature set versus Intercom's full product suite will find the open source alternatives to Intercom deep dive 2026 useful before committing to the migration.


What You'll Lose (and Alternatives)

Intercom FeatureAlternative
Help center/articlesBookStack or Outline
Product toursShepherd.js (open source) or Intro.js
Outbound campaignsListmonk or Mautic
Custom bots (Fin)Custom integration via Chatwoot webhooks + OpenAI API
User event trackingPostHog or custom analytics
Conversation history importManual or not migrated

Cost Comparison

AgentsIntercom StarterChatwoot Self-HostedSavings
5$195/month$15/month (VPS)$2,160/year
10$390/month$30/month$4,320/year
25$975/month$50/month$11,100/year
50$1,950/month$80/month$22,440/year

Migration Timeline

WeekTask
Week 1Deploy Chatwoot, set up inboxes, swap chat widget
Week 2Import contacts, recreate canned responses and automations
Week 3Run both platforms simultaneously, train agents
Week 4Full cutover, cancel Intercom

The Bottom Line

Chatwoot covers the core Intercom use case — live chat, helpdesk, omnichannel conversations, and team routing — without per-seat pricing. For teams with 5+ support agents, the annual savings are substantial. The main gaps are Intercom's AI bot (Fin), product tours, and help center — all of which can be replaced with separate open source tools.

Post-Migration Configuration and Verification

Once the widget swap is live and contacts are imported, complete the remaining configuration before fully cancelling Intercom. Set up your team structure in Chatwoot — create teams that correspond to your support specializations, such as billing, technical support, and onboarding. Assign agents to teams, and verify that automation rules correctly route incoming conversations to the right team based on inbox source, message keywords, or conversation attributes.

Test every inbox channel you have configured. Send a test message via the website widget, a test email to your support address, and a test WhatsApp or Telegram message if those channels are live. Verify that each test conversation appears in Chatwoot with the correct inbox label and that it gets routed to the expected team. If an automation rule is supposed to assign a label, trigger a test conversation that matches the rule's conditions and confirm the label is applied.

Check your canned responses work under realistic conditions. Have each agent practice using shortcodes in real conversations during the parallel run period. Canned responses reduce response time significantly once agents are fluent with the shortcodes — this is one of the productivity features worth investing training time in during the transition week.

The parallel run period — operating both Intercom and Chatwoot simultaneously — is the safety net that prevents a bad cutover from impacting customers. During this period, direct all new conversations to Chatwoot while keeping Intercom accessible for historical context. After two weeks of parallel operation with no issues, you have confidence that Chatwoot handles all your active workflows. At that point, remove the Intercom widget from all pages and direct your team to use Chatwoot exclusively. Keep the Intercom subscription active for one additional month to ensure you can access historical conversations and any data you may have missed exporting.

Troubleshooting Common Issues

Email delivery is the most commonly misconfigured component in a Chatwoot deployment. Agents receive notifications about new conversations and assignment changes by email, and customers receive conversation replies by email when using the email inbox. If email is not working, open the Sidekiq dashboard at /sidekiq — this background job processor handles all outbound email. Failed email jobs display the specific SMTP error, which typically points to incorrect credentials, wrong port, or TLS mismatch in the environment variables. After correcting the SMTP configuration, restart Sidekiq and requeue failed jobs.

Widget loading issues usually indicate a CORS or SSL misconfiguration. The Chatwoot widget is loaded as a script from your Chatwoot server, and the browser enforces same-origin and mixed-content rules. If your website runs on HTTPS but your Chatwoot server does not have a valid SSL certificate, browsers will block the widget from loading. Ensure your Chatwoot server is accessible over HTTPS with a valid Let's Encrypt certificate before deploying the widget to production pages.

Conversation routing failures — conversations arriving in the wrong inbox or not being assigned to the correct team — are almost always an automation rule ordering issue. Chatwoot evaluates automation rules in the order they appear in the Automation settings. If a general rule matches before a more specific rule, the general rule's actions fire and subsequent rules may not trigger. Reorder your automation rules from most specific to least specific. Use the automation activity log to trace which rules fired for a given conversation.

If the Chatwoot application starts slowly or feels sluggish under load, the first thing to check is Redis connectivity. Chatwoot uses Redis for real-time event broadcasting (which powers the live conversation updates in the agent interface) and for Sidekiq job queuing. If Redis is running on the same server, verify the Redis container is healthy and that the REDIS_URL environment variable in Chatwoot's config points to the correct host and port. Adding Redis memory caching via the REDIS_SENTINELS or standalone Redis connection also significantly improves read performance on the contacts and conversation search endpoints.

For teams that find Chatwoot's feature set insufficient and want a more comprehensive open source customer support platform, the best open source alternatives to Intercom guide covers additional options including Papercups, Zammad, and HelpDesk, each with different trade-offs in feature completeness versus operational simplicity.

Long-Term Cost Savings and Data Ownership

The financial case for switching from Intercom to Chatwoot is compelling at almost every team size. Intercom's Starter plan at $39 per seat per month costs a 10-person team $4,680 per year. At the Pro tier, the same team spends $16,680 per year. Self-hosted Chatwoot on a $20/month VPS costs $240 per year for an unlimited number of agents, channels, and conversations. The savings fund significant engineering investments or cover the cost of multiple other self-hosted tools.

Data ownership is the other major argument. Every conversation your support team has with a customer, every contact record, and every automation configuration lives on your own infrastructure. There is no vendor with the ability to change pricing, restrict access, or shut down your support operations. For companies handling sensitive customer communications — healthcare, legal, financial services — or for companies with contractual obligations around data residency, self-hosting is not optional. Chatwoot's data handling also simplifies GDPR compliance: you control where data is stored, how long it is retained, and who has access.

The cost of open source vs SaaS analysis provides a framework for calculating the full ROI of a migration like this, accounting for both the direct subscription cost savings and the one-time migration effort and ongoing maintenance investment.


Compare customer engagement tools on OSSAlt — live chat, helpdesk features, and pricing side by side.

See open source alternatives to Intercom on OSSAlt.

The SaaS-to-Self-Hosted Migration Guide (Free PDF)

Step-by-step: infrastructure setup, data migration, backups, and security for 15+ common SaaS replacements. Used by 300+ developers.

Join 300+ self-hosters. Unsubscribe in one click.