Case · A B2B SaaS migrated from Intercom to Chatwoot in 6 weeks
A 2,000-customer, $2M ARR B2B SaaS completed Intercom → Chatwoot migration in 6 weeks. Full timeline, headcount, scars.
Background#
- Business: B2B developer-tool SaaS
- Customers: 2,000+ paid + 6,000+ free
- ARR: ~$2M
- Team: 35 (incl. 6 support + 2 engineers)
- Previous SaaS: Intercom Pro 5 seats + Fin AI ($1,650/mo)
Trigger#
January 2026 Intercom shifted Fin pricing from purely outcome-based to a “AI seat + Resolution” mix. Projected monthly went from $1,650 to $2,800 (+70%). The CFO greenlit “evaluate alternatives.”
Team#
| Role | Headcount | Allocation |
|---|---|---|
| Project manager | 1 | 6 weeks × 50% |
| Backend engineer | 1 | 6 weeks × 100% |
| Support lead | 1 | 6 weeks × 30% |
| Support agents | 6 | Weeks 5-6, 3 hours each |
Total: ~12 person-weeks.
6-week timeline#
Week 1 — export + setup#
- Pulled 28,000+ conversations via Intercom Export API
- 4 Hetzner VPS up: Chatwoot, Dify, Postgres (managed), Redis
- Wrote ~200-line Python import script
- Key finding: Intercom attachment URLs expire — download to S3 within 7 days
Week 2 — automated migration#
- Bulk import 28k conversations overnight (~6 hours)
- Contact profiles, custom fields, tags migrated
- Help Center (80 articles) imported to Dify KB
- 15 critical macros → Chatwoot canned responses
Week 3 — business orchestration#
Redesigned Intercom Triggers / Automations:
| Old Intercom rule | New |
|---|---|
| ”New ticket + priority=high → assign Team Lead” | Chatwoot Automation Rule |
| ”No reply 3 days → escalate” | n8n cron + Chatwoot API |
| ”Customer tagged ‘trial’ → ping sales Slack” | n8n webhook |
| ”Fin can’t answer → create Salesforce lead” | Dify Workflow failure branch + n8n |
Week 4 — prompt + KB tuning#
- Translated Fin “Personality” into a Dify prompt
- 3 cycles of “eval set → tweak chunking → re-eval”
- Default MRR@5 0.71 → tuned 0.88
Week 5 — internal beta + training#
- 3-hour training per agent
- 10% of real traffic → Chatwoot; rest still on Intercom
- Daily failure review
Week 6 — cutover#
- Day 1: 50% / 50%
- Day 3: 80% / 20%
- Day 5: 100% Chatwoot; Intercom read-only
- Day 7: Intercom downgraded to minimum (6-month backup retention)
Cost#
| Item | Intercom (new pricing) | Chatwoot self-host |
|---|---|---|
| Platform / seats | $1,800 | $0 |
| AI seats + Resolution | $1,000 | $0 |
| LLM tokens | — | $80 |
| 4 VPS | — | $120 |
| Email / domain | — | $30 |
| Monthly | $2,800 | $230 |
| Annual savings | $30,840 |
ROI: 12 person-weeks × $100/hr × 40h = $48,000 investment. Net positive after month 19 (realistically month 24 with maintenance).
Business metrics, 4 weeks before/after#
| Metric | Before | After |
|---|---|---|
| Monthly tickets | 2,640 | 2,580 (flat) |
| First response | 4 min (incl. human) | 8 s (AI) |
| AI deflection | 38% (Fin) | 52% (Dify tuned) |
| CSAT (AI leg) | 4.0 | 4.2 |
| Complaint tickets | 3/mo | 5/mo (slight uptick) |
Note: complaint uptick came from edge cases (“custom enterprise pricing”) where the more specific AI stalled. Fix: route these to humans via a Prompt whitelist.
Customer perception#
Week 8 post-migration NPS email:
- “Has support experience changed last month?”
- 80% said “no change or better”
- 12% said “answers are sometimes more detailed” (positive)
- 8% said “sometimes feels robotic” (mainly from long-tenured customers)
Mitigation: tagged accounts skip AI and route directly to humans.
Engineering load by week#
| Week | Engineer | Support lead |
|---|---|---|
| 1 | 40h (setup + script) | 4h |
| 2 | 40h (import + debug) | 6h |
| 3 | 40h (n8n orchestration) | 8h |
| 4 | 30h (prompt tuning) | 20h |
| 5 | 20h (beta bugfixes) | 18h |
| 6 | 20h (cutover + cleanup) | 10h |
| Total | 190h | 66h |
Steady state ongoing: ~5h/week engineering — mostly prompt tweaks and KB updates.
5 key decisions#
- No custom RAG service — used Dify: LlamaIndex would have added 3-4 weeks; Dify covered 90%
- n8n over direct webhooks: rules change often; visual workflows reduce maintenance
- 1 week of parallel running, not 3 days: edge cases surfaced in week 5
- Kept Intercom read-only for 6 months: compliance + rollback insurance
- Train agents, not “fully automate”: humans still own SLAs; AI is a tool
What we should have done#
3 regrets:
- Load test 1 week earlier — day 2 hit Sidekiq OOM
- Customer notification email — sent on cutover day; some long-tenured customers missed it
- Automate KB sync — docs change still requires manual Dify update
Who should migrate#
If you match:
- Intercom > $1,500/mo
- One full-time engineer available for a month
- Support team ≥ 3 people
→ Strongly recommend migrating. Payback < 2 years.
If not (< 5-person team, no engineering capacity, < $500/mo) → stay on Intercom.