> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dmly.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrate to DMLY

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

<Note>
  If you have never had WhatsApp Business before, you are not migrating anything; you are just
  setting up. Go to [Connect WhatsApp](/channels/whatsapp) and
  [Set up your workspace](/getting-started/setup-checklist) instead.
</Note>

## What moves, and what you rebuild

| What                                       | Comes with you?                                       | How                                                                                    |
| ------------------------------------------ | ----------------------------------------------------- | -------------------------------------------------------------------------------------- |
| **Your WhatsApp number**                   | Yes                                                   | Meta's embedded signup, see below                                                      |
| **Approved message templates**             | Only if your WhatsApp Business Account comes with you | **Refresh templates** pulls them in from Meta                                          |
| **Your quality rating and messaging tier** | Held by Meta against the number                       | Read live on **Bot Setup → WhatsApp → Configuration**                                  |
| **Contacts**                               | Yes                                                   | [CSV import](/contacts/import-csv)                                                     |
| **Tags**                                   | Yes                                                   | CSV import on **Contacts → Manage tags**                                               |
| **Custom field definitions**               | Yes                                                   | CSV import on **Settings → Custom fields**                                             |
| **Services**                               | Yes, as new services only                             | [CSV import](/appointments/services)                                                   |
| **Products**                               | Yes, as new products only                             | [CSV import](/offerings/products)                                                      |
| **Past chat and message history**          | **No**                                                | Nothing imports it. Export it from your old tool and keep the file                     |
| **Opt-outs and suppression lists**         | **No**                                                | No importer. See [Carry your opt-outs across](#carry-your-opt-outs-across)             |
| **Past invoices, orders and payments**     | **No importer**                                       | The [API](/api-reference/introduction) can create invoices and orders programmatically |
| **Automations, chatbots and flows**        | **No**                                                | Rebuild them in the [flow builder](/automation/flow-builder)                           |
| **Broadcast history and campaign stats**   | **No**                                                | Export the numbers from your old tool before you leave                                 |
| **Staff, working hours and booking rules** | **No**                                                | Set up by hand, see [Staff and availability](/appointments/staff-and-availability)     |

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.

<Warning>
  **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.
</Warning>

<Steps>
  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>
</Steps>

Full detail on each of these steps, including what the error messages mean:
[Connect WhatsApp](/channels/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.

<Warning>
  **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.
</Warning>

Co-existence is a choice made once, at signup. Switching a number between modes means
disconnecting and reconnecting it. See
[Delete a WhatsApp number](/channels/delete-whatsapp-number).

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

### 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](/channels/whatsapp) and read
[the 24-hour window](/channels/whatsapp#the-24-hour-window-governs-everything) 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](/contacts/import-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.

| 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.                   |
| `stage`         | A [pipeline stage](/contacts/pipeline-stages), matched on its exact name.                    |
| `notes`         | Added as a note on the contact.                                                              |
| `custom_fields` | A JSON object of [custom fields](/contacts/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.

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

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

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

<Warning>
  **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](/automation/triggers).
</Warning>

### 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](/billing/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.

<Warning>
  **DMLY has no way to import opt-out or suppression state.** Not through the CSV importer, and
  not through the [API](/api-reference/introduction). 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.
</Warning>

So decide deliberately, before you build the file:

<Steps>
  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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](/contacts/tags-and-segments) and
    [broadcast audience](/broadcasts/audiences) 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.
  </Step>

  <Step title="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.
  </Step>
</Steps>

Read [Data, privacy and consent](/contacts/data-and-privacy) 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.

<Warning>
  **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](/appointments/services).
</Warning>

**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](/offerings/products).

<Tip>
  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](/contacts/custom-fields), so importing three thousand contacts
  carrying `membership_no` puts the value on every one of them while leaving your definitions
  list empty.
</Tip>

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

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

See [Message templates](/broadcasts/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](/automation/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.

<Warning>
  **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.
</Warning>

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](/api-reference/introduction), 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.

<Warning>
  **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.
</Warning>

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.

<Steps>
  <Step title="Two weeks out: set up DMLY alongside your old tool">
    Create the workspace, fill in your [business details](/account/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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>

  <Step title="Send yourself a test message">
    From your own phone, to the number. If it appears in the [Inbox](/inbox/overview), the channel
    is genuinely live. If it doesn't, stop and fix that before anything else:
    [No inbound messages](/channels/no-inbound-messages).
  </Step>

  <Step title="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.
  </Step>

  <Step title="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.
  </Step>
</Steps>

## When something goes wrong

<Accordion title="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.
</Accordion>

<Accordion title="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.
</Accordion>

<Accordion title="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](/channels/no-inbound-messages).
</Accordion>

<Accordion title="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/message-templates).
</Accordion>

<Accordion title="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.
</Accordion>

<Accordion title="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.
</Accordion>

<Accordion title="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](/billing/plans) and [Choosing a plan](/billing/choosing-a-plan).
</Accordion>

<Accordion title="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](/broadcasts/whatsapp-rules-and-limits).
</Accordion>

<Accordion title="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](/channels/delete-whatsapp-number). Close the account down in the old
  tool once you are satisfied DMLY is receiving.
</Accordion>

## Next

<Columns cols={2}>
  <Card title="Set up your workspace" icon="list-check" href="/getting-started/setup-checklist">
    The full setup order, from business details to your first automation.
  </Card>

  <Card title="Connect WhatsApp" icon="whatsapp" href="/channels/whatsapp">
    Connecting, registering and the rules that shape everything afterwards.
  </Card>

  <Card title="Import contacts from CSV" icon="file-csv" href="/contacts/import-csv">
    The full importer behaviour, column by column.
  </Card>

  <Card title="Data, privacy and consent" icon="user-shield" href="/contacts/data-and-privacy">
    Opt-out, blocking and what each one actually stops.
  </Card>

  <Card title="Message templates" icon="file-lines" href="/broadcasts/message-templates">
    Build a template Meta will approve, and track its status.
  </Card>

  <Card title="API reference" icon="code" href="/api-reference/introduction">
    Script a bulk or complicated move against the REST API.
  </Card>
</Columns>
