A region is a location. It isn’t a jurisdiction.
Running SES in eu-central-1 or eu-west-1 is a sensible thing to do, and it genuinely settles the data-location half of the GDPR question: the bytes are in Frankfurt or Dublin.
What it doesn’t change is that the processor is Amazon Web Services, a US-incorporated company. Under the US CLOUD Act, a US provider can be compelled to produce data under its control wherever it is physically stored. That is why a transfer impact assessment for SES-in-Europe is still a document you write, revisit, and defend — the region narrows the exposure rather than removing the question. Choosing a processor established in the EEA is what removes it.
| Sending infrastructure | Mail servers we operate ourselves, Falkenstein (Germany) |
| API hosting | Nuremberg (Germany) |
| Database & delivery events | Frankfurt (Germany) |
| Company | A Norwegian entity, inside the EEA and under the GDPR |
| Parent company | None — no US parent in the ownership chain |
| 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 plumbing you stop operating
This is usually the bigger practical win, and it is the thing SES pricing doesn’t show you. A production SES setup is never just SES — it is SES plus a small distributed system you wrote and now maintain.
| SNS topics + subscriptions | Signed webhooks — email.delivered, email.bounced, email.complained, plus opens and clicks. HMAC-SHA256 signed, no subscription confirmation handshake to handle. |
| Your own suppression table | Hard bounces and complaints are suppressed automatically, account-wide, from the first send. |
| Configuration sets + event destinations | trackOpens and trackClicks flags on the send, switchable org-wide, with the analytics dashboard already built. |
| Firehose/Lambda into your own event store | A searchable delivery log with the full event history per message, retained for 30 days and 90 on the larger plans. |
| CloudWatch alarms on bounce rate | Platform-level thresholds that throttle or suspend before a reputation problem becomes an account problem. |
| A production access request | A daily ceiling that ramps automatically as you send cleanly — no sandbox ticket. |
The code change is a flattening
SESv2’s nested Destination / Content / Simple structure collapses into plain fields, and IAM credentials become an API key:
- import { SESv2Client, SendEmailCommand } from '@aws-sdk/client-sesv2'
- const ses = new SESv2Client({ region: 'eu-central-1' })
+ import { Eusend } from '@eusend_dev/sdk'
+ const eusend = new Eusend(process.env.EUSEND_API_KEY)
- await ses.send(new SendEmailCommand({
- FromEmailAddress: 'Acme <hello@acme.com>',
- Destination: { ToAddresses: ['user@example.com'] },
- Content: { Simple: {
- Subject: { Data: 'Your receipt' },
- Body: { Html: { Data: html } },
- } },
- ConfigurationSetName: 'tracking-and-events',
- }))
+ await eusend.emails.send({
+ from: 'Acme <hello@acme.com>',
+ to: 'user@example.com',
+ subject: 'Your receipt',
+ html,
+ })
smtp.eusend.dev on port 465 with implicit TLS and delete the IAM SMTP credential derivation.SendRawEmailCommand only to attach a PDF invoice, that becomes an attachments array with base64 content — up to 20 files, 10 MB combined.{ data, error } with stable machine-readable codes instead of throwing AWS SDK exception types you match on by name.The full field mapping, including templates and the SNS-to-webhook translation, is in the SES migration guide.
Where SES is genuinely the better answer
Worth saying plainly, because the alternative is you finding out after migrating. SES wins on raw price and it is not close. If you send very high volume of low-sensitivity mail, you already have the bounce and suppression plumbing working, and nobody is asking you questions about the processor’s jurisdiction, then SES is doing its job and this page is not for you.
The trade is worth it when the plumbing is costing engineering time, when you want delivery problems to be someone’s actual job rather than your on-call rotation, or when “who is the processor” has started appearing in security questionnaires. The pricing page has the numbers to run that comparison honestly.
Common questions
What is the best European alternative to Amazon SES?
Is SES in eu-central-1 already GDPR compliant?
Is eusend cheaper than Amazon SES?
What do I stop maintaining if I move off SES?
Does eusend require a production access request like the SES sandbox?

Test keys exercise the full pipeline — accepted, logged, complete webhook lifecycle — without delivering. Point a staging environment at eusend, confirm the events match what your SNS handlers expected, then move production when it looks boring.
Create a free account