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
| Resource | What it is | Guide |
|---|---|---|
| Contact | One person, identified by email address, with custom properties | Contacts, lists and segments |
| List | A group contacts join: private (you manage it) or public (it appears in the preference center) | Contacts, lists and segments |
| Segment | A saved filter over contacts, properties, lists, companies and events, always up to date | Contacts, lists and segments |
| Company | A B2B grouping of contacts, with its own properties | Contacts, lists and segments |
| Template | Versioned HTML with merge tags; usable from campaigns, sequences and POST /emails | Templates |
| Campaign | A one-off send to lists and/or a segment (Resend: broadcast) | Campaigns |
| Sequence | An automated series of steps started by an event, a list, a segment or a new contact (Resend: automation) | Sequences |
| Event | A named thing a contact did, such as trial.started, sent from your app | Events |
| Form | A hosted or embedded signup form that adds contacts to lists | Forms |
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/sdkhaslists,properties,companies,campaigns,sequencesandforms, and adds Stamp0's calls to Resend'scontacts,segments,templatesandevents(contacts.upsert,contacts.imports.upload,segments.preview,templates.render,events.track, …).- The CLI covers the everyday flows:
stamp0 contacts addandimport,lists,campaigns create,test,sendandstatus,sequences activate,pauseandstats, andevents 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: trueafter 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
- Set the physical address in Settings → Marketing, or with
PATCH /settings/marketingandphysical_address, your postal address. Campaigns and sequences refuse to send without it, because it is printed in every footer. See Unsubscribe and compliance. - Set a default sender (optional):
default_fromon a domain of the project. Double opt-in confirmations and forms need it. - 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.
| Plan | Contacts | Marketing emails a month |
|---|---|---|
| Free | 1,000 | 10,000 |
| Pro | 10,000 | Unlimited |
| Scale | 100,000 | Unlimited |
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-Unsubscribeheaders, 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.
Webhooks
Receive delivery, bounce, complaint, engagement, inbound, domain and unsubscribe events as signed Standard Webhooks, and verify the signature in Node.js or any language.
Contacts, lists and segments
Marketing contacts with typed properties, private and public lists, live filter segments, companies, and CSV import and export, compatible with Resend contacts.