Skip to main content
There are four ways to add contacts to Brew. Use whichever fits your workflow. Open the Audience tab in the sidebar, then click Add contacts in the top right to choose a method. Moving from another platform? The migration guides cover contacts, consent, and suppressions for Mailchimp, Klaviyo, Postmark, Brevo, Customer.io, and Loops.
Every marketing recipient must have opted in to hear from you. Importing or syncing contact data into Brew is not permission to email it. See What You Can Send.

CSV Upload

The fastest way to import a lot of contacts at once. Brew handles deduplication and partial updates automatically, and can validate every address as it’s imported if you opt in.
1

Prepare your CSV

Required column:
  • Email, the contact’s email address
Recommended:
  • First Name
  • Last Name
Optional:
  • Subscribed. true or false. Defaults to true if missing.
  • Any custom property you’ve created in Brew
Dates are safest as YYYY-MM-DD. See date formats for everything Brew reads.
2

Open the import screen

Audience → Add contacts → CSV Upload.
3

Upload your CSV

Drag and drop, or click to browse. Wait for it to process.
4

Map columns to Brew properties

For each CSV column, confirm the mapping is right. Unrecognized columns become new custom properties, named in camelCase: a push source column becomes pushSource. Use that name in merge tags and filters.For a date column, the row shows the order its dates are read in. When every date could be either (03/04/2026 is 3 April or 4 March), pick the reading that matches your file. A column with a day over 12 anywhere is detected for you.
5

Review and import

Tick the consent checkbox to confirm these contacts agreed to receive your marketing email. Brew records consent once for the whole file, dated the day you import.To deliverability-check every address as it’s ingested, tick the validation checkbox (2 credits per address). Then click Complete Import. Contacts process in the background, so you can navigate away.

Updating Existing Contacts

CSV upload also updates contacts that already exist.
Brew matches on email address. If the email exists, the row updates the existing contact. If not, a new contact is created.
Empty cells don’t overwrite existing data. Only cells with values update the corresponding property.
  • If the Subscribed column is missing, new contacts are subscribed by default and existing contacts keep their status.
  • To import unsubscribed contacts, include Subscribed with false (or a status exported from another email platform, such as unsubscribed or cleaned). This also unsubscribes contacts that already exist, so the import tells you how many before you confirm.
  • The importer never re-subscribes contacts who have previously unsubscribed.

Common Issues

If your CSV has duplicate emails, Brew processes them in order: the last row wins. Deduplicate before uploading to avoid surprises.
Emails must be in a valid format (such as name@domain.com). Invalid emails are flagged at the review step and skipped.
Make sure your CSV is UTF-8 encoded. Garbled characters in the column-mapping screen mean the file isn’t UTF-8, so re-export it.
A date like 03/04/2026 can be read day first or month first. Check the order shown on the date column at the mapping step, or convert dates to YYYY-MM-DD before uploading.When importing over the API, or updating existing contacts with update_contacts_csv over MCP, pass dateOrder (day_first or month_first). See date formats.
Very large CSVs can take several minutes. Split huge files into smaller batches if you want easier tracking.

Import History

Past imports appear below the upload area on the CSV Upload page, with the date, count, and any errors. Contacts from an app import carry its importId and csvFileName, and View Contacts opens the audience filtered to that file.

Add Manually

For a few contacts at a time, go to Audience → Add contacts → Add manually and enter the email and optional properties. The form has the same validation checkbox as the CSV import. Tick it and the address is checked as it’s saved.

Sync from Integrations

Connecting an event-source integration keeps contacts flowing into Brew automatically. Every webhook the provider sends does two things at once:
  • It fires every Live automation whose trigger matches the event.
  • It upserts the contact into your audience with provider-namespaced custom fields.
Use those fields in filters and merge tags. Fields show on the contact in camelCase, such as clerkUserId. Contact search also accepts other spellings, such as clerk_user_id. A saved audience filter needs the exact key: another spelling saves without a warning but matches no one. Custom field definitions are auto-created on first write. New fields show up filterable in the audience UI with no extra setup.

API

Programmatically create, update, or delete contacts from your backend. POST /v1/contacts and POST /v1/contacts/import-csv take an optional validate: true to check each address as it’s ingested.
  • Limits. Each call takes up to 1,000 contacts or CSV rows.
  • Consent. Send consent with a new subscribed contact to record how they opted in: a source (api, form, or import) and, optionally, when. The app’s import checkbox records app.
  • Managed columns. A column Brew manages, such as Created At or Validation Status, isn’t imported. The response names it in a CSV_COLUMN_IGNORED warning.
Over MCP, update_contact and update_contacts_csv update existing contacts only. New contacts come in through the app, an integration, or the API.

View API documentation

Endpoints, authentication, and code examples

Need Help?

Our team is ready to support you at every step of your journey with Brew. Choose the option that works best for you:

Search Documentation

Type in the “Ask any question” search bar at the top left to instantly find relevant documentation pages.

Ask ChatGPT or Claude

Click here to open the Copy page menu at the top of this page, then send the page to ChatGPT, Claude, or your editor.