Move your WhatsApp number, contacts and catalogue over from another WhatsApp tool, a CRM or a spreadsheet, and know exactly what has to be rebuilt.
Switching to DMLY is two jobs that run on different clocks.Your WhatsApp number is Meta’s business, not DMLY’s. A number lives on one WhatsApp Business
Account and can be connected to one Cloud API provider at a time, so moving it means moving it at
Meta and connecting it here. That part has waiting in it.Your data is DMLY’s business. Contacts, tags, custom fields, services and products all have
CSV importers. Everything else (chat history, opt-outs, past invoices, the automations you built
in your old tool) has no importer, and pretending otherwise is how people lose things. This page
says plainly which is which.
If you have never had WhatsApp Business before, you are not migrating anything; you are just
setting up. Go to Connect WhatsApp and
Set up your workspace instead.
Wati, AiSensy, Interakt, 360dialog, Twilio, Respond.io and the rest are all WhatsApp providers;
Meta calls them Solution Providers or Tech Providers. Your number is registered for Cloud API
through one of them today, and only one provider can hold it at a time. Moving it is a Meta
action; DMLY picks it up at the end.Two things decide how much work is left over:
Who owns the WhatsApp Business Account. If the account is yours, in your own Business
Manager, it comes across with everything on it, including your approved templates. If your old
provider owns it and the number ends up on a different account, the templates stay behind and
you re-submit them. Check this before you do anything else; it is the difference between a
same-day switch and a week of template reviews.
Two-step verification. It has to be off on the number before you start. DMLY says so on the
connect screen.
Turn off two-step verification for the number before you start. DMLY’s connect page puts it
this way: “Please disable your 2FA from your WhatsApp Business Manager if you choose to proceed
with migrating from another Solutions Provider or Tech Provider.” A migration attempted with
2FA still on fails.
1
Get your house in order at Meta
In your own WhatsApp Business Manager, confirm you have admin access to the business that
holds the number, and turn off two-step verification for it.If your old provider owns the WhatsApp Business Account rather than you, this is the point to
ask them to release the number; that request goes to them, not to DMLY.
2
Note what you are about to lose sight of
Once the number moves, your old tool stops receiving on it. Export anything you still want
(chat transcripts, your opt-out list, campaign reports) while you can still log in there.
None of it can be imported into DMLY later.
3
Connect the number in DMLY
Go to Integrations → Channels, select Add account, then the WhatsApp tile, then
Connect a WhatsApp number. You are handed to Facebook to sign in, pick the WhatsApp
Business Account, add the number and verify it with the code Meta sends.Complete every screen. Stopping halfway returns you to DMLY with nothing granted.
4
Register the number
Connected is not the same as registered. Open Bot Setup → WhatsApp → Configuration, and if
the number shows Not registered, enter its 6-digit two-step verification PIN to register
it for Cloud API messaging.
5
Check what came with it
The Configuration tab reads your number’s quality rating and messaging limit tier straight
from Meta every time you open it; they are Meta’s record of the number, not DMLY’s, so check
them here rather than assuming a fresh start. Then open Templates and select Refresh
templates to see which of your templates exist on the account DMLY is now connected to.
Full detail on each of these steps, including what the error messages mean:
Connect WhatsApp.
This is the case where you may not have to give anything up. By default, connecting a number to
the Cloud API takes it over exclusively and the WhatsApp Business phone app stops working on it.
Co-existence mode is the alternative: the phone app and DMLY share the same number.On the connect screen, below the main button, there is a separate section (Already using the
WhatsApp Business app?) with its own Connect in co-existence mode button. Use that one
instead of the main button. The rest of Meta’s signup is the same.What co-existence actually gives you:
You keep chatting from the phone. The app stays working on the number.
Messages you send from the phone app appear in the DMLY inbox too, on the same contact, so
the thread stays in one place. They are recorded as sent by you, and they are never routed to
your bot; a human is clearly already handling that conversation.
A contact record is created for anyone you message from the phone, so your list fills in as
you work rather than all at once.
Automation still runs on the number. If you would rather the bot stayed quiet on any
conversation you have personally answered from the phone, turn on Pause the bot when I reply
from the phone app; it pauses the bot for that one contact, and it is off by default.
Co-existence does not bring your past chats over. The DMLY inbox starts empty and fills from
the moment the number is connected; nothing imports the conversations already on your phone,
and nothing imports your phone’s address book. Your history stays on the handset, where it
always was. If you need those conversations later, keep the phone.
Co-existence is a choice made once, at signup. Switching a number between modes means
disconnecting and reconnecting it. See
Delete a WhatsApp number.
Both the Co-existence badge and the pause toggle live on the connect page. Go back to it the
way you came: Integrations → Channels, Add account, then the WhatsApp tile; with a
number already attached it shows your connected number, the badge and the toggle instead of a
fresh connect form.They are not on the Bot Setup → WhatsApp → Configuration tab used for registering the
number a few steps above. Both screens are headed WhatsApp Cloud API Configuration, which is
the easiest wrong turn on this page; that one covers registration, profile, commerce and
calling.
Moving off a CRM, a booking system or a spreadsheet with no WhatsApp Business number in the
picture? Then there is nothing to migrate on the channel side.
Connect a fresh number and read
the 24-hour window before you import
anyone, because it changes what you can say to an imported list on day one.
The contacts CSV importer is the main road out of another CRM or a spreadsheet. Read
Import contacts from CSV for the full behaviour; this is what matters when
you are migrating.Connect your WhatsApp number first. The importer attaches every contact to the channel that is
selected when you run it, and it refuses to run at all with no channel active
(“Select a channel before importing.”). Importing before your number is live means importing
onto the wrong channel.
Take Download sample on the import page and match it. The header row is what the importer
reads: order follows your header, capitalisation and stray spaces are ignored, and any column
not in this list is thrown away.
Column
What it does
name
Required. A blank name skips the row, and the importer counts it for you.
country_code
Glued onto the front of phone, with nothing in between, to make the full number.
phone
Required. A blank phone skips the row, counted the same way.
email
Saved on the contact and used for matching. Not in the sample file, but it is read.
tags
Tag names separated by | or ,. Tags that don’t exist yet are created.
A JSON object of custom fields, for example {"company":"Acme"}.
Three things bite migrators specifically:
A CSV of email-only contacts imports nobody. Every row needs a phone number. If your old
tool was email-first, expect to lose the rows that have no mobile number.
Put the country code somewhere, once. If your export already has full international numbers
in phone, leave country_code empty; otherwise you get the country code twice and the
numbers are unreachable.
Quote anything containing a comma. An unquoted comma inside a note shifts every later value
one column right and pushes the last column off the end of the row.
Before creating anything, the importer looks for an existing contact anywhere in the workspace
with the same phone or the same email. On a match it adds the identity and fills blanks
rather than making a second person. That makes a second pass safe, but not harmless:
name, email, phone and stage are only filled in where they are empty.
Tags are replaced, not added to. A file with an empty tags column strips every tag from
everyone it matches.
Custom fields are overwritten on the keys your file sets.
The notes value is added again, on every run.
Migrating in stages? Export from DMLY between passes. Export on the Contacts page writes the
same seven columns the importer reads, so you can carry your current tags forward in the next
file instead of wiping them.Blank the notes column before you re-import that file, though. The export joins all of a
contact’s notes into one cell, and the importer adds the cell back as a fresh note, so every
round trip leaves another copy of the whole history stacked on the contact.
This is the migration trap nobody expects, and it is worth two minutes of prevention.A CSV import starts automations, one run per row, with no batching:
New contact fires for every row that creates a contact.
Tag applied fires for every tag the file attaches; the tags column goes through the same
path as tagging from the inbox.
Field changed fires for every row that changes an existing contact’s custom fields.
Import three thousand people with a welcome flow switched on and you have queued three thousand
welcome flows.
Pause your automations before a big import. Open Automation, and set any automation
built on New contact, Tag applied or Field changed to Paused before you upload.
Pausing stops it starting anything new and keeps the published version intact, so switching it
back on afterwards resumes exactly as it was. See Triggers.
Your plan caps how many contacts a workspace can hold, and the whole file is checked before a
single row is written, so an import that would take you over the cap imports nothing at all.
The check is deliberately cautious: rows that would only have matched someone you already have
still count toward the estimate. See Plans.
If someone told your old tool to stop messaging them, that instruction does not travel with a CSV.
This is the one part of a migration with legal weight, so here is the plain truth.
DMLY has no way to import opt-out or suppression state. Not through the CSV importer, and
not through the API. A contact’s opted-out state is set when they
send a stop keyword on a channel, or when a flow’s Unsubscribe Contact step runs on them.
There is no field, column or endpoint that sets it in bulk. Everyone you import arrives
messageable.
So decide deliberately, before you build the file:
1
Export your suppression list from the old tool first
Do this while you still have access. Once the number moves, that tool has nothing to show you.
2
Leave opted-out people out of the CSV
This is the safest option by a distance, and usually the right one. A person who is not in the
workspace cannot be broadcast to by accident, cannot be swept into a segment, and cannot be
messaged by a teammate who did not know. If you have no business reason to hold their record,
do not import it.
3
If you must keep them, tag them and exclude the tag everywhere
Give them a tag of your own in the tags column (Do not contact does the job) and add it
to Exclude contacts with tags on every segment and
broadcast audience you build.Use your own tag rather than the built-in Unsubscribe one. DMLY manages that tag itself:
it attaches it when someone opts out and removes it when they opt back in, so a marker you
applied by hand can vanish without you touching it.Understand what this is and isn’t: the tag is a filter you are applying by hand, not the
opt-out flag. Importing the Unsubscribe tag does not opt anyone out. Sequences,
automations and any audience where you forgot the exclusion will still send to them.
4
For the ones that really must never be messaged, block them
Blocking is the only switch short of deletion that also stops a teammate replying by hand; it
disables the inbox composer. It is set per conversation, so it is one at a time, which is
exactly why option two above is better for a long list.
Read Data, privacy and consent before you send anything to an
imported list. And remember the other half: importing a list is not consent. WhatsApp holds
you to what the contact agreed to, not to what your spreadsheet says.
If you sell services or products, both have their own CSV importer and both only ever add.Services: columns name, type, category, duration_min, price, currency,
capacity, description, active. name is the only required one; type is appointment,
class or add_on and anything else imports as appointment. A row whose name matches an
existing service is skipped rather than overwritten, so a re-run never damages what you have.
An imported service is not bookable yet. The CSV has no columns for staff or working hours,
so every imported service arrives with an empty schedule and nobody assigned, while still
showing on your public booking page, offering zero times. Assign staff who have their own
Working hours, or set the service’s own weekly availability, before you point anyone at your
booking page. Full detail: Services.
Products: columns name, sku, price, cost_price, currency, tax_rate,
tax_inclusive, track_stock, stock_quantity, low_stock_threshold, category, active,
description. Every row with a name becomes a new product; nothing is matched against what
you already have, so uploading the same file twice gives you two of every product. Import once,
check, and make later changes in the app. Full detail: Products.
Tags and custom field definitions have CSV importers of their own: tags on
Contacts → Manage tags, where Import CSV and Download sample sit above the tag
list, and custom fields on Settings → Custom fields.Neither is a prerequisite for importing contacts: the contacts importer creates any tag it
doesn’t already have, and it writes whatever your custom_fields column contains without
checking it against your definitions. Import them anyway if you want your tag colours and a
tidy field list from the start. And note that a custom_fields column never registers its
keys on Custom fields, so importing three thousand contacts
carrying membership_no puts the value on every one of them while leaving your definitions
list empty.
Templates belong to your WhatsApp Business Account at Meta, not to DMLY and not to your old
provider’s software. That single fact decides your timeline:
The account comes with you → your approved templates come with it. Open Templates,
select Refresh templates, and they appear in DMLY with their current status pulled from
Meta. Nothing to re-submit.
The number lands on a different account → the templates do not follow. Every one you rely on
has to be recreated and submitted to Meta for review again.
On top of your own templates, DMLY submits its own built-in dmly_ templates for review the
moment a live number connects. Those cover appointment confirmations and reminders, invoices,
receipts, review requests and more. Until Meta approves them, the notifications that depend
on them are not sent at all to anyone whose 24-hour window is shut.
Meta reviews templates on Meta’s schedule. Plan around it: nothing you send to a cold contact
(no broadcast, no reminder, no receipt) works until the template it uses is Approved. This
is the longest lead time in the whole move, which is why the cutover plan below starts with it.
There is no importer for flows, and no format DMLY reads from another tool. Rebuild them in the
flow builder, and treat it as a chance to drop the branches nobody
used. Start from a ready-made template rather than a blank canvas where one fits.
Nothing imports past messages, from any source. The inbox starts on the day you connect.
Do not try to backfill history through the API.POST /messages is a send; it routes
through the same path as the inbox composer and really delivers the message to the customer.
Replaying last year’s conversations through it would message your entire list.
Export transcripts from your old tool and keep the file somewhere you can search it. That is the
whole answer today.
There is no CSV import for finance records. What exists is the
REST API, which can create invoices, orders and contacts
programmatically, so a large or complicated move can be scripted rather than typed.Two things to know if you go that way:
POST /invoices creates a draft. Nothing reaches the customer until you make the separate
POST /invoices/{invoice}/send call, so a backfill never emails or messages anyone an invoice
from years ago.
POST /appointments is different: booking through it sends the customer a confirmation and
seeds their reminders, exactly as a real booking does. Do not use it to replay a back catalogue
of past appointments.
A finance backfill starts automations, the same as a contacts import does. Creating an
invoice fires Invoice created; creating an order fires Order created; and either one,
against a contact who isn’t a client yet, also fires Contact converted to client and
Lifecycle stage changed. A script that loads a year of invoices starts one run per record.
Set those four to Paused before you run it, and switch them back on afterwards, the same
precaution as the contacts import above.
For most businesses the pragmatic answer is: keep the old system read-only for a few months for
lookups, and start DMLY clean from the switchover date.
The order matters because template review is the only step that waits on someone else.
1
Two weeks out: set up DMLY alongside your old tool
Create the workspace, fill in your business details, invite your
team. Import your tags and custom fields. Nothing here touches your live number, so there is
no risk in doing it early.
2
Then: export everything from the old tool
Contacts, suppression list, chat transcripts, campaign reports, invoice records. You will not
get another chance once the number moves. Keep the files.
3
Then: import your catalogue and set availability
Services and products, then staff, working hours and booking rules. Check your booking page
offers real times before anyone sees it.
4
Turn off two-step verification on the number
At Meta, in your WhatsApp Business Manager. Do this before you attempt the connect, not
during it.
5
Move the number and connect it
Off-peak, on a quiet day. There is a gap between your old tool losing the number and DMLY
registering it, and messages sent to you during it can be missed, so pick the quietest hour
you have, not the busiest.
6
Immediately: get templates moving
Select Refresh templates. Whatever isn’t there, create and submit now, while you still have
other things to do. Everything downstream waits on this.
7
Send yourself a test message
From your own phone, to the number. If it appears in the Inbox, the channel
is genuinely live. If it doesn’t, stop and fix that before anything else:
No inbound messages.
8
Pause your trigger-based automations, then import contacts
Pause anything on New contact, Tag applied or Field changed. Import the file with
your WhatsApp channel selected. Check the count that comes back against your row count, then
switch the automations back on.
9
Rebuild your automations, then broadcast
Build the flows you actually use, test each one on yourself, and only then send your first
broadcast, once its template is Approved and your audience excludes everyone who opted
out at the old tool.
The migration failed and the error mentions verification or 2FA
Two-step verification is still on for the number at Meta. Turn it off in your WhatsApp Business
Manager and run the connect again. DMLY warns about this on the connect screen before you
start, which is why it is the first thing to check.
Signup finished but DMLY says no WhatsApp Business Account was granted
The Facebook flow was not completed all the way through: closing the window early, or skipping
a permission screen, returns you with nothing granted. Retry the signup and complete every
screen. If it says the account has no phone number yet, finish verifying the number at Meta
first, then retry.
The number connected but nothing arrives in the Inbox
Check two things on Bot Setup → WhatsApp → Configuration: the number must show
Registered, and the WhatsApp Business Account must be subscribed. A number that is verified
but not registered cannot send or receive anything, even though DMLY shows it as connected.
Full walkthrough: No inbound messages.
Your templates aren't in DMLY after the move
Select Refresh templates first, to sync now rather than waiting for the next automatic pass.
If they are still missing, the number is on a different WhatsApp Business Account from the one
that held them. Templates belong to the account, so they cannot be pulled across from elsewhere;
recreate and re-submit them. See Message templates.
Broadcasts have nothing to send
The broadcast picker lists Approved templates only. Draft, Pending and Rejected templates do
not appear at all. If everything is Pending, you are waiting on Meta; there is no way to
accelerate it from DMLY.
Fewer contacts imported than rows in your file
Almost always a blank name or a blank phone number. You don’t have to guess how many: the
message you land back on says “N contacts imported. M row(s) skipped — missing a name or a
phone number.” Read that count first. If it matches your own tally of empty cells, nothing
else is wrong and you can fix those rows and re-run.If nothing imported, DMLY says so on the upload screen rather than reporting a green zero,
and that almost always means the header row doesn’t contain name, country_code and phone
spelled the way the importer expects. Take the sample file and copy its header exactly.
The whole import was blocked
Your plan’s contact cap. The file is checked in full before anything is written, so an import
that would take you over the cap writes nothing; there is no half-finished state to clean up.
See Plans and Choosing a plan.
Contacts arrived but you can't message them
Expected, and not an import problem. An imported contact has never messaged you, so they have no
open 24-hour window; they can only be reached with an approved template until they reply. See
WhatsApp rules and limits.
Your old tool still shows the number as connected
That is between you and them. DMLY cannot release, delete or change a number on another
provider’s account, and disconnecting in DMLY does not touch anything at Meta. See
Delete a WhatsApp number. Close the account down in the old
tool once you are satisfied DMLY is receiving.