Por qué separamos el marketing del producto
· Emytu
Lanzamos una superficie pública estática en Astro para servir landing, blog y contacto fuera del bundle del producto. Esto es lo que cambia y lo que no.
Hoy lanzamos apps/marketing, un sitio estático en Astro que sirve la landing, el blog y el formulario de contacto. Antes todo eso vivía dentro de la app Angular del producto. Esto explica por qué hicimos el split y qué trade-offs aceptamos.
El problema
La app de Angular atendía dos audiencias muy distintas:
- Visitantes anónimos que llegan a la landing, leen sobre el producto y quizás dejan un mensaje en el formulario de contacto.
- Tenants autenticados que emiten facturas, notas, documentos soporte y revisan su dashboard.
El primer grupo solo necesita HTML y CSS. El segundo carga PrimeNG, Transloco, el cliente HTTP, el Auth service, el authInterceptor, el provideAppInitializer, los guards, los stores de signals, los layouts, el router con sus 30+ rutas. Para mostrar una sección de marketing estábamos descargando todo eso.
Lo que cambia
apps/marketing(Astro 5) sirve/,/blog,/blog/[slug],/contacto. Es estático. No hay runtime de Angular. No hay JWT, no hay guards, no hay Transloco.apps/web(Angular) sirve/login,/home,/invoices,/notes,/customers, etc. Esto no cambia.- El API en
apps/apiya tenía el endpointPOST /api/contact(lo necesitamos para el formulario). El frontend ahora vive enapps/marketingpero el endpoint no se movió. - La misma cookie de sesión funciona en ambos porque comparten dominio. Si vienes logueado del producto y refrescas la landing, no te desloguea.
Lo que no cambia
- La marca. Los tokens de diseño están duplicados entre las dos apps (mejor refactor a
packages/uidespués, fuera de scope). - El dominio. La landing y el producto viven bajo el mismo dominio, ruteados por un reverse proxy por path.
- La autenticación. Una sola sesión para el usuario. El endpoint de refresh sigue en el API, igual que antes.
Trade-offs que aceptamos
- Cross-app navigation es un full page reload. La landing no conoce el bundle del producto, así que el link a
/loginrecarga la página. Es la frontera correcta. - Doble deploy. El sitio estático se publica a un CDN; el producto a su target habitual. Si querés cambiar la landing, redeployás solo marketing.
- El bundle de marketing ya no contiene dependencias de Angular. Eso es lo que queríamos. La landing pesa una fracción de lo que pesaba.
Próximo paso
El siguiente split es la app de admin del dueño de la SaaS (gestión de tenants, billing, soporte). Esa historia la contamos cuando la armemos.