Marketing email

Contacts, lists, segments, templates, campaigns, sequences and signup forms on Amazon SES in your own AWS account, with one-click unsubscribe built in.

Stamp0's marketing features send newsletters, announcements and automated drips through the same Amazon SES account as your transactional mail. Marketing email is priced on contacts, not on sends, and every message carries the unsubscribe headers and footer that Gmail, Yahoo and the CAN-SPAM Act require.

Dashboard, API, SDK, CLI and MCP

Marketing is available in the dashboard, through the REST API, @stamp0/sdk, the CLI and the MCP server, and through the Resend SDKs on Resend's paths. In the dashboard, the Marketing group holds campaigns, sequences, contacts (with lists, segments, properties and companies) and forms; templates sit under Emails, events under Developers, and the default sender and postal address under Settings → Marketing.

How it fits together

ResourceWhat it isGuide
ContactOne person, identified by email address, with custom propertiesContacts, lists and segments
ListA group contacts join: private (you manage it) or public (it appears in the preference center)Contacts, lists and segments
SegmentA saved filter over contacts, properties, lists, companies and events, always up to dateContacts, lists and segments
CompanyA B2B grouping of contacts, with its own propertiesContacts, lists and segments
TemplateVersioned HTML with merge tags; usable from campaigns, sequences and POST /emailsTemplates
CampaignA one-off send to lists and/or a segment (Resend: broadcast)Campaigns
SequenceAn automated series of steps started by an event, a list, a segment or a new contact (Resend: automation)Sequences
EventA named thing a contact did, such as trial.started, sent from your appEvents
FormA hosted or embedded signup form that adds contacts to listsForms

Everything belongs to a project, like domains and API keys. Marketing email goes out from a verified domain of the project, through that domain's SES configuration set, so open and click tracking and delivery events work as they do for transactional email.

From code and agents

  • @stamp0/sdk has lists, properties, companies, campaigns, sequences and forms, and adds Stamp0's calls to Resend's contacts, segments, templates and events (contacts.upsert, contacts.imports.upload, segments.preview, templates.render, events.track, …).
  • The CLI covers the everyday flows: stamp0 contacts add and import, lists, campaigns create, test, send and status, sequences activate, pause and stats, and events track.
  • The MCP server gives agents the same resources. Sending a campaign, resuming one, activating a sequence, enrolling contacts and deleting contacts or memberships require an explicit confirm: true after you approve.
import { Stamp0 } from '@stamp0/sdk';

const stamp0 = new Stamp0(); // reads STAMP0_API_KEY

await stamp0.contacts.upsert([
  { email: 'bea@example.com', first_name: 'Bea', lists: [{ id: 'lst_…' }], properties: { plan: 'pro' } },
]);
await stamp0.events.track({ name: 'trial.started', email: 'bea@example.com' });

const { data: campaign } = await stamp0.campaigns.create({
  name: 'October news',
  from: 'Acme <news@acme.co>',
  subject: 'What shipped in October',
  template_id: 'tpl_…',
  list_ids: ['lst_…'],
});
if (campaign) {
  await stamp0.campaigns.test(campaign.id, { to: ['you@example.com'] });
}

Before the first send

  1. Set the physical address in Settings → Marketing, or with PATCH /settings/marketing and physical_address, your postal address. Campaigns and sequences refuse to send without it, because it is printed in every footer. See Unsubscribe and compliance.
  2. Set a default sender (optional): default_from on a domain of the project. Double opt-in confirmations and forms need it.
  3. Add contacts: create them in the dashboard or over the API, import a CSV, or collect them with a form.
curl -X PATCH https://api.stamp0.com/settings/marketing \
  -H "Authorization: Bearer $STAMP0_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "physical_address": "Acme Inc., 548 Market St, San Francisco, CA 94104, USA",
    "company_name": "Acme",
    "default_from": "Acme <news@acme.co>"
  }'

The response's ready_to_send is true once the address is set.

Plan limits

Contacts are counted across every project of the organization, subscribed or not. Marketing emails (campaign and sequence sends) are counted separately from transactional email.

PlanContactsMarketing emails a month
Free1,00010,000
Pro10,000Unlimited
Scale100,000Unlimited

Creating a contact beyond the limit answers 403 plan_limit_exceeded (imports report the row as plan_limit). A campaign that reaches the Free plan's monthly marketing limit pauses with last_error: "marketing_send_quota_exceeded"; resume it next month or after upgrading. SES charges you for every marketing email, as for any other.

What is always enforced

  • Contacts who unsubscribed globally, or from the list a send targets, are never sent to.
  • Addresses on your SES account's suppression list are skipped.
  • Every campaign and sequence email carries RFC 8058 one-click List-Unsubscribe headers, a visible unsubscribe link and your physical address.
  • An unsubscribe is a preference, not a suppression: it never touches the SES suppression list, and transactional email to the same address keeps working.

Details: Unsubscribe and compliance. Coming from Resend? See Resend aliases.

On this page