Import Subscribers With the Attributes You'll Test On

A test can only target, balance and compare what your contact list records. Plan the columns first, such as interests and whether each subscriber is a customer or a prospect, then import them from a file and let signup forms and in-email answers fill in the rest.

Illustrative scenario: the brand, the people and every figure on this page are fictional.

Subject

Which decade do you dress from?

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:

ColumnExampleUsed for
email[email protected]Sending, and matching a contact on later imports
first_nameSamPersonalizing, as {{first_name}}
genreRock–AlternativeTargeting by favourite genre
decade1990sTargeting by favourite decade
customer_typecustomerBalancing 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:

  1. Preview. Check the columns. An Apollo, Clay or HubSpot export is recognized and can be mapped to standard column names in one click.
  2. Consent. Say how these contacts agreed to hear from you. Part 2 covers why this matters.
  3. Verification. Every address is checked, and you choose whether to drop the invalid ones.
  4. 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 decade writes 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.

A typical build-and-send sequence

  1. 1

    Plan your columns

    Decide the attributes you'll target and balance on, such as genre, decade and customer_type, and name them once for every source.

  2. 2

    Create the list

    Under Contacts, click + New list and import a CSV, TSV or Excel file, or a Google Sheets link.

  3. 3

    Answer the consent question

    Say how these contacts agreed to hear from you. The answer decides whether they can get marketing email.

  4. 4

    Drop invalid addresses

    Every address is checked during the import. Remove the invalid ones before saving.

  5. 5

    Keep values current

    Add new contacts with Import CSV, and update existing ones in the grid or through the contacts API, which re-imports don't do.

  6. 6

    Collect interests as you go

    Add fields to a signup form, or save poll and form answers to contact fields.

Frequently asked questions

How many columns can a contacts list have?

Up to 40, including email. Every value is stored as text. Filters ignore capitals, compare numbers as numbers, and order dates written as 2026-10-15 correctly.

Does re-importing a file update my existing contacts?

No. Import CSV on an existing list adds the new contacts and skips addresses already in the list, without changing their values. Edit values in the list's grid, or use the contacts API, which updates only the fields you send.

Should interests be one column or several?

One column per interest family works for a single favourite, such as genre, and filters with equals. For several interests per person, use one yes-or-blank column each. A single column holding a list needs contains, which also matches part of a word.

Why add a customer_type column when my store is connected?

A balanced random sample can only balance on a column of your list. The store sync records purchases and the insights panel can show them, but it doesn't write a list column.

Can subscribers fill in their own interests?

Yes. A signup form field fills the column named by its Key, and a poll, rating, quiz, RSVP or form field can save its answer to a contact field. Only options you wrote are saved, and a blank answer never overwrites a value.

Build this in the studio

Start on the free plan — every interactive block and the full fallback engine are included on every tier.