Cuando empiezo un producto SaaS, no empiezo preguntándome qué stack está más de moda. Me hago una pregunta más estrecha: ¿qué me dejará shippear rápido sin crear lastre innecesario dentro de seis meses? Para mi último producto, la respuesta fue Next.js.
Eso no significa que Next.js sea perfecto, ni que sea la elección correcta para cada app. Significa que sus trade-offs encajaban con el tipo de producto que quería construir: flujos autenticados, dashboards, formularios, páginas de contenido y un sitio público de marketing viviendo en el mismo codebase.
Este es el razonamiento práctico detrás de esa elección.
Quería un framework para toda la superficie del producto
La mayoría de productos SaaS no son solo "una app". Son varias superficies pegadas entre sí:
- una landing page
- un dashboard autenticado
- flujos de settings y billing
- formularios y pasos de onboarding
- estados transaccionales de UI como loading, empty y error screens
No quería ensamblar routing, data fetching, layouts, metadata y deployment desde librerías separadas salvo que tuviera una buena razón. Next.js me da un default coherente para todo eso.
El valor no es solo conveniencia. Es menos overhead de decisiones. Un framework con opiniones fuertes ahorra tiempo cada semana porque deja menos preguntas arquitectónicas abiertas.
App Router encaja con cómo pienso la estructura de producto
El App Router es una de las mayores razones por las que sigo eligiendo Next.js para trabajo SaaS.
Los layouts anidados no son solo una neat feature técnica. Reflejan cómo están organizados los productos de verdad. Las páginas públicas tienen un shell. Las áreas logueadas tienen otro. Las páginas de settings suelen compartir un sidebar. Las páginas de marketing comparten un wrapper más ligero y distinta metadata.
Con route groups y layouts, el codebase empieza a reflejar el mapa del producto en vez de pelear contra él.
Eso importa porque la mantenibilidad suele ser un problema de estructura antes de ser un problema de performance.
El renderizado server-first sirve para productos reales
Una de las formas más fáciles de sobrecomplicar un frontend SaaS es fetchear todo en el cliente por defecto.
Ese enfoque funciona, pero suele crear estados de carga extra, lógica de fetching duplicada y más JavaScript del necesario al inicio. Next.js me empuja hacia un mejor default:
- renderizar en el servidor lo que se pueda renderizar en el servidor
- reservar los componentes de cliente para la interactividad
- mover el acceso a datos cerca de donde se usa
Esa división no siempre es trivial, pero lleva a boundaries más limpios.
Para dashboards, páginas autenticadas y pantallas con mucho contenido, este modelo es práctico. La vista inicial carga con datos útiles ya presentes. Los usuarios ven menos flicker de UI. Yo paso menos tiempo construyendo coreografías de placeholders para datos que podrían haber llegado con la respuesta.
La developer experience es lo bastante rápida como para importar
Me importan mucho los feedback loops. Si el ciclo edit-save-refresh es lento, el producto sufre porque el equipo shippea menos y experimenta menos.
Next.js no es el framework más ligero del planeta, pero la velocidad de iteración general sigue siendo fuerte:
- el filesystem routing mantiene la navegación predecible
- co-locar UI y lógica de ruta reduce la caza de archivos
- el soporte built-in de TypeScript minimiza el setup
- metadata, imágenes y assets estáticos tienen convenciones claras
El punto clave es este: mucho tiempo de ingeniería no se pierde resolviendo problemas difíciles, sino re-resolviendo problemas de framework ya resueltos. Prefiero gastar ese tiempo en decisiones de producto.
Encaja con el stack que ya uso
Mi stack frontend por defecto suele ser alguna combinación de:
- Next.js
- TypeScript
- Tailwind CSS
- una capa de componentes que controlo
- servicios backend como Supabase, Postgres o APIs custom
Next.js encaja cómodamente en ese setup.
TypeScript es first-class. Tailwind funciona natural. El renderizado del lado del servidor y los route handlers me dan margen para auth edges, lógica backend ligera y trabajo de integraciones sin inventar una capa separada demasiado pronto.
Eso no reemplaza un backend real cuando hace falta. Solo significa que puedo empezar con menos piezas móviles e introducir complejidad cuando el producto realmente la gane.
Hace el trabajo de performance más deliberado
Hay un argumento perezoso sobre frameworks: "maneja la performance por ti". Eso nunca es del todo cierto.
Lo que Next.js sí me da es un mejor set de defaults:
- code splitting por rutas
- server rendering cuando ayuda
- streaming y suspense donde toca
- optimización de imágenes y primitivas de metadata
Igual tienes que diseñar buenas páginas. Igual tienes que evitar shippear bundles gigantes de cliente. Igual tienes que prestar atención a los boundaries de estado y a los scripts de terceros.
Pero prefiero partir de un framework que me empuja hacia la contención que de uno que deja cada decisión de performance como opcional y fácil de posponer.
La historia de deployment es simple
La simplicidad operativa importa más de lo que la gente admite.
Cuando construyo un SaaS early-stage, quiero un modelo de deployment aburrido:
- preview deployments por cada cambio
- manejo claro de variables de entorno
- rollback fácil
- comportamiento predecible de renderizado estático y dinámico
Next.js me da ese workflow con muy poca ceremonia. Eso importa porque el trabajo de producto ya está lleno de incertidumbre. No quiero que el setup de infra se convierta en una segunda startup dentro de la startup.
Los trade-offs son reales
No elijo Next.js porque crea que no tiene downsides.
Hay trade-offs reales:
- el comportamiento del framework puede sentirse mágico hasta que aprendes los límites
- los splits servidor/cliente requieren disciplina
- el caching y la revalidación pueden ser sutiles
- los upgrades pueden traer churn, sobre todo en canary o versiones que se mueven rápido
Si estuviera construyendo un frontend muy especializado con constraints de renderizado inusuales, o si necesitara una abstracción más fina, quizá elegiría otra cosa.
Pero para un SaaS típico, esos trade-offs son aceptables porque el upside es sustancial: delivery más rápido con una arquitectura default más fuerte.
Por qué lo elegí, en una línea
Elegí Next.js porque me deja construir toda la superficie de un SaaS dentro de un sistema opinionado sin renunciar a la flexibilidad que me importa.
Esa es la razón real. Ni hype. Ni presión de tendencias. Solo leverage.
El framework me ayuda a pasar más tiempo en lo que los usuarios notan: onboarding, velocidad, claridad, workflows y calidad de producto. Y para un negocio SaaS, esa es la parte que importa.