Move your sending to Sendly
Move transactional sending to Sendly by changing a base URL and an API key. Five provider dialects, one staged rollout plan, and what does not come across.
Two variables, not a rewrite
Sendly speaks the transactional-send dialect of five providers on dedicated endpoints. If you send through one of them, keep the vendor SDK you already run and change two things: the base URL it points at, and the API key it authenticates with.
Each dialect lives at https://api.sendly.now/api/compat/<vendor>. The endpoint parses the vendor request shape, maps it onto Sendly's native send, and runs it through the same pipeline a native call uses — so verified-domain checks, sending limits, suppression and billing apply exactly as they would otherwise. It is a translator, not a side door.
| Provider | What changes |
|---|---|
| Migrate from Resend | Set baseUrl on the Resend client, or the RESEND_BASE_URL variable. |
| Migrate from SendGrid | Set the base URL on @sendgrid/client after setApiKey, which resets it. |
| Migrate from Postmark | Override the request host on the Postmark client. |
| Migrate from Mailgun | Pass url on the mailgun.js client, with basic auth as api:<key>. |
| Migrate from Plunk | Sendly's ancestral API — the closest thing to a drop-in replacement. |
Everything else — Mailchimp, Customer.io, Klaviyo, Brevo, or a homegrown sender — moves as data rather than as a URL change. The rollout plan below still applies; only the first step is different.
The rollout plan
Changing where your production mail goes is a change to something your customers see, so it is worth doing in the order that makes each step reversible. This is the sequence we would follow.
- Verify a sending domain first, before touching any code. Guided DNS setup can publish the SPF, DKIM and DMARC records for you and then keep watching them, so this is usually minutes — but DNS is the one step whose timing you do not fully control, so start it early.
- Import your suppression list. Every address that has unsubscribed, bounced hard, or complained on your current provider must be suppressed in Sendly before your first real send. Skipping this is the single fastest way to damage a sending reputation you spent years building.
- Import contacts and custom fields, if you are moving marketing email too. Cursor pagination and bulk endpoints mean list size is not the constraint people expect.
- Point one low-stakes sender at the compat endpoint — a staging environment, or one non-critical message type in production. Send real mail to your own addresses and read the delivery record back.
- Compare. Look at the delivery, bounce and complaint numbers against what your current provider reports for the same traffic over the same window. This is the step that catches a header you did not know you depended on.
- Move the rest in slices, by service or by message type. There is no cutover event and nothing about running two providers at once is special-cased, so the slices can be as small as you like.
- Keep the old provider's credentials alive for a couple of weeks after the last slice. Rolling back should be a config change, not a rebuild.
If you send at volume, tell us before step four rather than after. Sendly applies its own per-project sending limits on top of the underlying infrastructure's, and a sudden order-of-magnitude jump from a new sender is exactly the shape those limits exist to catch.
What the compat endpoints do not cover
The transactional send path, and only that. There is no compat endpoint for a vendor's contacts, lists, campaigns, templates, suppression or webhook APIs, and there is not going to be — those surfaces differ far too much between providers to translate honestly.
For all of that, use Sendly's own API. The REST reference is the complete contract, and the official JavaScript and Python SDKs are generated from it — both at 1.0.0, both open source.
A dialect can also express things Sendly does not support. Where that happens the endpoint returns a clean error in that vendor's own error shape, so your existing error handling fires the way it already does — with one exception worth knowing about, the Mailgun dialect, which honours the fields it supports and ignores the rest. Each provider page says exactly which case it is.
Getting a key
Every compat request authenticates with a Sendly secret key, beginning sk_, belonging to a project with at least one verified sending domain. It slots into the same place the vendor's own key went, in whatever shape that vendor's SDK expects — a bearer token, a basic-auth password, or a custom header.
If you ticked specific permissions when you created the key, the compat endpoints enforce them exactly as the native API does. Sending needs emails:send. Reading a message back — Resend's emails.get(), the one compat call that is not a send — needs emails:read. A key missing the permission gets a 403 in that vendor's own error shape, naming what it is missing rather than failing vaguely.
What Sendly costs
There is no monthly platform fee and there is no plan to outgrow. A free tier, metered usage that gets cheaper as volume rises, and a conversation for anything past that.
| Plan | Price | What it is |
|---|---|---|
| Free | $0 / month · forever | Everything you need to get started. No credit card required. 5,000 emails / month · Transactional, campaigns & workflows · Full REST API, SDKs & webhooks · Powered-by-Sendly badge on sent email |
| Pay as you go | $1.00 / 1,000 emails | Volume pricing that drops as you send more. No monthly fee and no plan to outgrow. $1.00 per 1,000 emails up to 50,000 · $0.70 per 1,000 above 50,000 · $0.50 per 1,000 above 250,000 · Badge removed from your email · Set your own limit per category · Billed in USD, EUR or GBP |
| Custom | Let's talk tailored to your volume | High-volume or regulated sending that needs limits set by a human. Everything in Pay as you go · Custom sending limits · Higher daily throughput · Direct support from the team |
The free tier is a real tier, not a trial: it does not expire, and nothing about it is time-limited. Its allowance is shared across transactional sends, campaigns, workflows and inbound mail, because Sendly meters emails rather than products.
Questions people ask
- Which providers have a compat endpoint?
- Resend, SendGrid, Postmark, Mailgun and Plunk. Each parses that vendor's transactional-send request shape, so the vendor SDK you already run keeps working once you change its base URL and its key.
- Do I have to move everything at once?
- No, and you should not. The compat endpoints are ordinary API endpoints, so a single service, environment or message type can point at Sendly while the rest stays where it is. Move in slices and keep the old credentials alive until the last one has settled.
- Does the compat path skip Sendly's checks or billing?
- No. It translates the request and then runs the same pipeline a native send runs, so verified-domain checks, sending limits, suppression and billing all apply identically. A compat send costs the same as a native one.
- What is the first thing I should do?
- Verify a sending domain, and import your suppression list before any real send. DNS is the step whose timing you control least, and an unimported suppression list is the fastest way to mail somebody who already asked you to stop.
- Can I migrate contacts and campaigns through a compat endpoint?
- No. The compat endpoints cover the transactional send path only. Contacts, segments, templates, campaigns, workflows and webhooks are the native API's job, and the official JavaScript and Python SDKs cover all of it.
Something on this page out of date, or missing the case you are in? Write to support@sendly.now — we answer our own email. The full technical detail lives in the documentation.