Skip to main content
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.

What moves, and what you rebuild

The honest summary: people and things you sell move; conversations and behaviour do not.

Move your WhatsApp number

Coming from another provider

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.

Coming from the WhatsApp Business phone app

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.

Coming from no WhatsApp at all

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.

Bring your contacts

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.

The columns

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. 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.

It won’t duplicate people, but it isn’t read-only

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.

Importing can set your automations off

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.

One more thing that stops a migration dead

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.

Carry your opt-outs across

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.

Bring your catalogue

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.

Rebuild what can’t move

Message templates

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.
See Message templates.

Automations and chatbots

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.

Conversation history

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.

Invoices, orders and past money

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.

A cutover plan that keeps you trading

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.

When something goes wrong

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.
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.
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.
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.
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.
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.
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.
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.
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.

Next

Set up your workspace

The full setup order, from business details to your first automation.

Connect WhatsApp

Connecting, registering and the rules that shape everything afterwards.

Import contacts from CSV

The full importer behaviour, column by column.

Data, privacy and consent

Opt-out, blocking and what each one actually stops.

Message templates

Build a template Meta will approve, and track its status.

API reference

Script a bulk or complicated move against the REST API.