Cómo crear una app de coaching fitness online con Next.js
Crea una plataforma de coaching online con lista de clientes, entrenamientos asignados y check-ins semanales con Next.js y NestJS. Ejemplo paso a paso.

Al terminar esta guía sabrás cómo crear una app de coaching fitness online, con lista de clientes, entrenamientos asignados, check-ins semanales y una app para los miembros, usando Next.js, NestJS y la plantilla Kinora de Aniq UI. No necesitas diseñar las pantallas ni escribir la API desde cero.
Seguimos un negocio de ejemplo desde el primer plan hasta el día del lanzamiento. Verás qué pantalla cumple cada función, qué comandos ejecutar y qué ajustes hacen tropezar a la gente. Los mismos pasos sirven para un entrenador independiente, un gimnasio pequeño o una agencia que crea la app para un cliente.
El encargo
Northgate Strength es un estudio de coaching online. Lo dirige un entrenador jefe con dos entrenadores personales. Quieren dejar atrás las hojas de cálculo y los hilos de chat, y dar a cada cliente un único lugar donde entrenar. Esto es lo que pide el estudio:
- Tres entrenadores, y cada uno ve a sus propios clientes y a nadie más.
- Los clientes registran entrenamientos, comidas, sueño y peso, para que los entrenadores vean lo que pasó de verdad.
- El entrenador elige un entrenamiento para un día concreto, y el cliente lo ve primero.
- Cada semana, cada cliente envía un check-in breve y el entrenador lo responde.
- Entrenador y cliente hablan en un hilo privado dentro de la app.
- Unos clientes leen en inglés y otros en árabe, así que la app debe funcionar en ambos idiomas, incluida la escritura de derecha a izquierda.
- El nombre, los colores y el dominio propios del estudio, y su propia base de datos.
Cómo cubre la plantilla el encargo
| Necesidad | Dónde está | Qué usas |
|---|---|---|
| Cada entrenador ve solo a sus clientes | Dashboard y API | La pantalla My Clients, protegida por el permiso coaching.clients |
| Entrenamiento fijado para un día | Dashboard | El plan en la página de un cliente; el cliente lo ve en Workouts |
| Los clientes registran entrenos y comidas | Dashboard, lado del miembro | La sesión de entrenamiento en vivo, la biblioteca de ejercicios, el Meal Planner |
| Sueño, salud y medidas corporales | Dashboard, lado del miembro | Las páginas Sleep, Health y Progress, con entrada manual |
| Check-ins semanales | Dashboard y API | Un formulario de check-in para el cliente, un cuadro de respuesta para el entrenador |
| Mensajes privados | Dashboard y API | Un hilo por entrenador y cliente, enviado en tiempo real con Socket.io |
| Inglés y árabe | Dashboard y API | Rutas /en y /ar, archivos de mensajes, contenido escrito en ambos idiomas |
| Personal y permisos | Dashboard | Las pantallas Coaches y Coach Roles |
| Base de datos y dominio propios | API | SQLite en local, MySQL por configuración, archivos de entorno |
Antes de empezar: decisiones que tomar
Algunas decisiones son baratas sobre el papel y caras de cambiar cuando los clientes ya se han registrado. Resuélvelas antes de abrir una terminal.
¿Quién usará la app y con qué roles?
Kinora separa a los clientes, que entrenan, del personal, que entrena a otros y lleva la administración. Northgate tiene un entrenador jefe y dos entrenadores personales, así que necesita tres cuentas de personal y un rol que dé a cada uno su lista de clientes. Anota las personas y las pantallas que necesita cada una. Esa lista se convertirá en tus roles más adelante.
¿En qué idiomas leerán los clientes?
El inglés y el árabe vienen listos. Cada palabra visible está en un archivo de mensajes, y el contenido del catálogo se guarda exactamente en esos dos idiomas. Si un tercer idioma importa en tu mercado, cuenta con trabajo extra en varios archivos en lugar de un simple interruptor.
¿Dónde se ejecutará?
En local solo necesita Docker, o Node.js con Yarn. En producción necesitas un alojamiento para el dashboard, otro para la API y una base de datos. SQLite sirve para desarrollar, y MySQL es un cambio de configuración. Decide pronto si vas a gestionar los servidores tú mismo o a usar una plataforma, porque cambia cómo configuras los archivos de entorno.
¿Cómo te pagarán los clientes?
La plantilla no incluye ningún proveedor de pagos. La tarjeta de facturación de los ajustes muestra solo cifras de ejemplo. Si cobras por el coaching, elige ahora la herramienta que envíe facturas o gestione suscripciones, y mantenla fuera de la app.
¿Quieres el asistente de IA desde el primer día?
Necesita una clave de modelo de Google, OpenAI o DeepSeek, y le pagas directamente a ese proveedor. Puedes lanzar sin él y añadirlo cuando el ciclo básico de entrenamientos, check-ins y mensajes ya funcione.
¿Qué registrarán los clientes a mano?
El entrenamiento, las comidas, el sueño, las lecturas de salud y las medidas corporales se pueden introducir manualmente. Las lecturas automáticas de relojes y pulseras no vienen incluidas. Si Northgate quiere que el entrenador vea el sueño, debe pedir a los clientes que lo registren, o conectar más adelante una fuente propia.
Paso a paso
Paso 1: Elige el paquete
Kinora se ofrece como paquete Full Stack (dashboard más API), paquete Member & Coach Dashboard y paquete Backend API. El dashboard solo funciona con datos de ejemplo dentro del navegador. Eso está bien para un repaso de diseño, pero nada llega a una base de datos, así que dos entrenadores nunca podrían compartir un cliente.
Northgate necesita datos compartidos, así que elige el paquete Full Stack. Si ya tienes tu propia API, el paquete de dashboard puede conectarse a ella. La licencia cubre un número ilimitado de proyectos, incluido el trabajo que entregues a un cliente.

Fíjate en la página My templates de esta captura: ahí está el ZIP de cada paquete que compraste.
Qué comprobar: que la carpeta que extrajiste lleve el nombre de tu paquete (el full stack se extrae como kinora-fitness-full-stack) y contenga back-end, dashboard y docker-compose.yml. Si ves dentro otra carpeta con el mismo nombre, entra en la interior.
Paso 2: Ejecútalo en local con Docker
Descarga el ZIP desde My templates, descomprímelo y abre una terminal en la carpeta kinora-fitness-full-stack. Comprueba que Docker Desktop (o Docker Engine con Compose) esté en marcha. Luego arranca todo:
docker compose up --build
Docker construye dos imágenes la primera vez y carga datos de demostración en la base de datos, así que cuenta con unos minutos. Al terminar, el dashboard está en localhost:3030 y la API en localhost:8000. Si otro programa ya ocupa un puerto, crea un archivo .env junto a docker-compose.yml con DASHBOARD_PORT=3040 o API_PORT con un número libre, y vuelve a ejecutar el comando.
¿Prefieres Node.js sin más? Instala Node 22.9 o superior, ejecuta corepack enable una vez y arranca la API (yarn seed, luego yarn dev) y el dashboard (yarn dev) en dos terminales. Arranca primero la API.

Esta captura muestra la terminal abierta dentro de la carpeta extraída, que es donde se espera que se ejecute cada comando de esta guía.

Espera a que la API indique que está sana, porque el dashboard solo arranca después.

Si elegiste la vía de Node.js, esta es la terminal de la API cuando el seed ya se ejecutó y el servidor está activo.

La segunda terminal ejecuta el dashboard en el puerto 3030, con la dirección de la API rellenada para que los datos de ejemplo queden desactivados.

Qué comprobar: abre localhost:8000/api/health. Debería responder con un estado ok. Si el dashboard muestra un aviso "Sample data", todavía no está hablando con la API.
Lo que suele salir mal:
- Docker está instalado pero no está en marcha. Inicia Docker Desktop y espera a que el motor indique que está activo.
- El puerto 3030 o 8000 está ocupado, a menudo por una ejecución anterior u otro proyecto. Libera el puerto, o define
DASHBOARD_PORToAPI_PORTcomo se muestra arriba. - El primer arranque parece atascado. Normalmente sigue cargando los datos de demostración, así que espera a que la comprobación de salud se ponga en verde.
docker compose down -vborra el volumen de la base de datos. El simpledocker compose downconserva tus datos.
Paso 3: Recorre la demo con cada rol
El formulario de inicio de sesión se rellena solo. Abre localhost:3030 para el Head Coach (headcoach@example.com, contraseña Coach@123). Para el lado del miembro, abre localhost:3030/en/auth/login?as=client (member@example.com, contraseña Member@123). Una tercera cuenta, trainer@example.com con Trainer@123, muestra lo que ve un entrenador personal.
Dedica veinte minutos a esto. Como entrenador, abre My Clients y la página de un cliente. Como miembro, inicia la sesión en vivo en Workouts, registra una serie y mira el Meal Planner. Así decide también Northgate qué conservar: el estudio usará entrenamiento, nutrición, sueño y progreso, e ignorará por ahora los retos de la comunidad.


Mira el plan semanal y el trabajo asignado por el entrenador, porque son las dos cosas que van a rellenar los entrenadores de Northgate.

La tabla de series con peso, repeticiones y RPE es por donde entra en el sistema el entrenamiento real del cliente, y es lo que el entrenador lee después.
Qué comprobar: anota, para cada rol, las tres pantallas más importantes. La lista de Northgate para un cliente es Workouts, la sesión en vivo y el check-in semanal. Para un entrenador es el resumen, My Clients y el hilo de mensajes. Lo que no esté en una lista puede esperar.
Lo que suele salir mal: la gente juzga la demo como si sus datos fueran los suyos. Los clientes, comidas y mensajes de ejemplo son datos de prueba. Juzga la estructura de las pantallas, no las cifras.
Paso 4: Pon la marca del estudio
La marca vive en archivos, no en una pantalla de ajustes. En la carpeta del dashboard:
src/config/brand.config.tscontiene el nombre, la descripción y los datos de contacto, cada uno con un valor en inglés y otro en árabe. Define tambiéndomain.url, porque viene con una dirección de ejemplo.src/components/icons/KinoraMark.tsxdibuja en código la marca del logotipo.src/styles/theme-variables.csscontiene todos los colores. El acento es--primaryColor, definido en los bloques claro y oscuro.src/app/layout.tsxcarga las fuentes: Inter para el inglés e IBM Plex Sans Arabic para el árabe.
El nombre del producto aparece también en algunos mensajes, como la tarjeta de bienvenida y el saludo del asistente. Busca Kinora y su grafía en árabe en la carpeta messages y cambia ambos idiomas. Los valores de marca se incorporan en el momento de la compilación, así que ejecuta docker compose up --build otra vez tras cada ronda de cambios.
Qué comprobar: recarga el dashboard tras un cambio de marca en desarrollo y confirma que el nombre aparece en la barra lateral, en la pestaña del navegador y en el pie de página, en inglés y en árabe. Después haz una compilación al estilo producción y vuelve a comprobarlo, porque eso es lo que verán los clientes.
Lo que suele salir mal:
- Solo se edita el archivo de mensajes en inglés. Cambia siempre la misma clave en
ar.json. - El pie de página sigue enlazando al creador de la plantilla. El crédito viene de
src/config/author.config.ts. - Los enlaces y los datos de contacto de
brand.config.tsapuntan al principio al creador de la plantilla, así que cámbialos por los tuyos.
Paso 5: Crea el catálogo en dos idiomas
Todo lo que un cliente lee mientras entrena sale de un catálogo: ejercicios, entrenamientos, programas y platos, además de grupos de la comunidad, eventos, retos e insignias. El personal con el permiso fitness.manage los edita en Content. Cada registro lleva un nombre y una descripción en inglés y en árabe, lado a lado.
La demo incluye 23 ejercicios, 6 entrenamientos, 4 programas y 10 platos. Northgate conserva los que encajan y sustituye el resto por los suyos. Ejemplos de entradas: una sentadilla goblet y un peso muerto rumano como ejercicios, una semana de cuerpo completo en tres días como entrenamiento, y un bol de arroz con atún como plato. Para un plato introduces los gramos de proteína, carbohidratos y grasa, y las calorías se calculan solas.
Como los miembros leen los mismos registros, una edición se ve a la vez en la biblioteca, en el plan semanal y en la sesión en vivo.
Trabaja en este orden, para que nada haga referencia a algo que todavía no existe:
- Primero los ejercicios, con pasos de técnica y errores comunes de los movimientos que los clientes harán de verdad.
- Después los entrenamientos, construidos con esos ejercicios, con series y repeticiones.
- Por último los programas, que ordenan los entrenamientos por semanas. El miembro de la demo está en la semana 6 de 8 de un programa llamado Strength Foundation.
- Los platos para el planificador de comidas, para que los clientes puedan registrar desde una lista compartida.


Fíjate en los filtros de músculo, equipamiento y dificultad: cada ejercicio que añades en Content aparece aquí, listo para enviarse a la cola de entrenamientos de hoy.

El planificador muestra las comidas de un día por hora, con las calorías frente a un objetivo, así que comprueba que tus platos lleven gramos razonables de proteína, carbohidratos y grasa.
Qué comprobar: inicia sesión como miembro y busca en la biblioteca un movimiento que acabas de crear. Abre su página y confirma que se ven el texto en inglés y en árabe al cambiar de idioma.
Lo que suele salir mal: se rechaza borrar un registro que algo todavía usa, por ejemplo un ejercicio que forma parte de un entrenamiento. Quítalo primero del entrenamiento. Tampoco se puede eliminar un logro o insignia que alguien ya ha conseguido.
Paso 6: Configura entrenadores, roles y la lista de clientes
Entrenadores y clientes inician sesión en el mismo formulario, desde una única tabla de cuentas, y los roles de cada persona determinan lo que ve. La API aplica los mismos permisos que la barra lateral. El seed crea siete roles. Dos importan sobre todo aquí:
- Head Coach y Personal Trainer tienen
coaching.clients, así que obtienen My Clients y una lista de clientes propia. - Coach puede mover miembros entre entrenadores, pero no tiene
coaching.clients.
Northgate crea tres cuentas de personal en Coaches: el entrenador jefe y dos entrenadores personales. Si quiere que un Coach normal también trabaje con una lista de clientes, marca coaching.clients para ese rol en la pantalla Coach Roles. Cada miembro puede tener un solo entrenador activo.
Desde My Clients, el entrenador usa Add client para asumir a un miembro que no tiene entrenador. En la página de un cliente, el entrenador asigna un entrenamiento a una fecha, con una nota opcional. Cuenta como hecho cuando el cliente termina una sesión de ese entrenamiento. El check-in semanal pide al cliente su energía, su peso y una nota, y el entrenador responde desde la misma pantalla. Los mensajes forman un hilo por pareja, de hasta 2000 caracteres cada uno.
Qué comprobar: inicia sesión como entrenador jefe, abre un cliente, asigna un entrenamiento a una fecha y entra después como ese cliente para confirmar que aparece por delante de cualquier cosa que haya elegido él mismo. Termina una sesión de ese entrenamiento y comprueba que la asignación cuenta como hecha. Luego envía un check-in como cliente y respóndelo como entrenador.
Lo que suele salir mal:
- Un entrenador no ve My Clients. Su rol no tiene
coaching.clients. - Add client no lista a nadie. Solo aparecen los miembros sin entrenador, y un miembro puede tener un único entrenador activo. Mueve miembros entre entrenadores en Gym con el permiso
coaching.assign. - Fallan los archivos adjuntos de los mensajes. Pasan por la ruta de subida y necesitan el bucket de almacenamiento del paso siguiente.
Paso 7: Añade almacenamiento de fotos y, si quieres, claves de dispositivo
Las imágenes, las fotos de progreso y los archivos adjuntos necesitan almacenamiento: Cloudflare R2, o cualquier otro servicio que hable el protocolo S3. Sin él todo se muestra con imágenes de demostración incluidas, pero una subida nueva responde con un error 400. Define las cinco variables R2_* en back-end/.env e indica al dashboard el nombre de host público de tu bucket en NEXT_PUBLIC_MEDIA_HOSTNAME (con Compose, MEDIA_HOSTNAME).
Kinora no obtiene datos de ningún servicio de relojes o pulseras. Los datos llegan cuando algo los envía. Un cliente crea una clave en Settings, y un dispositivo o agregador envía un POST a /api/ingest/daily-metrics con esa clave en una cabecera X-Api-Key. Northgate se salta esto en el lanzamiento y deja que los clientes registren a mano.

Aquí gestiona el cliente sus alertas, su privacidad, la apariencia y sus dispositivos conectados, incluidas las claves que un dispositivo usa para enviar datos.
Qué comprobar: crea una clave como cliente, cópiala enseguida porque la clave completa se muestra una sola vez, y envía una petición a la ruta de ingesta que devuelva a quién pertenece la clave. Después revoca la clave y confirma que la misma petición se rechaza con un 401.
Lo que suele salir mal: las subidas responden 400 porque faltan las variables del bucket o aún conservan sus valores de ejemplo. Un valor que sigue siendo el de ejemplo cuenta como no definido.
Paso 8: Activa el asistente de IA (opcional)
El asistente tiene su propia página para cada cuenta. Un cliente pregunta por su propia semana. Un entrenador pregunta por la lista de clientes, quién entrenó y quién se descuidó, y puede registrar la respuesta a un check-in o asignar un entrenamiento desde el chat. Solo usa las herramientas que permite el rol de la cuenta.
Permanece apagado hasta que pongas una clave de Google Gemini, OpenAI o DeepSeek en back-end/.env. Los nombres de las variables están en .env.example. Hasta entonces la página dice que no hay ningún modelo conectado y todas las demás pantallas funcionan. Los cargos del proveedor corren por tu cuenta. La ruta que usaría un agente de programación, POST /api/mcp, también permanece cerrada hasta que definas tu propia MCP_API_KEY.

Qué comprobar: haz una pregunta como cliente y otra como entrenador. El cliente debería recibir una respuesta sobre su propia semana, y el entrenador sobre la lista de clientes. Confirma que un cliente no puede obtener los datos de otro cliente, porque el asistente solo usa las herramientas que permite el rol con el que se inició sesión.
Lo que suele salir mal: la página dice que no hay ningún modelo conectado. O falta la clave, o todavía es igual al valor de ejemplo de .env.example. Reinicia la API después de cambiarla.
Paso 9: Revisa el árabe, los temas y un móvil de verdad
Abre localhost:3030/ar. Todo el dashboard se refleja en espejo, y las pantallas del entrenador también. Cada palabra visible está en messages/<namespace>/en.json y en ar.json. Cambia el valor, conserva la clave y edita ambos archivos.
El contenido del catálogo admite exactamente dos idiomas. Un tercer idioma exige tocar las listas de idiomas, añadir archivos de mensajes y ampliar los campos de contenido de la API. Alterna entre claro y oscuro en algunas pantallas y abre después la app en un móvil real antes de invitar a los clientes.

Qué comprobar: cambia de idioma en la página de inicio de sesión y luego en algunas páginas dentro de la app, y confirma que los números, las fechas y los gráficos se siguen leyendo bien. Hazlo con los temas claro y oscuro.
Lo que suele salir mal: una etiqueta se queda en inglés porque vive en la configuración de la barra lateral en lugar de en un archivo de mensajes, o un registro nuevo del catálogo tiene un solo idioma rellenado. Rellena los dos campos en cada formulario de Content.
Paso 10: Sal a producción
Sal a producción en este orden:
- Crea un secreto fuerte con
node -e "console.log(require('crypto').randomBytes(48).toString('hex'))"y defínelo comoJWT_SECRET. - En
back-end/.envdefineNODE_ENV=production, además deCORS_ORIGINyFRONTEND_URLcon la dirección de tu dashboard, conhttps://y sin barra final. La API se niega a arrancar con un secreto vacío o de ejemplo, o con unCORS_ORIGINvacío. - Compila la API, crea sus tablas una vez con
yarn db:sync:prody arráncala. Usayarn seed:prodsi además quieres las cuentas de demostración como punto de partida. - En
dashboard/.envdefineNEXT_PUBLIC_API_BASE_URL(con/apial final) y ejecutayarn build. Estos valores se incorporan al compilar, así que un cambio no hace nada hasta que compiles de nuevo. - Cambia todas las contraseñas de demostración publicadas, o elimina las cuentas de demostración en Gym y en Coaches.
Para MySQL, crea una base de datos vacía, define DB_TYPE y DB_DATABASE y ejecuta el comando de seed o de sincronización. Por último, añade lo que la plantilla deja de tu lado: un proveedor de correo (no envía ningún email), un restablecimiento de contraseña de autoservicio y una forma de cobrar el coaching.
Qué comprobar tras salir a producción: inicia sesión en el dominio real como miembro del personal y como cliente, confirma que funciona la campana de notificaciones en vivo y que un entrenador puede enviar un mensaje a un cliente. Si las notificaciones no llegan, la dirección del socket (FRONTEND_URL) no coincide con la dirección del navegador.
Lo que suele salir mal:
- La API se niega a arrancar. Imprime una línea por problema, normalmente un
JWT_SECRETvacío o de ejemplo, o unCORS_ORIGINvacío. - Los navegadores quedan bloqueados. Copia cada dirección carácter por carácter desde la barra de direcciones del navegador, con
https://incluido y sin barra final. - Todos reciben "Too many attempts" detrás de un proxy. El inicio de sesión admite 10 peticiones por minuto por dirección, y detrás de un proxy público todos los visitantes comparten una. Define
TRUST_PROXYcon el número de proxies delante de la API.
Día a día
Una vez que Northgate está en producción, la app casi funciona sola, y los entrenadores trabajan desde una lista corta de pantallas.
La mañana del entrenador
El personal llega al resumen del entrenador, que reúne toda la lista de clientes, los clientes que se han quedado callados, los check-ins que esperan respuesta y el trabajo asignado para hoy. Para el entrenador jefe y los entrenadores personales, estos paneles se llenan con sus propios clientes. Un entrenador abre primero a los clientes inactivos, les envía un mensaje y responde a los check-ins llegados durante la noche.
El ritmo semanal
Cada cliente envía un check-in por semana con energía, peso y una nota. El entrenador responde y luego asigna los entrenamientos de la semana siguiente a fechas concretas. El cumplimiento se deduce de las sesiones que el cliente termina de verdad, así que no hay nada que marcar a mano.
Cuidar las cuentas
En Gym, el personal con el permiso adecuado ve a todos los miembros, abre la página de un miembro y restaura a uno eliminado. Eliminar a un miembro lo mueve a una lista de eliminados en lugar de borrarlo. Pulsa Ctrl+K (Cmd+K en Mac) en cualquier lugar para abrir la búsqueda, que encuentra miembros, entrenadores, roles y elementos del catálogo que tienes permiso para abrir.
Cambiar permisos
Edita un rol en la pantalla Coach Roles y el cambio llega a las personas que tienen sesión iniciada, por una conexión en vivo, sin pedirles que cierren sesión.
Mantener los datos a salvo
Con SQLite la base de datos es un archivo, y vive en un volumen de Docker si usas Compose. Con MySQL vive en tu servidor de base de datos. Uses lo que uses, programa tus propias copias de seguridad. La plantilla no las hace por ti.
Un plan de lanzamiento de ejemplo por semanas
Este es un calendario de ejemplo para Northgate, no una promesa de cuánto tardará tu proyecto. Úsalo como patrón y estíralo a tu medida.
- Semana 1, entender. Ejecuta el stack con Docker, recorre ambos roles y termina la lista de decisiones de arriba.
- Semana 2, hacerlo suyo. Aplica la marca y sustituye el catálogo de demostración por los ejercicios, entrenamientos y programas del estudio en ambos idiomas.
- Semana 3, personas y reglas. Crea las cuentas del personal, define los roles, incorpora a un puñado de clientes de prueba y recorre el ciclo completo: asignar, entrenar, hacer el check-in, responder, enviar mensajes.
- Semana 4, producción. Prepara el alojamiento, los archivos de entorno, la base de datos y el almacenamiento. Compila, crea las tablas, cambia las contraseñas y prueba en un móvil real y en árabe.
- Semana 5, lanzamiento suave. Invita a unos cuantos clientes reales y corrige lo que los haga tropezar antes de abrir a más gente.
Lista de comprobación del lanzamiento
- Nombre de marca, marca del logotipo, colores y fuentes sustituidos en ambos temas.
domain.urly los datos de contacto y enlaces debrand.config.tsapuntan a tu estudio.- Cada mensaje modificado está editado tanto en
en.jsoncomo enar.json. - Registros del catálogo rellenados en ambos idiomas.
- Cuentas de personal creadas, roles revisados, y el rol Coach con permiso de lista de clientes si lo necesita.
JWT_SECRETgenerado,NODE_ENV=production, yCORS_ORIGINyFRONTEND_URLdefinidos conhttps://.- Tablas creadas con
yarn db:sync:prod, o datos de demostración cargados y luego limpiados. - Todas las contraseñas de demostración publicadas cambiadas, o cuentas de demostración eliminadas.
- Bucket de almacenamiento conectado y dashboard recompilado con su host público.
- Un proveedor de correo y un plan de restablecimiento de contraseña preparados, ya que ninguno viene incluido.
- Una forma de cobrar a los clientes elegida, fuera de la app.
- Clave de IA añadida, o asistente dejado apagado a propósito.
- Copias de seguridad de la base de datos programadas.
- Probado en un móvil real, en árabe y en los temas claro y oscuro.
Plantilla, desde cero o una plataforma alojada
Hay tres formas honestas de conseguir un producto de coaching, y cada una intercambia tiempo, control y coste de manera distinta.
Una plataforma de coaching alojada
Te registras y empiezas. Es la ruta más rápida hacia un primer cliente. Pagas cuotas continuas, tu marca y tus flujos de trabajo se limitan a lo que el proveedor permite, y los datos de tus clientes viven en su sistema. Encaja con un entrenador independiente que quiere entrenar, no gestionar software.
Construirlo desde cero
Obtienes exactamente el producto que diseñas. Pero también construyes autenticación, roles, una lista de clientes, un registro de entrenamientos, check-ins, mensajería, traducciones y una API antes de poder dar de alta a un solo cliente. Es mucho trabajo que no tiene nada que ver con el coaching, y tú lo mantienes todo.
Partir de una plantilla
Eres dueño del código fuente, lo alojas tú y puedes cambiar lo que quieras. El ciclo de coaching, el registro y la API ya existen, así que tu esfuerzo va al contenido y a la marca. A cambio asumes el alojamiento, las actualizaciones y las carencias que enumera esta guía: sin pagos, sin email, sin integración con relojes. Encaja con un estudio o una agencia que quiere control y puede manejar un stack pequeño, o contratar a alguien que lo haga.
Cuánto cuesta mantenerlo
Los paquetes de la plantilla empiezan desde $99, y el paquete Full Stack que usa Northgate cuesta $149, con licencia comercial y soporte de por vida. Después pagas por lo que actives:
- Alojamiento para el dashboard y la API, y una base de datos si pasas de SQLite.
- Un bucket compatible con S3 como Cloudflare R2, si los clientes suben imágenes. Consulta la página de precios del propio proveedor.
- Una clave de IA de Google, OpenAI o DeepSeek, facturada por ese proveedor, solo si quieres el asistente.
- Un nombre de dominio.
El desarrollo en local no cuesta nada extra: SQLite no necesita servidor de base de datos y la demo se ejecuta en tu propia máquina. Kinora no incluye ningún proveedor de pagos, así que cobrar a los clientes significa añadir tu propia herramienta de facturación.
Qué personalizar después
- Tus programas. Sustituye los cuatro programas de demostración por las rutinas semanales del estudio, en ambos idiomas.
- Roles de entrenador. Concede
coaching.clientsa otros roles, o crea un rol para un entrenador solo de nutrición. - La barra lateral. Quita las entradas Demos de
navigationData.tscuando termines con ellas. - Color de acento. Cambia
--primaryColoral color del estudio y revisa ambos temas. - Datos de dispositivos. Apunta una app de seguimiento o un agregador a la ruta de ingesta.
- Restablecer contraseña. Añade las dos rutas de restablecimiento y un proveedor de correo para que los clientes puedan recuperar sus cuentas por sí mismos.
Errores comunes
Cambiar un valor de entorno y no ver ningún cambio
Cada valor NEXT_PUBLIC_* se incorpora al código del navegador en la compilación. Reinicia yarn dev, ejecuta yarn build de nuevo o ejecuta docker compose up --build tras cualquier cambio.
Esperar que el rol Coach muestre My Clients
Solo lo ven los roles con coaching.clients. El rol Coach del seed no lo tiene, así que concédele ese permiso o usa Personal Trainer.
Publicar con las contraseñas de demostración conocidas
Las cuentas de demostración usan contraseñas que aparecen en la documentación. Cámbialas, o empieza con las tablas vacías, antes de que alguien ajeno a tu equipo pueda acceder al sitio.
Suponer que "olvidé mi contraseña" envía un email
No lo hace. Las páginas son solo pantallas, y la plantilla no envía correo. Una cuenta del personal con el permiso adecuado puede definir la contraseña de un cliente en su página, en Gym, hasta que construyas el restablecimiento.
Dejar el dashboard con datos de ejemplo
Si ves un aviso "Sample data", el dashboard se compiló sin dirección de API. Lo que cambies se guarda en el navegador, no en la base de datos.
Preguntas frecuentes
¿Cómo creo una app de coaching fitness con Next.js?
Parte de una plantilla que ya tenga el ciclo de coaching y cambia después la marca, el catálogo y los roles. Kinora te da un dashboard en Next.js 16 para clientes y entrenadores y una API en NestJS, así dedicas tu tiempo al contenido en lugar de a la fontanería.
¿Puedo usarla para clientes?
Sí. La licencia comercial cubre un número ilimitado de proyectos, incluidos los que creas para un cliente y le entregas. No puedes revender el código fuente ni publicarlo como plantilla.
¿Admite árabe y RTL?
Sí. El inglés y el árabe vienen incluidos tanto en el dashboard como en la API, y el diseño en árabe va de derecha a izquierda, pantallas del entrenador incluidas.
¿Necesito un backend?
Para un producto real, sí. El dashboard puede funcionar solo con datos de ejemplo, pero para compartir datos entre entrenadores y clientes hace falta la API. El paquete Full Stack la incluye.
¿Se conecta a un reloj inteligente?
No directamente. No tiene ninguna integración incorporada con relojes ni pulseras. Un dispositivo o un agregador puede enviar lecturas por la ruta de ingesta con una clave personal.
¿Qué base de datos usa?
SQLite para el trabajo en local y MySQL por configuración. Cambias ajustes, no código.
¿Procesa pagos?
No. La plantilla no incluye proveedor de pagos, y la tarjeta de facturación de los ajustes muestra cifras de ejemplo. Añade tu propia herramienta de facturación si cobras a los clientes.
¿Puede un entrenador ver los clientes de otro?
No. Las rutas de la lista de clientes responden solo a la cuenta que hace la petición, y el cliente de otro entrenador devuelve una respuesta de no encontrado. El personal con el permiso de asignación puede mover miembros entre entrenadores.
¿Puedo ejecutar solo el dashboard sin la API?
Sí, para trabajo de diseño. El paquete de dashboard funciona con datos de ejemplo guardados en el navegador, y tus cambios se quedan en ese navegador. Para compartir datos necesitas la API.
¿Cómo añado un idioma además del inglés y el árabe?
Añade el código a las listas de idiomas del dashboard, copia los archivos de mensajes con el nuevo código, amplía los textos de la barra lateral y de la marca, y define la dirección si es de derecha a izquierda. La API tiene su propia lista y su propia carpeta de traducciones. El contenido del catálogo sigue guardando solo dos idiomas a menos que amplíes la API y los formularios de Content.
Pruébalo tú mismo
Abre la demo del entrenador y la demo del miembro, y después lee la documentación de Kinora o visita la página del producto Kinora. Para ver más opciones, explora las plantillas de salud y fitness o la guía de las mejores plantillas de Next.js.
Kinora es también una de las diez plantillas del Next.js Templates Bundle.
También te puede interesar

Cómo crear un LMS con clases en vivo en Next.js
Crea una plataforma de cursos con clases en vivo, cuestionarios, certificados y pago con Stripe en Next.js y NestJS. Un ejemplo paso a paso.

Cómo crear el sitio web de una agencia inmobiliaria en Next.js
Crea el sitio de una agencia inmobiliaria en Next.js con listados, solicitudes de visita y un panel de administración: instalación, roles y lanzamiento.

Cómo crear una tienda online con panel de administración en Next.js
Crea una tienda online con storefront, panel de administración y API en Next.js y NestJS, de la configuración local a Stripe y el lanzamiento. Un ejemplo.