flag92 flag92
Blog
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#

AxisIntercomZendesk
Primary usageReal-time chatTickets + email
ExportSolid APIOfficial exporter, slow
Automation complexityMediumHigh (Triggers / Automations / Macros / SLA)
Multi-brandNoneYes (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:

ZendeskChatwoot
ticket.subjectconversation.additional_attributes.subject
ticket.priorityconversation.priority
ticket.status (open/pending/solved/closed)status (open/pending/resolved)
ticket.custom_fields[i]conversation.custom_attributes[i]
commentsmessages
organizationscontacts.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#

WeekWork
1-2Export + mapping scripts
3Trigger / Automation translation design
4n8n workflows
5Historical import (overnight, batched)
6Agent training
7-810% → 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

Search

Press ⌘ K to open