Published Sun Jan 25 2026 08:00:00 GMT+0800 (中国标准时间)
migrationChatwootZendesk
Migrating from Zendesk to Chatwoot — translating tickets and triggers
Zendesk's ticketing is heavier than Intercom's; the hardest part of migrating to Chatwoot is rewriting Triggers / Automations / Macros.
Why Zendesk is harder than Intercom#
| Axis | Intercom | Zendesk |
|---|---|---|
| Primary usage | Real-time chat | Tickets + email |
| Export | Solid API | Official exporter, slow |
| Automation complexity | Medium | High (Triggers / Automations / Macros / SLA) |
| Multi-brand | None | Yes (separate forms per brand) |
Zendesk’s Triggers + Automations + Macros + SLA Policies have no 1:1 equivalent in Chatwoot. Redesign required.
Two phases#
Step 1 — data migration (easy)#
curl "https://yoursubdomain.zendesk.com/api/v2/tickets.json?page=1" \
-u email/token:API_TOKEN > tickets.json
curl "https://yoursubdomain.zendesk.com/api/v2/users.json" \
-u email/token:API_TOKEN > users.json
Mapping:
| Zendesk | Chatwoot |
|---|---|
ticket.subject | conversation.additional_attributes.subject |
ticket.priority | conversation.priority |
ticket.status (open/pending/solved/closed) | status (open/pending/resolved) |
ticket.custom_fields[i] | conversation.custom_attributes[i] |
comments | messages |
organizations | contacts.additional_attributes.organization |
Step 2 — automation translation (hard)#
Triggers (run immediately on condition)#
Zendesk Trigger: “New ticket + priority=high → assign Team A”
Chatwoot equivalent: Automation Rule (conversation_created / updated)
name: High priority to senior team
trigger: conversation_created
conditions:
- priority == high
actions:
- assign_team: senior-team-id
Automations (scheduled)#
Zendesk Automation: “Unanswered after 12h → escalate”
Chatwoot has no native scheduled Automation. Wire n8n:
n8n cron (every 10 min) →
query Chatwoot API for all conversations
→ filter not-replied > 12h
→ escalate + notify
Macros#
Zendesk Macros bundle text + field changes + tags. Chatwoot Canned Responses are text-only. Split:
- Text → Canned Response
- Field changes → Custom View / Manual Action
- Tag changes → same
SLA Policies#
Chatwoot 4.x supports SLAs:
sla_policy:
name: Premium customers
first_response_time_threshold: 1h
next_response_time_threshold: 4h
resolution_time_threshold: 24h
applicable_when:
- contact.tag == premium
Multi-brand#
Zendesk isolates per brand with its own Help Center and ticket form. Chatwoot approximates with multi-Account or multi-Inbox:
- Multi-Account — total isolation (enterprise)
- Multi-Inbox — single account, by inbox (SMB)
Real timeline#
| Week | Work |
|---|---|
| 1-2 | Export + mapping scripts |
| 3 | Trigger / Automation translation design |
| 4 | n8n workflows |
| 5 | Historical import (overnight, batched) |
| 6 | Agent training |
| 7-8 | 10% → 50% → 100% traffic switch |
Don’t#
- Don’t cut over without parallel run — many Zendesk Automations have run unmaintained for years; you’ll only find out what’s missing after cutover
- Don’t drop historical search — customers will ask “what about that ticket from last month”
- Don’t carry every macro — let the support team curate to 30-50 actually used; drop the rest