Designo Studio CRM
CRM interno · web
CRM interno de una agencia de marketing: área comercial, proyectos, tareas y presupuestos en una sola aplicación. Fui el principal contribuidor del frontend.


El proyecto
Reúne en una sola aplicación web el trabajo diario de una agencia de marketing: seguimiento comercial, clientes, proyectos, tareas, presupuestos y contenidos, con permisos por rol.
Designo Studio es una agencia de marketing digital de Valencia. Durante mis prácticas de DAM formé parte del equipo de cuatro desarrolladores que construyó su CRM interno: la herramienta con la que el equipo comercial registra llamadas y oportunidades, y con la que la agencia organiza clientes, proyectos, tareas, presupuestos y contenidos.
El frontend es una única aplicación React Native + Expo desplegada como web; el backend, una API REST en NestJS sobre PostgreSQL. Ambas piezas se publican en un VPS desde GitHub Actions, con la API en contenedores Docker.
Funcionalidades principales
- Registro de llamadas comerciales con filtros, búsqueda y contadores
- Presupuestos con plantillas y exportación a PDF
- Tareas en lista, tablero Kanban, calendario y cronograma
- Clientes, servicios contratados y proyectos
- Guiones de vídeo, blog y material comercial
- Chat interno, informes y facturación
Mi aportación
Fui el principal contribuidor del frontend y responsable de varios módulos de la API. La autenticación, la gestión de clientes y proyectos, la facturación, los informes, el chat y la configuración inicial del despliegue son, sobre todo, trabajo de mis compañeros.
Área comercial
Registro de llamadas con filtros avanzados, búsqueda y contadores por resultado; alta guiada con selector de sector y municipio y aviso de duplicados por empresa o teléfono. Presupuestos con plantillas y exportación a PDF, comisiones por servicio, guiones comerciales y casos de éxito con subida de imágenes.
Tareas y planificación
Vistas de lista, tablero Kanban, calendario y cronograma de proyecto, con prioridades, fechas límite y redes sociales asociadas a cada tarea.
Capa de datos del cliente
Un cliente HTTP tipado, con token configurable, gestión centralizada del 401 y errores normalizados, y los hooks de TanStack Query sobre los que se apoya toda la aplicación.
Módulos de la API
Presupuestos y plantillas, comisiones, registros comerciales, guiones, guiones de vídeo y blog: entidades TypeORM, DTOs validados, servicios y controladores documentados con Swagger. También las reglas de las tareas: prioridad, validación de fecha límite y quién puede editar qué.
Contenido y experiencia de uso
Gestión de guiones de vídeo por escenas y de entradas de blog, búsqueda global con atajos de teclado, avisos, estados de carga con esqueletos y adaptación de las pantallas a móvil.
Mantenimiento del despliegue
Ajustes del pipeline de GitHub Actions que publica en el VPS: paso a Node 22, versión fija de pnpm y corrección de la recarga de nginx.
- commits del frontend
- 158 / 393 (40 % del total)
- commits de la API
- 59 / 305 (19 % del total)
- del código actual del frontend
- > 50 %
- personas en el equipo
- 4
Commits sin fusiones en la rama principal, según el historial de Git.
Decisiones técnicas
Una interfaz que no espera al servidor
Al editar una tarea, la caché de TanStack Query se actualiza al instante. Antes se guarda una instantánea de las listas afectadas y, si la API rechaza el cambio, se restaura. Al terminar se invalidan las consultas relacionadas para reconciliar con el servidor. Tareas, proyectos y registros se refrescan además cada 3 s mientras la pestaña está en primer plano.
Permisos en dos capas
Un trabajador solo puede editar o completar sus propias tareas. La interfaz lo explica con un aviso en lugar de fallar en silencio, y el servicio de NestJS vuelve a comprobarlo y responde 403 a quien se salte la interfaz.
Un presupuesto, dos plataformas
El documento se genera a partir de una plantilla HTML propia. En móvil,
expo-printlo convierte en PDF y se comparte con el diálogo nativo; en web se abre listo para imprimir o guardar.Errores de base de datos que se entienden
Al crear un presupuesto, las violaciones de clave foránea, unicidad o nulos de PostgreSQL se traducen en respuestas 400 con un mensaje útil, en lugar de un 500 genérico.
Evolución
Mar 2026
Primeros módulos de la API (registros y trabajadores) y documentación Swagger. En el frontend, inicio de sesión, navegación lateral, panel con calendario y tareas.
Mar 2026
Área comercial: registros de llamadas, guiones y casos de éxito.
Abr 2026
Filtros avanzados, diseño adaptable, capa de datos con TanStack Query, comisiones y presupuestos.
May 2026
PDF de presupuestos, permisos por rol, perfil de cliente con avatar, guiones de vídeo, tablero Kanban y estados de carga.
Jun – Ago 2026
Gestión del blog, aviso de duplicados y ajustes posteriores a las prácticas.
Stack
Frontend
- React Native
- Expo Router
- TypeScript
- TanStack Query
- React Hook Form
- Zod
API
- NestJS
- TypeORM
- PostgreSQL
- JWT
- Swagger
Infraestructura
- Docker Compose
- GitHub Actions
- VPS + nginx
Capturas
Pantalla de acceso. Tablero Kanban, una de las cuatro vistas de tareas. Calendario con las tareas por fecha límite y prioridad.
Capturas de una copia local con tareas de demostración. Solo se muestran pantallas sin datos de terceros: el acceso, el panel de inicio y las vistas de tareas. Las que gestionan clientes, contactos o importes no se publican.