A test can only target, balance and compare what your contact list records. Before you run an experiment, give each subscriber the attributes you'll filter on: their interests, and whether they're a customer or a prospect. This part sets those columns up and imports them.
This series has three parts. This one builds the list. Part 2 explains which contacts you may email, and part 3 keeps the list healthy over time.
The examples follow Retro Revival, a fictional vintage clothing shop, with made-up numbers. Its list of 50,874 subscribers later feeds a reward test run as an experiment.
Plan your columns first
A contacts list is a table: one row per subscriber, one column per attribute. The email column is required. Everything else is up to you, with up to 40 columns per list. Decide them before you import, because the names you pick become the fields you filter on and the merge tags you write.
Retro Revival keeps five:
| Column | Example | Used for |
|---|---|---|
email | [email protected] | Sending, and matching a contact on later imports |
first_name | Sam | Personalizing, as {{first_name}} |
genre | Rock–Alternative | Targeting by favourite genre |
decade | 1990s | Targeting by favourite decade |
customer_type | customer | Balancing an experiment's arms |
Every value is stored as text. A filter compares text without caring about capitals, so "Rock–Alternative" and "rock–alternative" match. Numbers compare as numbers when both sides are numbers, and dates order correctly when you write them as 2026-10-15.
Interests: one value, or one column each
A column like genre holds one value: the subscriber's favourite. A filter then uses equals, which is exact. That's how Retro Revival targets "genre equals Rock–Alternative AND decade equals 1990s".
If a subscriber can have several interests, give each interest its own column, such as likes_rock with "yes" or blank. Avoid one column holding a list of interests: contains matches part of a word, so "contains Rock" would also match "Punk Rock".
Customer or prospect
Add a customer_type column with two values, "customer" and "prospect". An experiment's Balanced random sample draws separately within each value of a list field, so both arms get the same mix of buyers and non-buyers. It can only balance on a column of your list.
The experiment's Audience insights panel can also show Purchase history from the purchases MailInApp and your connected store recorded. That view is useful for checking the mix, but it isn't a list column, so it can't be the balance field. Fill customer_type from your store's customer export or your CRM.
Import the file
Go to Contacts and click + New list. The import accepts a CSV or TSV file, an Excel (.xlsx) workbook, or a Google Sheets link. It then runs four steps:
- Preview. Check the columns. An Apollo, Clay or HubSpot export is recognized and can be mapped to standard column names in one click.
- Consent. Say how these contacts agreed to hear from you. Part 2 covers why this matters.
- Verification. Every address is checked, and you choose whether to drop the invalid ones.
- Save.
If the same address appears twice in the file, only its first row is kept, and the import says how many it skipped.
Add more contacts later
Import CSV on an existing list adds the file's new contacts. A column the list doesn't have yet is added to it. An address that's already in the list is skipped, with a note such as "Skipped 12 duplicate emails already in the list". Its values aren't updated.
To change values on contacts you already have, edit them in the list's grid and click Save. To keep them in sync from another system, use the contacts API: it creates contacts that are new and updates only the fields you send on the ones that exist.
Collect interests as you go
You don't need every attribute on day one. Two features fill columns from the subscribers themselves:
- Signup forms. Add up to 10 fields to a signup form, such as a select with up to 20 options. Each field's Key is the column it fills, so a "Favourite decade" select keyed
decadewrites straight into that column. - Answers in an email. A poll, rating, quiz, RSVP or form field can save the answer to a contact field. Set Save answer to contact field in the block's Inspector, for example a poll "Which decade do you dress from?" saved to
decade. Only options you wrote are saved, and a blank answer never overwrites a value. See saving answers to contact fields.
Getting started
Write down the columns you'll target and balance on, using the same names everywhere. Import the list from Contacts, answer the consent question honestly, and drop invalid addresses. Then read part 2 to see how many of those contacts you can actually email.