Looking to go the other way, designing in Brew and sending from Mailchimp? See the Mailchimp integration instead.
Concepts
1. Export Contacts, Consent, and Suppression
Go to Audience, pick the audience, then click Export audience → Export CSV. To export part of an audience:- Segment: open the Segments dropdown, pick the segment, then click Export segment → Export CSV
- Tag: open the Tags dropdown, pick the tag, then click Save as segment → Export CSV
- Group: go to More options → Groups → View Group, click the contact count, then click Export segment → Export CSV
Non-subscribed is the one people miss. It’s Mailchimp’s term for contacts you have a relationship with, mostly customers, who never opted into marketing email. They never consented, so importing them as subscribed means marketing to people who never agreed.
Bring them in marked
Subscribed: false, so a later trigger fire or integration can’t add them as subscribed.
Mailchimp exports archived contacts separately, so they aren’t in this ZIP. Export them too (see Mailchimp’s Archive or Unarchive Your Contacts) and import any unsubscribed or cleaned ones as Subscribed: false.
Cleaned contacts are addresses Mailchimp already flagged permanently undeliverable. Import them as opt-outs anyway. A contact you leave out can come back later through a form or an integration as a new, subscribed contact.
Mailchimp doesn’t export engagement history (opens, clicks). Pull that from a campaign report if you need it. Either way, Brew’s engagement-based audiences start counting from your import date.
Keep the opt-in columns, such as OPTIN_TIME and CONFIRM_TIME, in the export. Bring Your Consent Records covers carrying them over.
2. Map Your CSV
Notes:
- Save as UTF-8. Garbled characters at the mapping step usually mean it wasn’t.
- Dates: day-first dates such as
03/04/2026(3 April) import correctly when you pick day first at the mapping step, andYYYY-MM-DDneeds no choice. See date formats.
Created At, see Add Contacts. Custom properties can’t use the names of Brew’s built-in contact fields, listed in Custom Properties.
3. Import into Brew
Audience → Add contacts → CSV Upload. Map columns, review, then import. Tick the validation checkbox first if the list hasn’t been checked recently. It costs credits, which is worth it before warming up a new domain. See Validate Contacts for the cost. Upload each file from Step 1 separately. That keepsSubscribed set correctly per batch instead of forcing one merged file to carry every status.
Bring Your Consent Records
A contact’sSubscribed status says Brew may email them. A consent record says how and when they agreed. Carry both over.
- Export the evidence. Mailchimp’s export includes opt-in columns such as
OPTIN_TIMEandCONFIRM_TIME. Keep those columns as custom properties. - In the app, tick the consent checkbox at the review step. Brew records consent once for the whole file, dated the day you import.
- To keep each person’s original opt-in date, import over the API instead, with a
consentrecord per contact. See Add Contacts for the consent fields.
4. Rebuild Segmentation
Audiences are dynamic filters over contact properties, email engagement, and subscription status, not fixed lists. Describe one in plain English or build the filters by hand. Mailchimp groups don’t have a direct equivalent. Rebuild each group as a custom property plus an Audience filtered on it. Lists and Event-Based Segments covers what changes. To carry over opt-outs from a specific sender, import them into that domain’s list. Before cutover, spot-check that a recreated Audience’s membership count is in the right ballpark against the original segment. A wrong translation can undercount or overcount who gets an email, and that isn’t always visible in the UI.5. Rebuild Templates and Merge Tags
Open Emails in the sidebar, then use the import tools in the toolbar on the right side of the canvas. See Importing existing designs.
For most templates, use the HTML or screenshot as reference. Prompt Brew to rebuild it against your brand rather than treating the import as finished. It’s faster, and the result inherits your brand identity automatically.
Running a long parallel test instead of a fast cutover? You can design in Brew and still send from Mailchimp.
Click Send in the top right, choose Export template, and pick Mailchimp. That pushes the finished email through the Mailchimp integration. It also keeps a new visual direction consistent on both platforms while you migrate.
Keep each GIF under 2 MB so it loads fast on a phone.
Translate Merge Tags
*|FNAME|* becomes a Brew merge tag, {{ firstName | there }}. The property name is case-sensitive, and the fallback after the pipe shows for contacts with nothing on file. See contact properties for the full list.
If you keep an imported campaign’s HTML as it is, replace Mailchimp’s merge tags before you send:
*|FNAME|*becomes{{ firstName | there }}, and other*|FIELD|*tags become the matching Brew property, such as{{ plan }}.*|IF:...|*blocks become Liquid{% if %}blocks. See Merge Tags.- Delete footer tags such as
*|UNSUB|*and*|LIST:ADDRESS|*. Brew adds the unsubscribe link and your mailing address to every marketing email. Set the address in Brand → Details → Mailing address, then run an audit to confirm an imported design’s footer shows it.
6. Rebuild Automations
Test-fire before publishing. Leave every rebuilt automation unpublished until cutover day, which is what prevents a double-send. Build an Automation covers the trigger setup and the test step.
7. Swap the API Calls in Your Code
Mailchimp’s Marketing API lives athttps://<dc>.api.mailchimp.com/3.0, where <dc> is the data-center suffix on your API key, such as us21. It finds a member by the MD5 hash of their lowercase email, inside one audience. Brew uses one host and a bearer key, and finds contacts by email.
Contact upsert.
Before, with Mailchimp:
FNAME become camelCase properties. Tags become custom properties under customFields, such as { "vip": true }. The consent record says how the person opted in, and it never changes subscribed.
Brew has no status_if_new: subscribed: true applies only to a new contact. Mailchimp skips the status quietly for anyone who opted out, but Brew refuses the call. Unsubscribes says how to retry.
Events. A Mailchimp member event can start an automation. In Brew that becomes a fire call: fire a trigger event, and every published automation listening for it starts.
Before, with Mailchimp:
properties become the fire’s payload, read in the email as {{ trigger.plan }}. Derive the Idempotency-Key from something stable about the action, like the subscription id above, so a retry can’t send twice. See Idempotency.
Mailchimp Transactional (formerly Mandrill) is a separate API. A reset or receipt sent through it becomes a trigger plus a one-step automation on a transactional-purpose domain. See Transactional Email.
Full request shapes are in the API reference. This section shows the shape of the migration, not a copy-paste replacement for your code.
8. Cut Over
Move in this order:- Rebuild while Mailchimp keeps sending. Import contacts and rebuild segments, templates, and automations. None of it touches live sending. Keep every Brew automation unpublished.
- Check your segments. Confirm each recreated Audience’s membership count against the original. See Step 4.
- Refresh opt-outs. Right before your first Brew send, export Mailchimp’s new unsubscribes and bounces and import them into Brew as
Subscribed: false. Repeat before each type you move, until Mailchimp stops sending. Anyone who opted out during the rebuild stays opted out. - Warm up with the first type you move. Pause that type on Mailchimp first, so nobody gets it from both. Send to your most engaged contacts first and ramp over several days. Gradual send does the ramping for you. No history means no reputation, even on a verified domain. Ask Brew in chat to preview inbox rendering before that first send.
- Move one type at a time. One-off emails first, then automations. For each automation, in order: pause it on Mailchimp, publish the Brew version, then point its signup forms or app events at Brew. Watch each in analytics before you move the next.
- Move transactional email last. Before you move anything from Mailchimp Transactional (formerly Mandrill), add a separate transactional-purpose subdomain (see Transactional Email). A fire for a new address creates a subscribed contact, so only send marketing to people who opted in. Receipts and resets are the highest-stakes sends. Cut them over one at a time, and test-run each automation with a real payload before you point production code at its trigger.
- Keep Mailchimp as a fallback. Leave it active but silent for a week or two, then downgrade or cancel.
From an Agent or Code
Steps 3 to 5 also run from an AI assistant connected over MCP. Ask in plain English, one step at a time:“Import subscribed.csv, then unsubscribed.csv, as separate batches, and record the consent source as import.”
“Create an audience of subscribed contacts whose plan is pro, and tell me how many it holds.”
“Import this HTML as an editable email called Newsletter.”Check each count against the old platform before you move on. From code:
- Contacts.
POST /v1/contacts/import-csv, orbrew-cli contacts import-csv --file contacts.csv, once per file. Add Contacts covers limits and theconsentrecord. - Segments.
POST /v1/audienceswith anameandfilters, orbrew-cli audiences create. - Templates.
POST /v1/emails/importwith theformatandcontent. Import is free and uses no AI.
Quick Reference
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.