Migrating from Chatwoot to Kommio: what moves, what to check, how long it takes
An operator's view of the Chatwoot importer: what arrives in Kommio and what does not, the dry run and the reports to read, how long each step takes on a large account, and the one rule that keeps a cut-over safe.
Kommio team · · Updated
Most teams that move to Kommio today come from Chatwoot, so the importer is the part of the product we have run most often against other people’s data. This post is the honest version of what it does: what moves, what it leaves behind, what to check before you switch, and how long the steps take. The step-by-step guide with the commands is in the developer center under Migrating from Chatwoot.
What moves
The importer brings a whole Chatwoot account into one Kommio workspace: agents and administrators (as disabled members until you enable them), teams, inboxes, contacts with their custom attributes, every conversation with its messages, private notes and attachments, labels as tags, canned responses, CSAT ratings, business hours, webhooks, the help center, and the macros and automation rules whose conditions and actions have a Kommio equivalent. Reports are rebuilt from the imported history, so your managers see last year’s numbers the day after the switch.
Nothing is sent while it runs: no email, reply, webhook, notification, rule, bot or survey fires for an imported record. That is what makes it safe to import weeks ahead and keep working in Chatwoot meanwhile.
What does not move, and why
Being clear about this up front saves a bad afternoon at cut-over:
- Live connections to WhatsApp, Messenger, Instagram and LINE. Those conversations arrive as read-only history inboxes, with each contact’s channel id kept. Email, website chat, Telegram and SMS inboxes reconnect at the switch; WhatsApp, Messenger and Instagram you connect as new Kommio inboxes with your own Meta app, and LINE has no Kommio channel.
- Chatwoot’s OAuth tokens for mailboxes signed in with Microsoft or Google. They belong to Chatwoot’s app registration; the inbox arrives paused and waits for you to sign in again in Kommio.
- Two-factor secrets. Chatwoot encrypts them with its own key. People enrol again.
- The website token. You replace Chatwoot’s snippet with Kommio’s. Signed-in visitors keep their history, because both products sign a visitor’s identity the same way and the importer keeps the identifier.
- Rich message formats (cards, option lists, forms) become text with their choices and answers; reactions and edit history are not carried.
- Macros and rules that use something Kommio does not have (snooze, mute, email transcript, conditions on browser language or referer). The report names each one, so you know what to rebuild by hand. A step that assigns a team or agent deleted in Chatwoot is left out and the rest of the macro imports; labels only a macro names become tags; and a macro’s webhook step comes over, since Kommio macros send webhooks too.
- Contacts who never wrote to you, if you choose. Chatwoot creates a contact whenever a signed-in user loads a page with its widget, so a busy site holds millions of contacts without a conversation. “Only contacts who contacted you” leaves out every contact with no conversation and no label; the choice is remembered for later catch-ups, and a skipped contact who writes later arrives together with that conversation.
- Custom roles become the Agent role; you re-create them in Kommio, where roles go down to the field.
Two ways in, one importer
An administrator can run the whole thing from Settings › Import with a Chatwoot access token, for Chatwoot Cloud or any Chatwoot reachable over the internet. The same importer also reads a copy of Chatwoot’s database or a pg_dump file, which is what we use for large accounts and for Chatwoot installations on a private network. On Kommio Cloud we run the database import for you; self-hosted operators run the command themselves.
The database path carries a few things the API never exposes, most usefully each agent’s current password hash, so people sign in on day one with the password they already know. A web import followed by a database catch-up never duplicates anything: records are matched by their Chatwoot id.
The dry run is the whole job
Every import starts with a dry run. It reads everything and writes nothing, and its report is the document you plan the switch from: counts per kind of record, every rule and macro that cannot be mapped, canned-response placeholders that have no Kommio equivalent, attachments missing from storage, and people who already have a login on this Kommio server through another workspace. Read it with the person who knows the Chatwoot account. Most surprises at cut-over are things that were in the dry-run report and nobody read.
How long it takes
Numbers measured on Kommio Cloud (4 vCPU, 8 GB, Postgres on the same machine) from database sources:
- Contacts: about 1,000 a second. A tenant with 1.3 million contacts imports its contacts in roughly 25 minutes.
- Conversations and messages: the benchmark account of 10,000 conversations and 150,000 messages takes about a minute.
- A catch-up after a day of changes: one to three minutes.
- Through the API: hours for a large account, because the importer stays within Chatwoot’s rate limit (five requests a second by default).
A run that stops, whether from a lost VPN tunnel or a Ctrl-C, keeps what it wrote and resumes where it stopped when you run the same command again. Import from a dump or a replica near the Kommio server rather than over a VPN: a live database read with pauses is the slowest path by far.
Plan a few GB of Kommio database per million contacts, room for the attachments (identical files are stored once), and, for millions of contacts, give Postgres more than the image defaults. Previews of imported images are made in the background over the following hours, newest first.
Catching up before the switch
After the full import, run catch-ups as often as you like. Each one carries everything that changed in Chatwoot since the previous run: new and edited records, merges, and deletions. Until you switch, Chatwoot’s version always wins: if someone edited an imported record in Kommio and Chatwoot’s copy changed too, the catch-up applies Chatwoot’s and lists the edit under “Kommio edits overwritten” with both values, so you can redo the ones you still want. Chatwoot is the source of truth until your team stops working in it, and a migration that quietly kept two versions of a conversation would be worse than one that tells you which it chose.
What Kommio owns is never touched: replies, notes, conversations, contacts and tags created in Kommio, the switches you set at cut-over, and credentials someone has already used. A catch-up that would delete more than 20% of what it imported of one kind, or more than 1,000 records, stops before writing anything and says so, for the day someone points a run at the wrong account.
The cut-over, and the one rule after it
The window itself is short: stop work in Chatwoot, run the final catch-up (it takes about as long as the last one), swap the widget snippet and the identify call, enter or reconnect each mailbox and pause it in Chatwoot, enable people in Settings › Team, switch on the rules and webhooks you agreed, and move integrations to a Kommio API key.
From that moment, no plain catch-up. Chatwoot keeps changing what it still has (late emails, auto-resolve, snoozes waking up), and a plain catch-up would put those stale changes over your agents’ work. For what still reaches Chatwoot, run the catch-up with “Only new records”: it creates what is new, adds new messages to the conversations they belong to, and never updates or deletes anything imported before. Run it an hour after the switch and at the end of the day, keep Chatwoot running unused for a couple of weeks as the fallback, then archive it.
Rollback is cheap because the import never wrote to Chatwoot: revert the snippet, pause the Kommio mailboxes, resume Chatwoot’s. What was answered in Kommio in between does not flow back; a view on last activity after the switch finds it.
Before you start
Create a free workspace, run a dry run against your Chatwoot account from Settings › Import, and read the report. If the account is large or on a private network, write to [email protected] and we will agree the database path and the timing with you.