Migración del codebase de un SaaS de flotas multi-tenant
Un SaaS de gestión de flotas y despacho para las empresas de transporte de obra: las que mueven áridos, tierra de excavación y residuos entre obras. Entré como ingeniero senior para dirigir la migración del codebase, white-label a través de una agencia asociada: cuatro años de trabajo constante con clientes ya habían demostrado que el producto funcionaba. Lo que le faltaba era una plataforma capaz de seguirle el ritmo.
Anonimizado bajo NDA: el producto aparece aquí como «Atlas Fleet» y el tenant que se muestra es ficticio.
El problema
El sistema que me pidieron reemplazar daba servicio a veinte empresas cliente: trabajo real y regulado, con exportaciones a Sage, captura desde la báscula, codificación EWC para residuos regulados y comprobantes en PDF con proof-of-delivery. No era un prototipo.
Lo que lo frenaba era estructural. Dar de alta al cliente número veintiuno significaba otro deploy, y cada arreglo común había que propagarlo veinte veces. El diseño que llevó el producto hasta veinte clientes hacía que el veintiuno saliera caro. Cada cliente corría sobre su propia base de datos, su propia rama de git y su propia carpeta de assets compilados.
kestrel.atlasfleet.app · /login
Qué construí
La migración del codebase a Laravel 13 y PHP 8.4 se cerró en menos de cuatro meses: una parte de oficina para planificación y cumplimiento y una app de campo para los conductores; los workflows que el producto había acumulado en cuatro años pasaron intactos.
El cambio de fondo es una sola base de datos compartida: cada registro lleva una cuenta, cada tenant se queda dentro de sus propios datos y el subdominio decide a quién pertenece cada petición.
Siguió siendo un monolito modular a propósito: un solo esquema multi-tenant, queue workers bajo Supervisor y acceso por rol hasta el conductor que entra con un token PIN.
kestrel.atlasfleet.app · /dashboard
Planificación por semana, vehículo a vehículo
El corazón operativo de la parte de oficina es un grid de planificación de semana por vehículo.
Los camiones propios aparecen por matrícula, los subcontratistas por su código y los trabajos que aún no tienen vehículo se quedan en una fila ámbar, junto a las revisiones diarias de seguridad, cuyos defectos suben al dashboard de arriba.
kestrel.atlasfleet.app · /operations/planning
Qué usan los conductores
Una app en React Native, en la que los conductores de los subcontratistas entran con un token PIN, sin cuenta. El conductor arranca un transporte eligiendo el grado de carga del camión y lo cierra con un número de comprobante, una foto y una firma; también ve cuántas toneladas quedan por mover en el proyecto.
kestrel.atlasfleet.app · driver-app
Qué cambió
- Una sola base de datos, no una por cliente: todo acotado por cuenta dentro de un solo esquema, en vez de veinte conexiones con nombre.
- Una sola rama, no una por cliente: se acabó propagar cada arreglo común por veinte ramas.
- Onboarding: de un deploy a una fila de datos: un servidor, un certificado, una base de datos, una rama.
¿Tienes un codebase que migrar?
Cuéntame qué está crujiendo y cuánto ha crecido. A veces la respuesta es una migración completa; a menudo es un solo cuello de botella que puedes quitar sin ella.