Skip to main content
Open the Audience tab in the sidebar to see every contact, search and filter them, and edit their details. Agents work the same records over MCP: search_contacts searches, update_contact updates an existing contact by email, and delete_contacts deletes. Code uses the contacts API. A search_contacts query that is one whole email address returns only that contact, or nothing. Any other text matches contacts whose email or name contains any of its words, so it can return other contacts. Update or delete a contact you found by its address, never the first row of a text search.
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.

Email Eligibility

Whether a contact can receive an email depends on the email’s purpose and sending domain. The contact details show subscription, validation, technical suppression, and sending-domain opt-outs separately.
  • A current recipient count is an estimate. Brew checks restrictions again before sending.
  • Re-subscribing or validating an address doesn’t clear technical suppression.
  • Deleting and reimporting a contact keeps its recorded restrictions.
  • Marketing permission must come from an explicit opt-in. A purchase or identity event alone doesn’t grant it.

Contact Properties

Every contact has properties: fields that store information you can use for personalization and segmentation.

Default Properties

Contact reads also return fields Brew manages:
  • suppressed and suppressedReason
  • unsubscribedDomains
  • validationStatus and lastValidatedAt
  • validationDetails: the reason behind the status, a suggested fix for a typo (didYouMean), the risk level, and whether the address is disposable or a role address such as info@
  • consent
  • importId and csvFileName, for app imports
subscribed, createdAt, and updatedAt are filter and sort fields, not merge tags. Brew hides them from the variable picker because they’re bookkeeping rather than personalization. Use a custom property if you want a date you can write into email copy. See Merge Tags for the full syntax.

Custom Properties

Add custom properties for any other data you personalize or segment on, such as demographics, plan or behavior. To add a custom property, map a new column in a CSV import. From an agent, create_contact_field adds one. The API and CLI calls are in From an Agent or Code. Before you personalize on a property, check how many contacts actually have it. list_contact_fields with include: ["coverage"] over MCP reports each field’s fill rate and its most common values. Deleting a custom property works only from an agent or code: delete_contact_field over MCP. The app has no delete.
These names belong to built-in contact fields and can’t be used for custom properties: email, firstName, lastName, subscribed, createdAt, updatedAt, validationStatus, lastValidatedAt, importId, and csvFileName. Creating one from code returns CORE_FIELD_IMMUTABLE. Use names such as companyEmail or workEmail if you need similar fields.

Property Types

Text values. Examples: "Enterprise", "New York", "Referred by Jane".
Integers or decimals. Examples: 42, 99.95, 2500.
True/false. Accepted formats: true/false, yes/no, 1/0. Over the API, this type is named bool.
Brew stores dates as UTC timestamps and reads these formats:
  • ISO, with or without a time and offset: 2025-01-05, 2025-01-05 14:30, 2025-01-05T14:30:00Z
  • Unix timestamps: 1704067200 (seconds) or 1704067200000 (milliseconds). Over the API, a JSON number is always milliseconds, so send seconds as a string.
  • Month names: 5 Jan 2025, Jan 5, 2025, January 5 2025, 05-Jan-25
  • Year first: 2025/01/05, 2025.01.05, or 20250105
  • Month and year, read as the 1st: 2025-01, January 2025
  • Dots, read day first: 05.01.2025 is 5 January
  • Slashes or dashes: 01/05/2025, 01-05-2025
A slash or dash date with a day over 12 reads only one way, so 13/01/2025 and 01/13/2025 are both 13 January. A date like 03/04/2025 is 3 April in the UK and 4 March in the US, so Brew reads every date in a column the same way:
  • A day over 12 anywhere in the column settles the order for all of it.
  • Otherwise the CSV import shows both readings of the column’s dates and lets you pick. The API and MCP CSV import take dateOrder (day_first or month_first).
  • With neither, Brew reads month first and the API response carries a DATE_ORDER_ASSUMED warning.
For day-first data, converting dates to YYYY-MM-DD before importing removes the question. Brew stores everything in UTC and displays times in your browser’s local time zone, so small offsets between input and display are normal.

Activity Timeline

Click any contact’s email in the Audience table to see their full activity timeline, with every event in chronological order. The timeline shows:
  • Sent. When an email was delivered to the contact
  • Opened. When they opened an email
  • Clicked. When they clicked a link
  • Hard bounced. Permanent failure
  • Marked as spam. They reported an email as spam
  • Unsubscribed. They opted out
  • Added to audience. When the contact was first added
  • Property updated. Any time a property changed

Unsubscribes

Every marketing email carries an unsubscribe link automatically. Unsubscribes owns how the path works end to end. An “unsubscribed” event appears in the contact’s activity timeline. The link puts the contact on the unsubscribe list of the domain that sent the email, so that domain’s marketing skips them. Unsubscribe from all opts them out of every marketing domain and marks the contact unsubscribed. What happens after an unsubscribe from all:
  • They stop receiving marketing emails, whether one-off sends or automations
  • Transactional sends such as password resets still reach them: an automation sending from a transactional-purpose domain delivers to unsubscribed contacts
  • The unsubscribe shows up in your analytics
Important rules:
  • Only a person on your team can re-subscribe a contact, from the contact’s page, after confirming the contact asked to receive your marketing email again. Brew records that confirmation as the contact’s consent. This protects against accidental re-subscription and keeps you compliant with CAN-SPAM
  • The API, the MCP tools, CSV imports and Brew’s agent never re-subscribe anyone. An import row that asks to still updates the contact’s other fields, and the contact stays unsubscribed. Through the API or MCP, a single update that tries is refused with RESUBSCRIBE_NOT_ALLOWED, and an import or batch row that tries comes back with a RESUBSCRIBE_SKIPPED warning
  • Unsubscribing always works: set Subscribed to false on a contact, in an import, or through the API
  • A hard bounce suppresses the contact (suppressed: true, suppressedReason: "hard_bounce") and also unsubscribes it, so later sends skip it
  • If the sending provider refuses an address it has already blocked, Brew suppresses the contact with suppressedReason: "suppressed"
Deleting a contact removes its profile but keeps its unsubscribe and deliverability restrictions. Re-adding the address doesn’t clear a brand or domain opt-out, and organization-wide technical suppression still applies in later brands. Keep the profile if you need its activity and preference context.

Customize the Unsubscribe Page

Open Domains, pick a domain, and choose Customize next to Unsubscribe page to preview and customize the page contacts see. You can adjust the copy, branding, and confirmation message. The unsubscribe link itself stays automatic in every email. See Customize the Unsubscribe Page.

Updating Contact Properties

For individual contacts:
  1. Click a contact in the Audience table
  2. Edit any property
  3. Click Save
For bulk updates, re-upload a CSV. Empty cells won’t overwrite existing values, so you can update only what’s changed.

Deleting Contacts

To permanently remove contacts:
  1. Filter or select the contacts to delete
  2. Click the More menu (...) at the top of the table
  3. Select Delete contacts
  4. Confirm
Deletion is permanent. It removes the contact’s profile and activity and takes it out of every automation. Brew keeps its unsubscribe and deliverability restrictions. To stop sending, unsubscribe the contact instead.

From an Agent or Code

  • Add a custom property. POST /v1/fields, or brew-cli fields create. Writing a contact with a field Brew doesn’t know yet also creates it; create it first when you want to set its type.
  • Check coverage. GET /v1/fields?include=coverage reports each field’s fill rate and its most common values.
  • Delete a custom property. DELETE /v1/fields/{fieldName}, or brew-cli fields delete.

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.