| Feature | Included | From plan | Verdict |
|---|---|---|---|
| Email templates | Yes | Free | Stored server-side, variables capped |
| React Email | Yes | Free | First-party library, not a lock-in |
| RESTful API | Yes | Free | The product, not an upsell |
| SMTP relay | Yes | Free | Available without touching the API |
| Official SDKs | Yes | Free | Every tier, no gating |
| Batch sending | Yes | Free | Included from the first day |
| Scheduled sends | Yes | Free | Future-dated dispatch, no tier |
| Idempotency keys | Yes | Free | Documented, prevents duplicate sends |
| Open tracking | Yes | Free | Ungated across all plans |
| Link tracking | Yes | Free | Ungated across all plans |
| Webhooks | Yes | Free | One endpoint only on Free |
| Signed webhook endpoints | Yes | Free | Svix headers, dedupe by id |
| Inbound email | Yes | Pro | The clearest wall on Free |
| Automations | Yes | Free | 10,000 runs, real branching steps |
| Audiences and contacts | Yes | Free | Custom properties on contacts |
| Broadcasts | Yes | Free | Marketing sends, unsubscribes handled |
| Segments | Yes | Free | Contact groups for targeting |
| Topics preference centre | Yes | Free | Scoped consent, rare at this tier |
| Automatic suppression list | Yes | Free | Managed for you, no config |
| Bounce details | Yes | Free | Reason exposed, not just status |
| Deliverability insights | Yes | Free | Suggestions attached to the data |
| Multi-region sending | Yes | Free | Ungated, unusual on a free tier |
| Custom domains | Yes | Free | 3, then 10, then 1,000 |
| Additional domains | Partial | Pro | Paid add-on beyond the quota |
| Dedicated IPs | Partial | Scale | Add-on, and only from Scale |
| Dedicated IP warming | Yes | Scale | Follows the IP, same wall |
| Data retention | Yes | Free | Flat 30 days until Enterprise |
| DKIM, SPF, DMARC auth | Yes | Free | Standard setup, all tiers |
| API key permissions | Yes | Free | Scoped keys from the start |
| Multi-factor authentication | Yes | Free | Account security, no tier |
| Single sign-on | Partial | Scale | Add-on on Scale, included Enterprise |
| AI credits | Yes | Free | 5 a month, then 100, then 500 |
| Landing pages | No | None | Not a product surface here |
| Hosted signup forms | No | None | Bring your own capture |
| A/B testing | No | None | Absent from broadcasts entirely |
| SMS | No | None | Email only, by design |
| CRM | No | None | Contacts are a list, not a CRM |
Templates exist, they are free, and they are server-side. You create one from the Templates dashboard, by cloning a Broadcast, by importing an HTML or React Email file, or through the template creation endpoint. Sending then means passing a template id plus a set of variable values, and Resend renders the final message before dispatch. Nothing about this is gated: the docs describe no plan requirement, and the pricing comparison table does not list templates as a tiered row.
The limits are in the templating language, not in the billing. Variables use triple-brace syntax, {{{VARIABLE_NAME}}}, and a template accepts at most 20 variables. Only two types are supported, string and number, each with an optional fallback used when no value is supplied at send time. Six names are reserved and cannot be reused: FIRST_NAME, LAST_NAME, EMAIL, RESEND_UNSUBSCRIBE_URL, contact and this.
That is a deliberately thin templating layer. There are no loops, no conditionals and no helpers of any kind, so a receipt with a variable number of line items cannot be built from a stored template alone. Mailgun’s Handlebars subset gives you each and if; SendGrid’s dynamic templates give you both plus formatting helpers. Resend’s answer to that gap is not a richer template language, it is React Email, which is why the two features have to be read together rather than compared.
React Email is the reason a repeating block is not a problem. It is a component framework for building emails in React and TypeScript, published by Resend under the MIT licence, and it appears as an ungated row on every pricing tier. Components cover the structural pieces you would otherwise hand-write as nested tables, and they are tested against Gmail, Apple Mail, Outlook, Yahoo Mail, HEY and Superhuman.
The mechanics matter for where the logic lives. React Email compiles to an HTML string through a render utility, and that string is what reaches the sending API. Your loops, conditionals and formatting run in your application at render time, not on Resend’s servers. That is the opposite trade from a stored dynamic template: full expressive power, no cap on variables, but a code deploy is needed to change the wording, and non-developers cannot edit anything.
It is also not a lock-in. The framework documents adapters for Nodemailer, Mailgun, SendGrid, Postmark, AWS SES, Azure Communication Email, MailerSend, Scaleway and Plunk alongside Resend itself, and adoption is incremental inside an existing JavaScript or TypeScript project. The practical read: React Email is a genuine reason to pick Resend, but it is not a reason you cannot take with you.
Inbound is the one feature Free genuinely lacks. The pricing comparison marks inbound emails with a dash on Free and a check on Pro, Scale and Enterprise. Every other row in the sending section is available on Free. If you are evaluating Resend for a reply-handling flow, the free tier will not show you the feature at all.
Webhook endpoints are the quiet quota. Free allows 1 endpoint, Pro 5, Scale 10. All event types are available at every tier, so the constraint is fan-out, not visibility: one endpoint means you cannot feed a warehouse, an alerting path and your application separately without a router of your own. Retries run at 5 seconds, 5 minutes, 30 minutes, 2 hours, 5 hours and 10 hours, delivery is at-least-once, and ordering is not guaranteed, so deduplicate on the svix-id header and sequence on created_at.
Retention does not improve with the plan. Free, Pro and Scale all hold data for 30 days; only Enterprise is flexible. Paying more buys volume, domains and endpoints, not a longer forensic window.
The API rate limit is per team, not per key. The documented default is 10 requests per second across all API keys on a team, raised for trusted senders on request. Splitting traffic across keys does not raise the ceiling.
See the Resend pricing tab for what each tier costs and how overage is billed, the Resend review for the overall verdict, and Resend alternatives for how it compares against other developer-first senders.
This review follows our email infrastructure testing methodology. We disclose affiliate relationships in our editorial independence policy.