Saltar al contenido

Desarrollo de aplicaciones SaaS

Desarrollo de SaaS con Next.js

Productos SaaS multi-tenant sobre App Router - tenencia y autorización decididas antes de la primera pantalla, facturación que aguanta una auditoría y un panel que se queda en el servidor.

Un producto SaaS no es una web con login. Tres decisiones de la primera quincena -cómo funciona la tenencia, dónde vive la autorización y cómo llega el estado de facturación a la aplicación- determinan lo que cuestan los dos años siguientes, y las tres son caras de revertir en cuanto hay datos en producción.

Nosotros construimos estos productos, y empezamos por esas tres.

Tenencia, decidida antes de la primera pantalla

Hay tres modelos y el correcto depende de tus clientes, no de la moda.

ModeloAislamientoCuándo es el correcto
Tablas compartidas, columna de tenantImpuesto en el códigoLa mayoría de productos. El más barato de operar y migrar.
Esquema por tenantImpuesto por la base de datosClientes regulados, export o restore por tenant.
Base de datos por tenantTotalPocos clientes, grandes, aislados por contrato.

El modelo compartido es el correcto casi siempre, y su único riesgo real es una consulta que olvida el filtro de tenant. Eso no es un problema de disciplina que se arregle en revisión de código: se arregla con seguridad a nivel de fila en la base de datos, de modo que un filtro ausente devuelve nada en lugar de devolver los datos de otro.

Autorización en los datos, no en la ruta

El middleware que decide quién puede ver una página es una puerta, y las puertas sirven. Autorización no son. Las Server Actions y los Route Handlers se pueden llamar directamente, así que una comprobación que solo vive en el middleware es una comprobación que el endpoint no tiene.

Cada consulta lleva el tenant y el actor. Cada mutación vuelve a derivar el permiso de la sesión en vez de fiarse de un argumento. El razonamiento es el mismo de Server Actions y los tres errores de siempre, y en un producto multi-tenant el fallo no es un bug: es un cliente leyendo los datos de otro.

Facturación que aguanta una auditoría

Stripe es lo habitual y la integración no es la parte difícil. La parte difícil es que tu aplicación y Stripe guardan el mismo hecho -a qué tiene derecho este cliente- y van a discrepar.

Tratamos a Stripe como fuente de verdad y a la copia de la aplicación como una caché reconstruida desde webhooks, con el handler idempotente y con verificación de firma. Los derechos se leen de tu propia base de datos en cada petición, porque llamar a Stripe en el camino de la petición hace que la disponibilidad de tu producto dependa de la suya.

Prorrateos, pruebas, cambios de asientos y pagos fallidos son cada uno un estado que la interfaz tiene que expresar. Qué puede seguir haciendo una cuenta con impago es una decisión de producto, y la preguntamos en vez de inventarla.

El problema del panel

Los paneles SaaS son donde las aplicaciones de App Router se vuelven lentas. El instinto es un use client arriba del todo porque hay gráficos y filtros, y entonces el árbol entero del panel se va al navegador.

Las tablas, las cabeceras, la navegación y la obtención de datos se quedan en el servidor. El gráfico, el filtro y el selector de fechas son islas de cliente. El estado en la URL lleva los filtros, lo que hace una vista filtrada compartible y el botón atrás correcto. Y ninguna página espera a su widget más lento: cada uno llega por streaming detrás de su propia frontera, que es el sentido de loading.tsx no es un spinner.

Lo que no hacemos

No partimos de un boilerplate de SaaS. Codifican decisiones de tenencia, auth y facturación tomadas para otro producto, y deshacerlas después cuesta más que las dos semanas que ahorraron.

Tampoco construimos el panel de administración primero. Es la parte que más disfrutan especificando los fundadores y la parte que los clientes no ven nunca.

Cómo se desarrolla un encargo

La primera semana es una decisión y no un desarrollo: qué modelo de inquilinos, qué aislamiento tendrá que demostrar, y qué preguntará la revisión de seguridad de su mayor cliente plausible.

Eso se convierte en un alcance escrito con el modelo, el enfoque de autorización, el comportamiento de facturación y las fases, con precio. Se firma antes de construir el producto, porque esto es lo único de esta página que ninguna migración posterior abarata.

Después las fases, cada una terminando desplegada, con las pruebas de aislamiento escritas junto a las funcionalidades.

Qué recibes

El modelo de inquilinos y autorización cerrado por escrito antes de la primera pantalla, y el producto construido contra él. La suite de pruebas pesa aquí más de lo habitual, porque las pruebas que cuentan son las que afirman un fallo: una petición con la sesión de un inquilino no debe alcanzar la fila de otro.

La facturación llega con su conciliación y no solo con su checkout. Y la respuesta escrita a la pregunta del aislamiento, que todo prospecto corporativo acaba poniendo en una revisión de seguridad y que sale mucho más barata preparada que redactada contra reloj.

Alcance y condiciones

Modelo de colaboración
Alcance cerrado, acordado por escrito antes de empezar. No es una tarifa por día contra una lista abierta.
Precio y plazo
Los dos se fijan por proyecto, una vez fijado el alcance. Se ofertan juntos, antes de construir nada.
Qué necesitamos de usted
Una persona que pueda aprobar decisiones, y acceso a su repositorio y a su gestor de incidencias.
No incluido
Todo lo que quede fuera del alcance acordado. Pasa a ser su propio alcance, no una modificación.
Costes de terceros
El alojamiento, las licencias, las tarifas de API y las suscripciones SaaS los contrata y paga usted.
Facturación
Codefacture Yazılım A.Ş., Türkiye. EUR, USD o GBP por transferencia, sin IVA turco en servicios exportados.

Preguntas frecuentes

¿Una base de datos o una por inquilino?
Base compartida con una columna de inquilino para casi todos, aplicada en la capa de datos y no en una comprobación de middleware. Una base por inquilino es una respuesta seria cuando un contrato exige aislamiento, y cuesta migraciones, copias de seguridad y un problema de conexiones mientras viva el producto. Decídalo antes de la primera pantalla.
¿Desarrollan ustedes la facturación?
Sí, normalmente sobre Stripe. El checkout no es lo que lleva tiempo. El prorrateo, los cambios de plan a mitad de ciclo y un registro que siga cuadrando cuando lo lea un auditor un año después sí lo son.
¿Pueden trabajar sobre un producto existente?
Sí, empezando por una auditoría, porque añadir multi-inquilino a una aplicación que dio por hecho un solo cliente es un trabajo distinto de construirlo desde el principio.
¿Cuánto hasta poder firmar el primer cliente?
De tres a cuatro meses hasta algo vendible, con un producto enfocado y el alcance acordado. Antes recortaríamos alcance que el trabajo de multi-inquilino y autorización, porque son justo los que no se añaden luego a buen precio.
Llamar+1 848 272 7583WhatsApp+90 850 308 5436Correoinfo@codefacture.comPágina de contacto