Resend aliases
How Resend's broadcasts, automations, topics, segments, audiences and contact properties map to Stamp0 campaigns, sequences and lists for the Resend SDKs.
Stamp0's marketing resources use the names marketers know (campaigns, sequences, lists, segments). Resend's names keep working as aliases on Resend's paths with Resend's request and response shapes, so the Resend SDK's marketing calls work after you point it at Stamp0.
| Resend path | Stamp0 resource | Notes |
|---|---|---|
/broadcasts | Campaigns | Resend shapes and statuses, see below |
/automations | Sequences | Stamp0's sequence shapes, see below |
/topics | Public lists | default_subscription as in Resend: opt_in reaches every contact unless they unsubscribe (a list with the opt_out default), opt_out only contacts who subscribed (a list with the opt_in default) |
/segments without a filter | Private lists | Shares the path with Stamp0's filter segments, see below |
/audiences, /audiences/:id/contacts | Private lists and their members | Resend's legacy audiences |
/contact-properties | Properties | Stamp0 adds the boolean and date types |
/contacts | Contacts | Same paths and shapes; Stamp0 adds external_id, source and updated_at |
/contacts/:id/segments, /contacts/:id/topics | List memberships | opt_out on a topic is an unsubscribed membership |
/templates | Templates | Same paths and shapes; Stamp0 adds preheader |
POST /events, POST /events/send | Custom events | Resend's event and payload fields work |
Broadcasts
POST /broadcasts takes Resend's body: segment_id (or the legacy audience_id) is a private list (lst_…), and a Stamp0 filter segment (seg_…) works too; topic_id is a public list and becomes the campaign's preference_list_id; preview_text is the preheader. send: true sends at once, or at scheduled_at.
await resend.broadcasts.create({
segmentId: 'lst_…',
topicId: 'lst_…',
from: 'Acme <news@acme.co>',
subject: 'What shipped in October',
html: '<p>Hi {{{FIRST_NAME|there}}},</p>…',
send: true,
});Broadcasts are campaigns: they appear in GET /campaigns, and campaign actions (pause, resume, cancel, recipients, stats) work on their ids. Statuses map to Resend's:
| Campaign | Broadcast |
|---|---|
draft | draft |
scheduled | scheduled |
sending, paused | queued (GET /campaigns/:id gives a paused campaign's last_error) |
sent | sent |
canceled | canceled |
POST /broadcasts/:id/cancel, POST /broadcasts/:id/duplicate, GET /broadcasts/:id/recipients?type= (sent, delivered, opened, clicked, bounced, complained, unsubscribed or suppressed) and GET /broadcasts/:id/clicked-links answer in Resend's shapes, so resend.broadcasts.cancel(), duplicate(), recipients() and clickedLinks() work. POST /broadcasts honours Idempotency-Key like POST /emails (a retry returns the first broadcast), and with send: true it creates and sends in one step: a refused send creates nothing.
Automations
/automations serves sequences on Resend's path with Stamp0's sequence shapes (trigger and step graph). Resend's own automation bodies are not translated yet, and Resend's /runs, /stop and /duplicate automation endpoints are not served. Use the sequence format on either path.
Segments
/segments serves two kinds of segment on one path:
- Manual (Resend's): created without a
filter, managed by adding contacts. These are private lists withlst_…ids, andkind: "manual". - Filter (Stamp0's): created with a
filter, membership computed live. These haveseg_…ids andkind: "filter".
The id prefix picks the kind for GET, PATCH and DELETE /segments/:id. GET /segments/:id/contacts (the SDK's contacts.list({ segmentId }) or { audienceId }) lists either kind's contacts in Resend's contact list shape; Stamp0's live count and sample is GET /segments/:id/preview. GET /segments returns both kinds; ?kind=filter or ?kind=manual narrows it. POST /contacts/:id/segments/:segment_id works for manual segments only: a filter segment's members follow from the filter.
Merge tags
Resend's triple-brace tags render as in Resend: {{{FIRST_NAME}}}, {{{LAST_NAME}}}, {{{EMAIL}}}, {{{RESEND_UNSUBSCRIBE_URL}}} and {{{VARIABLE|fallback}}}. Stamp0's own syntax adds filters such as {{ contact.first_name | default: "there" }}. See merge tags.
Webhooks
Stamp0 sends contact.unsubscribed (its own event) for unsubscribes. Resend's contact.created, contact.updated, contact.deleted, contact.topics.updated and topic.* events are accepted on a webhook, so a copied configuration still saves, but they are not delivered yet.
Not available
- Resend's event definitions (
POST /eventswith a schema,GET,PATCHandDELETE /events/:id):GET /eventsstays the email-event log, and custom events are read at/events/custom. - React Email compiled on the server: render to
htmlfirst (the Resend Node SDK does this forreact:).
Unsubscribe and compliance
RFC 8058 one-click List-Unsubscribe, a visible unsubscribe link, a preference center and your postal address in every marketing email, with opt-outs honored at once.
MCP server
Connect Claude, ChatGPT, Cursor or your own agent to the remote Stamp0 MCP server at mcp.stamp0.com to send email, set up domains, read inboxes, diagnose SES deliverability and run marketing (contacts, lists, campaigns, sequences).