August 2026
Historical Note · August 2026 · This post describes the launch. See
Emails vs Automations
for the current model and Build an Automation
for the walkthrough.
What Shipped
Password resets, receipts, and verification codes can now go out from Brew. Until now they had to stay on a separate provider, because every Brew send carried an unsubscribe link and skipped unsubscribed contacts. That is the right behavior for marketing and the wrong behavior for a password reset. There is no new object to learn. A transactional email is an automation. What makes it transactional is the domain it sends from.The Domain Decides
Every sending domain now carries a sending purpose, marketing by default. Point an automation’s Send Email step at a domain marked transactional. That send drops the unsubscribe link and reaches unsubscribed contacts. The same automation on a marketing-purpose domain stays an ordinary marketing send that honors every unsubscribe. One switch, one place. You pick the class by picking the domain. There is no per-message flag to get wrong, and no way for a newsletter to quietly inherit transactional rules. Set the purpose when you add the domain in Settings → Domains, or withPOST /v1/domains { sendingPurpose }. You can change it later, and Brew fails
the change closed while an email still points at the domain.
Fire It From Your Product
Build the trigger, wire it to a one-step automation, publish, and fire it with the moment’s data:{{ trigger.resetUrl }}, and email routes
the run to a contact. Nested objects and arrays are fine, addressed by dotted
path.
Every trigger declares a payload contract, and every fire is checked against
it. A GET on the same URL is a ready check. It runs the auth, scope, and
permission gates without sending anything, then hands back the contract and
the automations a fire would match.
Agents get the same thing through list_triggers and check_trigger_ready
over MCP.