← Volver a los proyectos
Inmobiliario y plataformas corporativas Caso de estudio

CRM personal para freelance — Gestión de clientes, proyectos, tareas y analítica

Un sistema CRM propio para gestionar la actividad freelance: clientes, proyectos, tareas, seguimiento del tiempo, cálculo automático del coste del trabajo, analítica sobre ingresos, leads y ofertas de empleo. Stack: Symfony, Vue, PostgreSQL, Redis, ElasticSearch, RabbitMQ.

Tecnologías 8
PHP
JavaScript
Symfony
Vue.js
PostgreSQL
Elasticsearch
Redis
RabbitMQ
CRM personal para freelance — Gestión de clientes, proyectos, tareas y analítica
Proyecto destacado ↗

Sobre el proyecto

Un sistema CRM propio, desarrollado para gestionar mi actividad freelance. En el sistema gestiono clientes, creo para ellos proyectos y tareas, registro el tiempo en las tareas y el sistema calcula automáticamente el coste del trabajo realizado. Los datos se agregan por tarea, proyecto y cliente, lo que ofrece una imagen completa de los ingresos en todos los niveles.

Para la analítica hay un dashboard dedicado con gráficos y diagramas: puedo consultar los datos de cada día — qué tareas se realizaron, con qué proyectos y clientes trabajé y cuánto gané por día, semana o mes. Además, el CRM incluye módulos de analítica de leads y de ofertas de empleo: puedo gestionar leads con atributos (frío/caliente, fuente, etc.) y seguir la conversión en clientes, así como gestionar ofertas de empleo con estados y fuentes para analizar la relevancia de los puestos respecto a mis habilidades, el éxito en las entrevistas y los canales de búsqueda más eficaces.

El sistema está construido sobre Symfony (backend), Vue (frontend), PostgreSQL (base de datos principal), Redis (caché y sesiones), ElasticSearch (búsqueda y analítica) y RabbitMQ (procesamiento asíncrono).

CRM personal para freelance

Un sistema CRM propio, desarrollado para gestionar mi actividad freelance. En el sistema gestiono clientes, creo para ellos proyectos y tareas, registro el tiempo en las tareas y el sistema calcula automáticamente el coste del trabajo realizado.

Los datos se agregan por tarea, proyecto y cliente, lo que ofrece una imagen completa de los ingresos en todos los niveles. Como un cliente puede tener varios proyectos, la agregación se realiza tanto por proyecto como por cliente en su conjunto.

Para la analítica hay un dashboard dedicado con gráficos y diagramas: puedo consultar los datos de cada día — qué tareas se realizaron, con qué proyectos y clientes trabajé y cuánto gané por día, semana o mes.

Además, el CRM incluye módulos de analítica de leads y de analítica de ofertas de empleo:

  • Leads: alta de leads con atributos (frío/caliente, fuente, etc.), seguimiento de estados y conversión en clientes. Una pestaña dedicada en el dashboard muestra cuántos leads se adquirieron, sus estados y cuántos se convirtieron en clientes. Esto permite analizar el rendimiento de adquisición de leads y ajustar las acciones.
  • Ofertas de empleo: gestión de puestos con estados y fuentes, análisis de la relevancia de los puestos respecto a mis habilidades y del éxito en las entrevistas. Una pestaña dedicada en el dashboard ayuda a entender si estoy buscando correctamente los puestos, qué canales funcionan mejor y cómo ajustar mi comportamiento en las entrevistas.

Mi rol en el proyecto

Desarrollador full-stack y autor del proyecto: diseño de la arquitectura, desarrollo backend en Symfony, frontend en Vue, configuración de la infraestructura (PostgreSQL, Redis, ElasticSearch, RabbitMQ).

Stack tecnológico

  • Backend: Symfony (PHP)
  • Frontend: Vue.js
  • Base de datos: PostgreSQL
  • Caché y sesiones: Redis
  • Búsqueda y analítica: ElasticSearch
  • Colas: RabbitMQ

Tareas clave

  • Diseño del modelo de dominio: clientes, proyectos, tareas, tiempo, tarifas
  • Seguimiento del tiempo en tareas y cálculo automático del coste del trabajo
  • Agregación de datos por tarea, proyecto y cliente
  • Dashboard con gráficos y diagramas para la analítica de ingresos
  • Módulo de analítica de leads con atributos y conversión
  • Módulo de analítica de ofertas de empleo con estados y fuentes
  • Procesamiento asíncrono de eventos mediante RabbitMQ
  • Búsqueda sobre los datos mediante ElasticSearch
  • Caching y optimización de la salida mediante Redis

Resultado

Un CRM personal plenamente funcional que cubre la gestión de clientes, proyectos y tareas, automatiza el cálculo de ingresos y ofrece analítica sobre ingresos, leads y ofertas de empleo. El sistema ayuda a tomar decisiones basadas en datos: qué canales de adquisición de leads son eficaces, qué puestos son relevantes y cuánto se ganó por día, semana o mes.

Lo que entregué

01

Era necesario diseñar un modelo que conecte clientes, proyectos, tareas, seguimiento del t...

El desafío

Era necesario diseñar un modelo que conecte clientes, proyectos, tareas, seguimiento del tiempo y tarifas, de modo que los datos se agreguen correctamente en todos los niveles sin duplicaciones.

Solución

  • Diseño de las entidades: Cliente → Proyecto → Tarea → Registro de tiempo → Cálculo de coste.
  • Definición de relaciones y reglas de comportamiento en cascada.
  • Inclusión de flexibilidad en las tarifas (por hora, fija, por proyecto).
  • Implementación de migraciones e índices en PostgreSQL.

Resultados

  • Modelo de dominio limpio y extensible.
  • Agregación correcta de datos por tarea, proyecto y cliente.
  • Base para la analítica y el reporting.

02

Era necesario registrar cómodamente el tiempo en las tareas y calcular automáticamente el...

El desafío

Era necesario registrar cómodamente el tiempo en las tareas y calcular automáticamente el coste del trabajo realizado, sin cálculos manuales ni errores.

Solución

  • Implementación del seguimiento del tiempo vinculado a una tarea y una fecha.
  • Cálculo automático del coste basado en la tarifa y el tiempo empleado.
  • Recálculo al modificar la tarifa o el tiempo.
  • Traslado de los recálculos pesados a tareas asíncronas mediante RabbitMQ.

Resultados

  • Cálculo automático y preciso de los ingresos.
  • Historial transparente de tiempo y coste por tarea.
  • Sin cálculos manuales.

03

Los importes por el trabajo debían estar disponibles en varios niveles: por tarea, por pro...

El desafío

Los importes por el trabajo debían estar disponibles en varios niveles: por tarea, por proyecto, por cliente. Un cliente puede tener varios proyectos y un proyecto muchas tareas.

Solución

  • Implementación de la agregación de datos a nivel de tarea, proyecto y cliente.
  • Recálculo de los agregados ante cambios (tiempo, tarifas, estados).
  • Caching de los agregados en Redis para una entrega rápida.
  • Garantía de la consistencia de los datos entre niveles.

Resultados

  • Datos completos de ingresos en todos los niveles.
  • Entrega rápida de los agregados gracias al caching.
  • Visión unificada de clientes y proyectos.

04

La analítica requería un dashboard visual con gráficos y diagramas que mostrara los datos...

El desafío

La analítica requería un dashboard visual con gráficos y diagramas que mostrara los datos diarios: qué tareas se realizaron, con qué proyectos y clientes y cuánto se ganó por día, semana o mes.

Solución

  • Implementación de agregaciones backend para intervalos temporales (día/semana/mes).
  • Construcción del frontend en Vue con gráficos y diagramas.
  • Adición de filtros por clientes, proyectos y periodos.
  • Optimización de consultas y caching de agregados pesados.

Resultados

  • Analítica visual de ingresos por día, semana y mes.
  • Acceso rápido a los datos por clientes y proyectos.
  • Base para decisiones basadas en datos.

05

Los leads debían gestionarse con atributos (frío/caliente, fuente, etc.) y era necesario a...

El desafío

Los leads debían gestionarse con atributos (frío/caliente, fuente, etc.) y era necesario analizar cuántos leads se adquirieron, sus estados y cuántos se convirtieron en clientes.

Solución

  • Implementación de un CRUD para leads con atributos flexibles.
  • Adición de estados y fuentes de adquisición.
  • Implementación de la conversión lead → cliente.
  • Construcción de una pestaña dedicada a la analítica de leads en el dashboard.

Resultados

  • Embudo de leads transparente y conversión en clientes.
  • Comprensión de los canales de adquisición más eficaces.
  • Posibilidad de ajustar las acciones de adquisición de leads.

06

Los puestos debían gestionarse con estados y fuentes y era necesario analizar la relevanci...

El desafío

Los puestos debían gestionarse con estados y fuentes y era necesario analizar la relevancia de los puestos respecto a mis habilidades y el éxito en las entrevistas.

Solución

  • Implementación de un CRUD para puestos con estados y fuentes.
  • Adición del seguimiento de fases: candidatura → entrevista → resultado.
  • Construcción de una pestaña dedicada a la analítica de puestos en el dashboard.
  • Adición de analítica sobre canales de búsqueda y éxito en entrevistas.

Resultados

  • Comprensión de si estoy buscando correctamente los puestos.
  • Datos sobre los canales más eficaces para encontrar puestos.
  • Posibilidad de ajustar el comportamiento en las entrevistas.

07

Los recálculos de agregados, las actualizaciones de analítica y los cálculos de coste son...

El desafío

Los recálculos de agregados, las actualizaciones de analítica y los cálculos de coste son operaciones pesadas que no pueden ejecutarse de forma síncrona en el ciclo HTTP sin perder capacidad de respuesta.

Solución

  • Diseño de colas de eventos para cambios de tiempo, tarifas y estados.
  • Implementación de workers con Symfony Messenger + RabbitMQ.
  • Adición de políticas de retry, dead-letter queue y monitoreo.
  • Garantía de idempotencia de los handlers.

Resultados

  • Respuesta rápida de la interfaz independientemente de las operaciones en segundo plano.
  • Resiliencia a fallos y picos de carga.
  • Procesamiento escalable de eventos.

08

La búsqueda rápida sobre clientes, proyectos, tareas, leads y puestos, junto con una analí...

El desafío

La búsqueda rápida sobre clientes, proyectos, tareas, leads y puestos, junto con una analítica flexible, requerían un motor de búsqueda especializado en lugar de consultas SQL pesadas.

Solución

  • Configuración de índices de ElasticSearch para las entidades clave.
  • Implementación de la sincronización de datos mediante eventos de RabbitMQ.
  • Adición de consultas de búsqueda con filtros y agregaciones.
  • Optimización de mappings y reindexación.

Resultados

  • Búsqueda rápida sobre todas las entidades del CRM.
  • Analítica flexible para los dashboards.
  • Reducción de la carga sobre PostgreSQL.

09

El dashboard y los agregados por clientes, proyectos y tareas son datos solicitados con fr...

El desafío

El dashboard y los agregados por clientes, proyectos y tareas son datos solicitados con frecuencia, costosos de recalcular cada vez.

Solución

  • Introducción del caching de datos calientes y agregados en Redis.
  • Configuración de la invalidación de caché mediante eventos (cambios de tiempo, tarifas, estados).
  • Uso de Redis para sesiones y bloqueos distribuidos.
  • Adición de monitoreo hit/miss y tiempos de respuesta.

Resultados

  • Entrega rápida del dashboard y de los agregados.
  • Reducción de la carga sobre PostgreSQL.
  • Funcionamiento estable bajo carga.

10

Para la analítica y la resolución de disputas, todos los cambios en clientes, proyectos, t...

El desafío

Para la analítica y la resolución de disputas, todos los cambios en clientes, proyectos, tareas, leads y puestos debían ser trazables.

Solución

  • Diseño de un esquema de audit log vinculado a entidad, usuario y acción.
  • Implementación de la escritura asíncrona de la auditoría mediante RabbitMQ.
  • Adición de herramientas de búsqueda y exportación de audit logs (ElasticSearch).
  • Garantía de inmutabilidad de los registros.

Resultados

  • Auditoría completa de los cambios en el CRM.
  • Resolución rápida de disputas.
  • Base para la analítica de comportamiento.

11

El CRM se utiliza a diario y los fallos en colas, indexación o caché son críticos para el...

El desafío

El CRM se utiliza a diario y los fallos en colas, indexación o caché son críticos para el seguimiento del tiempo y los ingresos.

Solución

  • Configuración de la recolección de métricas sobre RabbitMQ, Redis, ElasticSearch y PostgreSQL.
  • Implementación de alertas ante anomalías (crecimiento de la DLQ, retrasos de indexación, errores de workers).
  • Adición de dashboards para monitorizar el estado del sistema.
  • Integración del logging de operaciones críticas.

Resultados

  • Detección y reacción rápidas ante incidentes.
  • Reducción de los tiempos de inactividad.
  • Transparencia del estado del sistema.

Tecnologías y temas

Etiquetas del proyecto

#Symfony #PHP #Vue.js #PostgreSQL #Redis #ElasticSearch #RabbitMQ #CRM #Freelance #Seguimiento del tiempo #Analítica #Dashboard #Gestión de leads #Seguimiento de puestos #Symfony Messenger #Procesamiento asíncrono #High Load #REST API #Audit Logging
04
Iniciar un proyecto

¿Necesita un enfoque técnico similar?

Analicemos su proyecto, la arquitectura y el mejor stack tecnológico para él.

Hablemos ↗