Residency as a configuration versus residency as an architecture
This is the whole comparison, so it’s worth being precise rather than rhetorical. Twilio’s Data Residency for Email stores recipient PII, message content and event data in EU data centres, and the core functionality is included in its standard plans. To use it you create an EU-assigned subuser, send against api.eu.sendgrid.com instead of the default host, and have a dedicated EU IP — included by default on Pro, Premier and Custom accounts, procured separately otherwise. Get the routing wrong on one service, one cron job, one forgotten staging environment, and that traffic takes the global path instead, with nothing in your code looking obviously broken.
eusend has one endpoint and one set of data centres. There is no non-EU path to accidentally send down, no subuser to misconfigure, and no plan on which residency turns off — the free tier and the largest paid tier run on identical infrastructure. The guarantee is structural rather than contractual, which mostly means there is less of it to audit.
| Sending infrastructure | Mail servers we operate ourselves, Falkenstein (Germany) |
| API hosting | Nuremberg (Germany) |
| Database & delivery events | Frankfurt (Germany) |
| Available on | Every plan including the free tier — no subuser, second endpoint or dedicated IP required, because there is no other mode |
| Company | A Norwegian entity, inside the EEA and under the GDPR |
| The honest caveat | The marketing site and dashboard front-end are served from a US CDN, and DNS and bot checks run through Cloudflare. Neither handles message content or recipients. The full list is on our sub-processors page. |
The part a region setting cannot reach
Twilio is a US company. Under the US CLOUD Act, a US-incorporated provider can be compelled to produce data it controls regardless of which country the disk is in — that is the specific reason “our data is in Frankfurt” and “our processor is outside the reach of US process” are different sentences.
How much that matters depends entirely on what you send. For marketing blasts to an opted-in list, probably not much. For password resets, medical appointment reminders, or anything where the recipient list is itself the sensitive fact, European teams increasingly decide the cleanest answer is a processor that no US court has jurisdiction over. eusend is a Norwegian company — inside the EEA, under the GDPR, with no US parent in the chain.
Transactional only, which changes the neighbourhood
SendGrid is two products sharing a reputation: a transactional API and a marketing campaigns platform. Like SendGrid, most eusend mail leaves through a shared pool of warmed IPs — that is what gives a new account decent deliverability on day one — so the honest difference isn’t shared versus dedicated. It’s who else is in the pool, and how fast a bad sender is removed from it.
The deliverability page sets out the rest in engineering terms. We run our own MTA rather than reselling someone else’s sending service, so when delivery goes wrong the SMTP conversation with the receiving server is something we can read, not something we open a support ticket about.
What the migration actually looks like
Of the major providers, SendGrid is the closest to a find-and-replace: the send call already uses from, to, subject and html as top-level fields. The client becomes an instance instead of a global singleton, and errors come back as { data, error } rather than thrown.
The one structural change worth seeing up front is multi-recipient sending — personalizations becomes a batch of fully-formed messages, up to 100 per request:
// SendGrid: one request, personalizations array
await sgMail.send({
from: 'Acme <hello@acme.com>',
personalizations: [
{ to: 'a@example.com', dynamicTemplateData: { name: 'Ada' } },
{ to: 'b@example.com', dynamicTemplateData: { name: 'Blaise' } },
],
templateId: 'd-xxxxxxxx',
})
// eusend: one request, one fully-formed message per recipient
await eusend.batch.send([
{ from: 'Acme <hello@acme.com>', to: 'a@example.com', subject: 'Hi Ada', html: adaHtml },
{ from: 'Acme <hello@acme.com>', to: 'b@example.com', subject: 'Hi Blaise', html: blaiseHtml },
])
smtp.eusend.dev, change the username from apikey to eusend, and use port 465 with implicit TLS.processed, delivered, bounce, spamreport, open and click all have direct equivalents. Signing moves from SendGrid’s ECDSA scheme to HMAC-SHA256.The field-by-field version, including the trackingSettings and attachment mappings, is in the SendGrid migration guide.
What will take longer than the code
Common questions
What is the best European alternative to SendGrid?
Does SendGrid have EU data residency?
Why does an EU region not settle the GDPR question on its own?
Is migrating from SendGrid to eusend difficult?
How does eusend pricing compare to SendGrid?

Every account gets test keys that run the full pipeline — accepted, logged, complete webhook lifecycle — without delivering anything. Build the integration, watch it behave, then verify a domain and swap one key.
Create a free account