Getting the corporate chain right
Sinch AB, listed on Nasdaq Stockholm, acquired Pathwire — the company behind Mailgun and Mailjet — in 2021. So the group’s ultimate owner is European, which is more than can be said for most of this category. The Mailgun business itself, though, operates through a US-incorporated entity headquartered in San Antonio, Texas.
That middle layer is where the remaining difference lives. The US CLOUD Act attaches to the entity that controls the data, not to the nationality of the shareholders above it — which is why a European parent doesn’t by itself put a US operating subsidiary outside US legal process, and why an EU region doesn’t either. It is a narrow point. It is also the entire honest case for switching, so we are not going to dress it up as something larger.
| Where the data sits | Mailgun: EU region available, if you configured it. eusend: EU only, no other option exists. |
| Who operates it | Mailgun: a US-incorporated entity (San Antonio, Texas). eusend: a Norwegian entity, inside the EEA. |
| Ultimate parent | Mailgun: Sinch AB, Sweden. eusend: none — there is no parent in the chain. |
| Who runs the mail servers | eusend operates its own MTA infrastructure in Falkenstein, Germany, rather than forwarding to another provider’s sending service. |
| The honest caveat | Our 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 complete list is on our sub-processors page — short enough to read in a minute, which is itself part of the point. |
One endpoint instead of a region you have to remember
Mailgun’s EU region is opt-in: a different API base URL, and domains created in the EU region rather than the default one. That works, right up until a new service, a background job or a staging environment is pointed at api.mailgun.net instead of api.eu.mailgun.net — at which point that traffic is processed outside the region you chose, and nothing in your code is obviously wrong.
eusend has one endpoint. There is no non-EU path to point at by accident, on any plan, which means the residency property of your system doesn’t depend on every developer remembering a hostname.
The send call gets shorter
This part is a nice side effect rather than the argument. Two structural simplifications: there is no domain argument, because the domain comes from your verified from address, and there is no multipart form-data, because the API is plain JSON. The h: and o: prefix conventions become ordinary fields.
- import formData from 'form-data'
- import Mailgun from 'mailgun.js'
+ import { Eusend } from '@eusend_dev/sdk'
- const mg = new Mailgun(formData).client({
- username: 'api',
- key: process.env.MAILGUN_API_KEY,
- url: 'https://api.eu.mailgun.net',
- })
+ const eusend = new Eusend(process.env.EUSEND_API_KEY)
- await mg.messages.create('mg.acme.com', {
- from: 'Acme <hello@acme.com>',
- to: ['user@example.com'],
- subject: 'Your receipt',
- html,
- 'h:Reply-To': 'support@acme.com',
- 'o:tracking-clicks': 'yes',
- })
+ await eusend.emails.send({
+ from: 'Acme <hello@acme.com>',
+ to: 'user@example.com',
+ subject: 'Your receipt',
+ html,
+ replyTo: 'support@acme.com',
+ trackClicks: true,
+ })
accepted, delivered, permanent_fail, complained, opened and clicked all have direct equivalents, and both providers sign with HMAC-SHA256. temporary_fail has no equivalent by design — soft-failure retries happen inside the platform and you hear about the final outcome.attachments[].content with a filename. Up to 20 files, 10 MB combined per message.eusend with your API key as the password, on port 465 with implicit TLS.recipient-variables becomes a batchThe field-by-field version is in the Mailgun migration guide.
When you should stay on Mailgun
If you are already on the EU region, your compliance posture is settled, and you rely on the parts of Mailgun that are genuinely deeper than ours — inbound routing, mailing lists, the log-retention and analytics tiers, or the breadth that comes with being part of a large communications group — then the narrow jurisdictional point above probably isn’t worth a migration on its own. We would rather say that than win an account that regrets it in a quarter.
The case for moving is stronger when the recipient list is itself sensitive, when a customer or auditor has started asking specifically who the processor is rather than where the servers are, or when you want the mail stack to be operated by the company you have the contract with. The deliverability page covers what running our own MTA buys in practice.
Common questions
What is the best European alternative to Mailgun?
Is Mailgun a European company?
Is Mailgun’s EU region enough for GDPR?
How hard is it to migrate from Mailgun to eusend?
How does eusend pricing compare to Mailgun?

Every account gets test keys that run the full pipeline — accepted, logged, complete webhook lifecycle — without delivering. Build the integration, confirm the events match what your Mailgun handlers expected, then verify a domain and switch a key.
Create a free account