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.
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:
suppressedandsuppressedReasonunsubscribedDomainsvalidationStatusandlastValidatedAtvalidationDetails: 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 asinfo@consentimportIdandcsvFileName, 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.
Property Types
String
String
Text values. Examples:
"Enterprise", "New York", "Referred by Jane".Number
Number
Integers or decimals. Examples:
42, 99.95, 2500.Boolean
Boolean
True/false. Accepted formats:
true/false, yes/no, 1/0. Over the API, this type is named bool.Date
Date
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) or1704067200000(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, or20250105 - Month and year, read as the 1st:
2025-01,January 2025 - Dots, read day first:
05.01.2025is 5 January - Slashes or dashes:
01/05/2025,01-05-2025
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_firstormonth_first). - With neither, Brew reads month first and the API response carries a
DATE_ORDER_ASSUMEDwarning.
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:Email engagement
Email engagement
- 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
Audience events
Audience events
- 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
- 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 aRESUBSCRIBE_SKIPPEDwarning - Unsubscribing always works: set
Subscribedtofalseon 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"
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:- Click a contact in the Audience table
- Edit any property
- Click Save
Deleting Contacts
To permanently remove contacts:- Filter or select the contacts to delete
- Click the More menu
(...)at the top of the table - Select Delete contacts
- Confirm
From an Agent or Code
- Add a custom property.
POST /v1/fields, orbrew-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=coveragereports each field’s fill rate and its most common values. - Delete a custom property.
DELETE /v1/fields/{fieldName}, orbrew-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:- Self-Service Tools
- Talk to Our Team
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.