ProyectosProyecto para cliente

SetHub CRM — el sistema operativo de un estudio de rodaje

Un CRM web en el que un estudio del centro de Los Ángeles lo lleva todo: reservas de cuatro canales, consultas, tareas del equipo, dinero, conversaciones con los clientes y diecinueve calendarios. Los correos de las plataformas, los pagos de Stripe y los mensajes de Telegram se convierten solos en registros, el texto normal se lee sin IA, mientras que ChatGPT y Claude operan sobre los datos con los mismos permisos que las personas.

  • Next.js 16 · React 19
  • TypeScript strict
  • PostgreSQL 16 · Prisma 6 · pg_trgm
  • Stripe · Gmail · Google Calendar
  • MCP · OAuth 2.1

En cifras

43tablas y 50 migraciones: de la reserva y la liquidación de la plataforma a la grabación de una reunión
836tests automáticos en 74 archivos: cada función se prueba sobre una base Postgres temporal
26comandos para ChatGPT y Claude por MCP, y ninguno borra nada
1292entradas en el diccionario de la interfaz: todo el CRM en inglés y en ruso

El problema

Antes del CRM, el estudio vivía en una hoja de cálculo y en el correo. Las reservas de Peerspace y Giggster llegaban por correo; los pagos de la web, a Stripe; las reservas directas, en mensajes al gestor; y las consultas, por Instagram. Para contestar si el Victorian Set estaba libre el sábado había que abrir cuatro sitios. El dinero se cuadraba a mano a final de mes, los gastos personales del propietario se mezclaban con los del negocio, las tareas se perdían en los chats y los plazos se movían sin avisar. Aquí el precio de un error no es una errata, sino dos equipos de rodaje ante la misma puerta y dinero que pasa desapercibido.

Qué hay dentro

Panel del propietario: el punto de equilibrio en tiempo real

La pantalla principal muestra cuánto ha ganado el estudio este mes frente a los gastos del negocio y dónde está el punto de equilibrio. Como ingresos solo cuentan las reservas que ya han tenido lugar; las futuras confirmadas van en una línea aparte, «reservado por adelantado», para no hacer pasar lo deseado por lo ganado. Los gastos personales del propietario se guardan con una marca propia y no entran en la cuenta de resultados del negocio: solo los ve él. Debajo, el resumen por meses, la ocupación y los ingresos de cada uno de los 19 espacios y el reparto por canales.

Un solape es un rechazo, no un aviso

Una sola función comprueba los solapes en todos los puntos de entrada: el formulario, «Capture», la app, los correos de las plataformas y los comandos de IA. El estudio completo cierra los 16 sets que tiene dentro, cualquier set cierra el estudio, y la azotea y el plató del coche solo se cierran a sí mismos. Un solape intencionado solo es posible con el botón «Guardar de todos modos», y el formulario no pierde lo escrito. Los solapes que ya existen se agrupan en un bloque rojo encima de la lista de reservas. El pago se cambia con botones propios — señal, resto, devolución — y «Guardar» no lo toca.

«Capture»: cualquier mensaje se convierte en un borrador

Un texto, la foto de un recibo, un PDF, un audio, un archivo de Word: una sola ventana para todo. El texto normal lo leen reglas, sin IA: fecha, hora, importe y señal, contactos, espacio, canal, empleado y cliente conocido; lo deducido se resalta y la confianza se muestra en porcentaje. El modelo solo hace falta para lo que no es texto: voz, fotos y escaneos. El mismo mensaje de la misma persona en menos de diez minutos devuelve lo que ya se creó, en lugar de un duplicado. No se guarda nada hasta que una persona lo confirma.

El puesto del gestor: qué hacer ahora mismo

Cada consulta recibe un número SH-xxxx y avanza por etapas: nueva, en conversación, esperando señal, confirmada, completada o perdida. El nivel de atención no se guarda, se calcula: si el cliente ha respondido, «contéstale»; si la señal lleva dos días de retraso o no hay siguiente paso, todo en rojo y a la cabeza de la cola. Con la misma regla se calcula el número del menú, por eso nunca difiere de la lista. Para la vista de conjunto hay un tablero en el que las tarjetas se arrastran de una etapa a otra.

Tareas cuyos plazos no se mueven sin avisar

El plazo y el responsable los fijan el propietario y el gestor; un empleado no cambia el plazo, sino que pide moverlo con nueva fecha y motivo, y esa prohibición vive en el servidor, no en el formulario. Las tareas tienen puntos de control: el gestor los marca como cumplidos o incumplidos, el responsable escribe su explicación y lo marcado ya no se puede editar. Los recordatorios llegan una hora antes del plazo, al vencer y cada día entre las 9 y las 20, según la hora del estudio. Cada persona tiene su color, y las tareas se agrupan por responsable con el recuento «en curso · hechas».

Búsqueda tolerante a erratas en décimas de segundo

⌘K busca a la vez en clientes, reservas, consultas, tareas y gastos: por inicio de palabra, por subcadena y por similitud de trigramas con pg_trgm, así que «victorain» encuentra Victorian. Un teléfono aparece por sus cifras en cualquier formato; una fecha, escrita de cualquier forma: «11/5», «5 nov», «Nov 5»; un importe, con el signo del dólar o sin él. El resultado se abre en una ventana sobre la página: lo editado se guarda ahí mismo, lo escrito en el formulario de debajo no se pierde y los permisos son los mismos que los de la página.

Plataformas y pagos, sin intervención humana

Un script en el buzón del estudio reenvía cada cinco minutos los mensajes de Peerspace y Giggster: «reservado» se convierte en una reserva pagada con la comisión de la plataforma y lo que cobra el estudio; un cambio de fecha mueve la reserva que ya existe; una cancelación la anula; y cada liquidación se cuadra por cliente e importe. Solo se registra sola la reserva de un correo que pasa la comprobación DMARC y se ha leído entero. El pago de Stripe llega por un webhook con verificación de la firma HMAC y se convierte en una reserva con las líneas de la factura: qué ha pagado exactamente el cliente.

Notificaciones: a cada uno lo suyo, en su idioma

Cada acción queda en el registro y se convierte en líneas de notificación para quien las necesita según su rol: al gestor, las consultas nuevas; al responsable, sus tareas; al propietario, todo menos lo que hace él mismo. Las líneas se acumulan hasta que pasa un minuto sin novedades y salen en un solo correo; el push al navegador se cifra según el estándar Web Push, sin librerías de terceros; a Telegram llega un solo mensaje con un botón. El idioma por defecto es el inglés; el ruso, si la persona lo elige.

Asistentes de IA por MCP, con los permisos de una persona

ChatGPT y Claude se conectan al CRM como a un servidor MCP con acceso por OAuth 2.1: PKCE S256, lista blanca de direcciones de retorno y rotación de los tokens de actualización; reutilizar un token ya sustituido se considera un robo y corta el acceso por completo. Los 26 comandos — reservas, tareas, clientes, consultas, gastos — comprueban los mismos roles que las páginas, y ninguno borra nada. Cambiar la contraseña o el rol, o desactivar la cuenta, corta las sesiones del navegador, las llaves de los móviles y los accesos de IA.

Pantallas

Panel del propietario: el beneficio del mes frente al punto de equilibrio y el resumen por meses
Panel del propietario: el beneficio del mes frente al punto de equilibrio y el resumen por meses
Calendario del mes de los 19 espacios: los puntos son las reservas del día; a la derecha, la agenda del día elegido
Calendario del mes de los 19 espacios: los puntos son las reservas del día; a la derecha, la agenda del día elegido
Cola del gestor con la atención calculada: «el cliente ha respondido», «señal vencida», «sin siguiente paso»
Cola del gestor con la atención calculada: «el cliente ha respondido», «señal vencida», «sin siguiente paso»
Tablero de consultas: las tarjetas pasan de una etapa a otra arrastrándolas, con el importe y el siguiente paso a la vista
Tablero de consultas: las tarjetas pasan de una etapa a otra arrastrándolas, con el importe y el siguiente paso a la vista
Una petición de Instagram convertida en borrador de reserva: los campos los han leído reglas, sin IA
Una petición de Instagram convertida en borrador de reserva: los campos los han leído reglas, sin IA
Tareas por personas y categorías: lo vencido en rojo y el siguiente punto de control en la misma fila
Tareas por personas y categorías: lo vencido en rojo y el siguiente punto de control en la misma fila
⌘K: clientes y reservas con una sola búsqueda, con la coincidencia resaltada
⌘K: clientes y reservas con una sola búsqueda, con la coincidencia resaltada
Una reserva abierta en una ventana sobre el panel: se edita sin cambiar de página y sin perder lo escrito
Una reserva abierta en una ventana sobre el panel: se edita sin cambiar de página y sin perder lo escrito
Conversación con un cliente: la respuesta le llega por correo tras un par de minutos sin actividad
Conversación con un cliente: la respuesta le llega por correo tras un par de minutos sin actividad

Tecnologías

Next.js 16 con App Router y acciones de servidor, React 19 y TypeScript en modo estricto: unas 60 000 líneas contando las apps. PostgreSQL 16 con Prisma 6: 43 tablas y 50 migraciones que cada despliegue aplica al arrancar, y antes de cualquier migración se saca una copia de la base y se comprueba restaurándola. La búsqueda usa la extensión pg_trgm y consultas en SQL directo con pesos por campo. La hora se guarda siempre «según el reloj del estudio» y se compara con el «ahora» de Los Ángeles, no con el del servidor: reservas, plazos y límites del mes no se desplazan con el cambio de hora.

Los 836 tests automáticos levantan una base Postgres temporal y prueban cada función entera, desde la escritura hasta la notificación. Los permisos viven en un único módulo de roles que usan las páginas, las acciones del servidor, 73 rutas de API y los comandos de IA: un botón oculto no cuenta como protección. Correo, calendarios y pagos están conectados sin intermediarios: un script de Google en el buzón del estudio, los calendarios de Google mediante una cuenta de servicio y el webhook de Stripe con verificación de firma. El vídeo de la portada de la web lo cambia el propio estudio: el clip se comprime a H.264 en el navegador y el servidor revisa el archivo byte a byte.

¿Necesitas un CRM a la medida de tu proceso?

Cuéntanos de dónde vienen tus pedidos y dónde se pierden. Empezaremos por un solo cuello de botella — en Set Hub fueron los correos de las plataformas — y lo demás crecerá alrededor.

WhatsApp