Tu producto se queda con un backend que aguanta crecer: servicios con límites claros, APIs documentadas y un modelo de datos pensado para las consultas que de verdad se ejecutan.

Esto suele empezar de dos maneras. O hay que levantar el backend de un producto nuevo y conviene no equivocarse con el modelo de datos ni con los contratos, o hay un backend que ya funciona pero cada cambio cuesta más que el anterior.
Los dos casos se atacan distinto. En un producto nuevo el foco está en poner cimientos que aguanten crecer; en uno que ya corre, en desmontar lo que frena al equipo sin parar la entrega.
Los contratos se acuerdan contigo antes de implementar. Cada endpoint tiene su esquema, sus códigos de error y su versión, así que tu equipo de cliente puede avanzar en paralelo contra ese contrato. Cuando la API la consumen varios equipos entran pruebas de contrato, para que un cambio no rompa a nadie en silencio.
El esquema es lo más caro de cambiar después, así que se le dedica tiempo al principio: claves, relaciones, qué se normaliza y qué no, y qué índices hacen falta para las consultas que de verdad se van a ejecutar. Las migraciones se escriben para poder desplegarse sin parar el servicio.
Todo lo que no tiene que responder en la petición se va a una cola: correos, webhooks, informes, sincronizaciones. Con reintentos, idempotencia y una dead letter queue que alguien mira, porque una cola sin observabilidad solo esconde los errores.
Muchos backends necesitan una consola interna o un panel para operar. Se construyen con React, Next.js o Angular, con el mismo criterio: estados de carga y de error de verdad, y nada de pantallas que solo funcionan con datos perfectos.
Lo que tiene que responder rápido y lo que se hace después, ya fuera de la petición.
Cliente
Web, móvil o una integración de terceros. Todos entran por la misma puerta.
Borde
Autenticación, permisos del tenant y rate limiting antes de tocar nada.
Servicio
Las reglas del negocio, separadas del framework y con sus propios tests.
PostgreSQL
Una transacción por operación, para que no queden escrituras a medias.
Lo que no se resuelve dentro de la petición
Es la decisión que más cuesta cambiar después. Depende de cuántos clientes hay y de cuánto aislamiento pide el contrato.
Columna tenant_id
Sirve con muchos clientes pequeños y un equipo que puede sostener la disciplina.
Esquema por tenant
Buen punto medio cuando son decenas de clientes y alguno pide sus datos aparte.
Base por tenant
Se justifica con pocos clientes grandes o con requisitos de cumplimiento.
Sí, y es el caso más habitual. El trabajo entra por incrementos que se despliegan solos: primero se acota una parte del sistema, se le ponen pruebas y se cambia con la entrega en marcha. Nadie tiene que congelar el producto durante semanas para que esto avance.
Sigue siendo el dueño del código. Las decisiones de contrato y de modelo de datos se acuerdan con ellos, y al terminar quedan las pruebas y la documentación de operación para que puedan seguir sin depender de nadie de fuera.
En el que tu equipo pueda mantener. Python con Django o FastAPI, Ruby on Rails y Node con NestJS o Express cubren prácticamente el mismo terreno; la elección la decide qué sabe operar el equipo y qué hay ya en marcha, no la moda del año.
Por el modelo de datos y por los límites entre servicios, que es lo más caro de cambiar después. Las consultas se revisan contra el volumen esperado, no contra la base de desarrollo, y lo que no tiene que responder dentro de la petición se va a una cola desde el principio.