# Moving a list off Mailchimp, ActiveCampaign or Ontraport

Read this before importing from another platform. The aim is to bring the
consent records as well as the addresses, so that on day one everyone's
status is known and nobody who left is ever emailed again.

## Into Awesomate's Contacts & email

The owner imports, in the hub at https://hub.awesomate.ai/contacts/import
(Bring your list). It takes a spreadsheet (a CSV with an email column),
Mailchimp (an API key, which is used once and not kept, or the subscribed,
unsubscribed and cleaned export files), an ActiveCampaign export (one file per
status, or one file with a Status column) or an Ontraport export (with the
Bulk Email Status column). The hub reads each person's status, puts the
unsubscribed and bounced in first, and sorts everyone by the record of how
they agreed: a sign-up record, needs the owner's word, or unknown. At review
the owner picks the lists, gives their word for the people with no record if
they can, may say that everyone with a given tag is a customer they work with
regularly (which puts them on a customers list), and commits. They can undo an import until the end of that day.

You can't import or commit, because committing is the owner's statement about
who agreed. Your part: read the export first, report the counts per status,
and suggest which list each group or tag belongs on (below).

## Bring these, not just the emails

- Status (subscribed, pending, unsubscribed, bounced, complained).
- When and how they signed up: time, source or form, IP if recorded,
  confirmation time if double opt-in.
- Groups, interests and tags (they map to lists or groups, see below).
- Custom fields worth keeping (suburb, customer type, last job).
- The last 12 months of clicks if available, to send to the most engaged
  first while a new sending address warms up.

## Status maps

| Platform | Status in the source | Becomes |
|---|---|---|
| Mailchimp | subscribed, with OPTIN_TIME / CONFIRM_TIME | Can be emailed on the matching list |
| Mailchimp | subscribed, no sign-up record | Needs the owner's statement before anyone emails them |
| Mailchimp | pending (never confirmed) | Not emailed. See `asking-permission.md` |
| Mailchimp | unsubscribed | Suppressed, permanently |
| Mailchimp | cleaned (hard bounced) | Suppressed, permanently |
| Mailchimp | transactional, archived | Not on any marketing list |
| ActiveCampaign | Active (list status 1) | Can be emailed on that list |
| ActiveCampaign | Unconfirmed (0) | Not emailed |
| ActiveCampaign | Unsubscribed (2), Bounced (3) | Suppressed |
| Ontraport | Opted-in, Double opt-in | Can be emailed |
| Ontraport | Transactional Only | Not on any marketing list |
| Ontraport | Hard bounce, Under review | Suppressed |

Where to find them: Mailchimp exports an audience as a ZIP with subscribed,
unsubscribed and cleaned files (Audience, All contacts, Export Audience); the
API also returns `timestamp_signup`, `timestamp_opt` and `ip_opt`.
ActiveCampaign's API URL and key are under Settings, Developer. Ontraport's
API key and App ID are under Administration, Integrations; the email status
field is `bulk_mail` (Bulk Email Status in an export). For Awesomate, only
Mailchimp is read by API key; ActiveCampaign and Ontraport come in as export
files.

Platform field names change; check the export headers rather than trusting
this table blindly, and say so if a column you expected isn't there.

## Groups and tags: list or group?

- A group or interest someone **chose** on a sign-up form ("Tips", "Specials")
  is a promise: map it to a list.
- A tag the business **applied** ("customer", "Carindale", "VIP") is a fact:
  map it to a field or a group, never to a list.
- When a source has one big list and no groups, everyone goes on the list
  closest to what the sign-up form promised. Find the form wording if you
  can.

## Order of work

1. Read the source and report counts per status before importing anything.
2. Agree the lists (see `list-planning.md`).
3. Import, with suppressions first, so a suppressed address can never be
   re-added as subscribed by a later row. (Awesomate's import does this
   itself.)
4. The owner confirms anything that needs their statement.
5. Decide where new sign-ups go. If the new system takes sign-ups, point the
   website form and any automations at it. Awesomate's Contacts & email
   doesn't host a sign-up form, so keep the form in a tool that records what
   each person agreed to, and import from it.
6. **Keep the old platform open for 30 days after its last send.**
   Unsubscribe links in old emails must keep working for that long. At the
   end, import once more to catch late unsubscribes, then close it.
7. Leave the old platform's DNS records alone until it is closed.

## Things that go wrong

- Re-importing an old export after unsubscribes have happened, which
  re-subscribes people. Suppressions always win.
- Treating "pending" as subscribed. They never confirmed.
- Importing a "leads" or "event attendees" list with no consent as if it
  were subscribers.
- Mapping every tag to a list, so people are "on" ten lists they never
  chose.
- Sending to the whole imported list on day one from a new address. Warm up
  (see `deliverability.md`).
