← Blog
ARCHITECTURE4 min read

Email infrastructure is now portable across the ecosystem

May 5, 2026Dekimu

Every Dekimu app sends email — magic links, waitlist confirmations, invoice reminders, DSAR acknowledgements, deletion-confirmation cascades. Until last week, every one of them imported the Resend SDK directly. As of today, all sixteen sender call sites across the nine ecosystem apps go through a single provider-neutral abstraction. Resend stays the active path, on EU-West. A Scaleway TEM adapter sits dormant alongside it for the day we want to pull the switch.

Why this matters even when nothing changed

Provider lock-in is invisible until the day it isn't. A pricing change, a region outage, a regulatory shift in where transactional email can land — any of those flips email infrastructure from 'works fine' to 'critical migration' overnight. We wanted that switch to be a one-line config change, not a sixteen-file refactor. The abstraction is small on purpose: a single getEmailSender() function, a normalized response shape, no SDK leakage past the boundary. Boring is the goal.

EU-only, by default

Every Dekimu app processes data on EU customers. That's not a marketing claim — it's where the legal exposure lives. Resend has shipped on EU-West for months; we confirmed the region this week and locked it in. The dormant Scaleway adapter is the next-step option if we want a fully French-hosted path, end-to-end. Either way, transactional email never leaves the EU. That's the floor we're not willing to negotiate.

The right time to build a portable infrastructure layer is before you need to be portable. Otherwise you're refactoring under fire.

What this unlocks

Two things, immediately. First, a per-app override — InvoiceUp could route through one provider while miniterms uses another, if regulatory or deliverability data ever justifies it. Second, a clean test surface: every test now asserts against the normalized response shape, not against vendor SDK internals that change across versions. The cleanup that came with this — replacing nine separate setup README files with one knowledge note, retiring the resend-only doc — was its own quiet win.

Stage A is shipped across all nine apps plus the starter template. Stage B (Scaleway cutover) doesn't fire until we see one of three triggers we wrote down up front. Until then, the dormant adapter is a feature flag, not a bet.

ARCHITECTURE
← Back to blog