MS CRM | Automata
secciones (9)
$ cd .. // volver a proyectos
automata@latam: ~/proyectos/ms_crm
CASO DE USO · slug: ms_crm ·2026 · 2 min read · 524 words

> MS CRM

// CRM bilingue a medida: contactos, organizaciones, timeline de interacciones, segmentos dinamicos y estaticos, todo sobre Laravel + Livewire.

Laravel 12Livewire 3Flux UIMySQL 8FortifyTailwind 4
forks last commit
MS CRM
▸ rol
Full-stack · Laravel · Livewire
▸ equipo
Solo
▸ status
online
// section 01 · descubrimiento

$ cat ./descubrimiento.md

▸ descripcion

CRM para equipos chicos armado sobre tres conceptos: una Organizacion (empresas, ONGs, entes de gobierno, comunidades), los Contactos dentro de ella, y las Interacciones registradas contra cualquiera de los dos. Encima viven los Segmentos de Audiencia (listas estaticas o queries dinamicas) y las Campañas. La UI renderea en server con Livewire 3 + Flux, corre en español o ingles, y soporta 2FA via Laravel Fortify. Todos los registros tienen soft deletes y created_by/updated_by para auditoria.

▸ problema

Los CRM listos atan al equipo a un SaaS por seat (Hubspot, Pipedrive) o son demasiado genericos como para modelar la triada contacto ↔ organizacion ↔ interaccion que el equipo realmente usa. El tradeoff de hacerlo a medida se paga con una UI que calza con el flujo y soporte bilingue de fabrica.

▸ audiencia

ONGs, entes de gobierno, organizaciones sin fines de lucro y empresas con base comunitaria que trackean relaciones a nivel organizacion mas que leads individuales.

// section 03 · arquitectura

$ cat ./arquitectura.md

// section 04 · infraestructura

$ cat ./infraestructura.md

▸ servicios
provider: Laravel + MySQL + Vite
  • App Laravel 12 (componentes Livewire + Flux UI)
  • MySQL 8 (organizations, contacts, interactions, segments, campaigns, activities)
  • Laravel Fortify (auth + 2FA)
  • Vite dev server (HMR)
  • Laravel Pail (logs en tiempo real)
  • Locales en español + ingles (español por defecto)
// section 05 · implementacion

$ cat ./implementacion.md

▸ frontend
  • · Livewire 3 + Volt 1.7
  • · Flux UI
  • · Tailwind CSS 4
  • · Alpine.js
  • · Vite
▸ backend
  • · Laravel 12
  • · PHP 8.2
  • · Laravel Fortify 1.30
▸ datos
  • · MySQL
  • · Eloquent + soft deletes
  • · Columnas JSON para tags + custom_fields
▸ devops
  • · Dev local con concurrently (artisan + queue + pail + vite)
// section 06 · desafios tecnicos

$ cat ./challenges/*.md

// 1 problemas tecnicos resueltos

01 / 01
challenge-01.md · modelado · auditoria · soft-deletes
▸ problema

Registrar interacciones contra un Contacto o contra una Organizacion sin forzar a pasar por uno u otro.

restriccion: Algunas interacciones son con una persona especifica (una llamada a un contacto); otras son con la org entera (una reunion sin asistente nombrado). Las dos tienen que aparecer en el mismo timeline ordenado por fecha.

▸ enfoque

Interaction tiene contact_id Y organization_id nulleables, mas type (email/llamada/reunion/nota/evento). El query del timeline es un scope Eloquent que hace left-join a los dos y proyecta una fila unificada. created_by + updated_by los llena un observer auth-aware para que la auditoria no requiera escrituras extra.

app/Models/Contact.php php
class Contact extends Model
{
    use HasFactory, SoftDeletes;

    protected $fillable = [
        'first_name', 'last_name', 'email', 'phone',
        'position', 'organization_id',
        'tags', 'custom_fields',
        'status', 'source', 'created_by',
    ];

    protected $casts = [
        'tags'          => 'array',
        'custom_fields' => 'array',
        'created_at'    => 'datetime',
        'updated_at'    => 'datetime',
        'deleted_at'    => 'datetime',
    ];
}
// section 07 · testing & ci

$ cat ./testing.md

▸ estrategia

Pest 4 sobre SQLite in-memory. Unit tests para relaciones de modelo; feature tests para flujos de componentes Livewire (crear contacto → asignar organizacion → registrar interaccion).

▸ herramientas
Pest 4.3PHPUnitPest Laravel plugin
// section 09 · resultados

$ cat ./resultados.md

01 /
7
modelos Eloquent (Contact, Organization, Interaction, Activity, Campaign, Segment, User)
02 /
10
componentes Livewire (dashboard + CRUD de contactos y orgs)
03 /
10
migrations
04 /
2
seeders (5 orgs / 8 contactos / 10 interacciones en CRMSeeder)
▸ outcomes

Listo para produccion. CRUD core, dashboard con stats, UI bilingue y 2FA estan activos. Roadmap: API REST, exports PDF/Excel, integracion de email y capa de roles/permisos.

// section 10 · lecciones

$ cat ./lessons.md

// si lo hiciera de nuevo

  • 01 /

    El modelado le gana a la UI en un CRM

    El instinto era empezar por la pantalla de lista de contactos. En la practica, el upside vino de acertar primero con la triada Organizacion/Contacto/Interaccion — una vez que esos FK quedaron nulleables donde correspondia, cada pantalla termino siendo un query delgado encima.

// relacionados

$ grep -l "tech" ./projects/*

// proyectos que comparten parte del stack

// siguiente paso

$ automata deploy --tu-operacion

// Conversemos sobre como adaptamos esto a tu caso.

./contactar.sh