Cada app de Dekimu envía correo — magic links, confirmaciones de waitlist, recordatorios de factura, acuses de DSAR, cascadas de confirmación de borrado. Hasta la semana pasada, cada una de ellas importaba el SDK de Resend directamente. Desde hoy, los dieciséis call sites de envío en las nueve apps del ecosistema pasan por una única abstracción neutral de proveedor. Resend sigue siendo el path activo, en EU-West. Un adaptador de Scaleway TEM espera dormido al lado para el día que decidamos pulsar el interruptor.
El lock-in de proveedor es invisible hasta el día que deja de serlo. Un cambio de pricing, una caída de región, un giro regulatorio sobre dónde puede aterrizar el correo transaccional — cualquiera de esos pasa la infraestructura de email de 'va bien' a 'migración crítica' de un día para otro. Queríamos que ese interruptor fuese un cambio de una línea de config, no un refactor de dieciséis ficheros. La abstracción es pequeña a propósito: una sola función getEmailSender(), una forma de respuesta normalizada, sin filtración de SDK más allá de la frontera. Aburrido es el objetivo.
Cada app de Dekimu procesa datos de clientes en la UE. Eso no es marketing — es donde vive la exposición legal. Resend lleva meses en EU-West; lo confirmamos esta semana y lo dejamos cerrado. El adaptador dormido de Scaleway es la opción de siguiente paso si queremos un path full francés, de extremo a extremo. En cualquier caso, el correo transaccional no sale de la UE. Ese es el suelo que no estamos dispuestos a negociar.
El momento correcto para construir una capa de infraestructura portable es antes de necesitar ser portable. Si no, refactorizas bajo fuego.
Dos cosas, ya. Primero, un override por app — InvoiceUp podría ir por un proveedor mientras miniterms va por otro, si los datos de regulación o entregabilidad lo justifican algún día. Segundo, una superficie de tests limpia: cada test ahora valida contra la forma de respuesta normalizada, no contra internals del SDK que cambian entre versiones. La limpieza que vino con esto — sustituir nueve READMEs de setup separados por una sola nota de conocimiento, jubilar el doc específico de Resend — fue su propia pequeña victoria silenciosa.
La fase A está enviada en las nueve apps más la plantilla de starter. La fase B (cutover a Scaleway) no se dispara hasta que veamos uno de los tres triggers que escribimos por adelantado. Hasta entonces, el adaptador dormido es un feature flag, no una apuesta.