Marketing and transactional are separate on purpose. Marketing mail goes out through Amazon
SES from HTML templates you author. Transactional mail (login links, password resets) goes out
through Resend from React Email components in the codebase.
The two pipelines
Templates you author, sent in bulk
- A template is an HTML file — the design lives in the template, not in the app
- Merge tags
{{name}}are resolved per recipient at send time - Sent through Amazon SES, batched against the sending quota
- Every send is logged per recipient, with click and open tracking
- An unsubscribe link is mandatory and verified before sending
Why HTML templates for marketing
An email client is not a browser. Outlook renders through the Word engine, Gmail strips<style>
blocks, and dark mode rewrites your colours. Email HTML means nested tables, inline styles and
vendor hacks — and that is exactly what tools like Mailchimp export.
Storing the template as HTML means you can paste a template from anywhere and it works, and that two
templates can look nothing alike. The application imposes no layout of its own.
The unsubscribe link is verified, not injected. If the rendered HTML does not contain the
unsubscribe URL, the send is refused with an explicit error. Nothing is silently appended to your
markup — the link has to be in your template.
Authoring a template
The template editor shows the HTML on the left and the live rendering on the right. Saving converts recognised Mailchimp merge tags to the product syntax and reports the ones that are not supported. See Merge Tags Cheat Sheet for the full list of tags, what they resolve to, and what happens to unsupported ones.Driving it from outside
Everything above is reachable over HTTP with an API key: contacts and tags with the Audience API, templates, rendering and campaigns with the Content & Send API.Environment
# Marketing — Amazon SES
AWS_REGION="eu-west-3"
AWS_ACCESS_KEY_ID="..."
AWS_SECRET_ACCESS_KEY="..."
# Transactional — Resend
RESEND_API_KEY="..."
EMAIL_FROM="noreply@yourdomain.com"
NEXT_PUBLIC_APP_URL="https://yourdomain.com"