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 pathStamp0 resourceNotes
/broadcastsCampaignsResend shapes and statuses, see below
/automationsSequencesStamp0's sequence shapes, see below
/topicsPublic listsdefault_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 filterPrivate listsShares the path with Stamp0's filter segments, see below
/audiences, /audiences/:id/contactsPrivate lists and their membersResend's legacy audiences
/contact-propertiesPropertiesStamp0 adds the boolean and date types
/contactsContactsSame paths and shapes; Stamp0 adds external_id, source and updated_at
/contacts/:id/segments, /contacts/:id/topicsList membershipsopt_out on a topic is an unsubscribed membership
/templatesTemplatesSame paths and shapes; Stamp0 adds preheader
POST /events, POST /events/sendCustom eventsResend'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:

CampaignBroadcast
draftdraft
scheduledscheduled
sending, pausedqueued (GET /campaigns/:id gives a paused campaign's last_error)
sentsent
canceledcanceled

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 with lst_… ids, and kind: "manual".
  • Filter (Stamp0's): created with a filter, membership computed live. These have seg_… ids and kind: "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 /events with a schema, GET, PATCH and DELETE /events/:id): GET /events stays the email-event log, and custom events are read at /events/custom.
  • React Email compiled on the server: render to html first (the Resend Node SDK does this for react:).

On this page