El problema
Un servicio de taxi que recibe reservas desde una app necesita mucho más que un formulario de reserva. Tiene que encontrar un conductor libre cerca, ofrecerle el viaje, esperar una respuesta y pasar al siguiente si nadie acepta, todo en cuestión de segundos. Roma añade sus propias reglas: tarifas fijas aprobadas por el ayuntamiento para los trayectos desde y hacia los aeropuertos y el puerto. El cliente necesitaba toda la cadena, desde la asignación hasta el pago.
Lo que construí
Construí una plataforma de reservas y asignación en tiempo real con un único backend, tres apps móviles y un panel web de administración.
- Motor de asignación — busca conductores aprobados y disponibles que hayan enviado su posición en los últimos 60 segundos, dentro de un radio de búsqueda (8 km por defecto). Ordena hasta 10 de ellos según el tiempo real de conducción con el tráfico actual, calculado por Google, y ofrece el viaje a un conductor cada vez, con 20 segundos para aceptar.
- Reglas tarifarias de Roma — el servicio de precios reconoce 9 lugares clave, como el aeropuerto de Fiumicino y el centro histórico. Aplica las 12 tarifas fijas establecidas por Roma Capitale (resolución 252/2024). Los demás trayectos se calculan a partir de la ruta de Google, con suplementos por equipaje y por pasajeros.
- Tres apps — una app para pasajeros, una para conductores y una app para la tableta del vehículo que muestra la ruta y banners de socios. Todas están hechas con React Native y Expo, para Android y la web.
- Seguimiento en directo y llamadas — Socket.IO envía las posiciones de los conductores y el estado del viaje. Pasajero y conductor pueden llamarse dentro de la app mediante WebRTC, sin ver el número de teléfono del otro.
- Pagos — Stripe con webhooks con firma verificada, y pedidos de PayPal. Las claves de pago se configuran en el panel de administración y se guardan cifradas.
- Alta de conductores — los conductores suben su licencia, sus documentos y una foto. Un administrador los aprueba antes de que puedan conectarse.
- Patrocinadores y cupones — un portal de patrocinadores con tres planes y cupones con seguimiento antifraude, además de viajes programados y valoraciones.
Con qué está hecho
El backend funciona con Node.js 22, TypeScript, Express y Socket.IO. Los datos están en MariaDB/MySQL, y el esquema ha crecido a lo largo de 24 migraciones SQL versionadas. Zod valida las entradas; el inicio de sesión usa JWT y el acceso con Google. Google Maps se encarga de las rutas, los tiempos de viaje y la geocodificación. Las apps usan Expo y React Native.
Por qué se hizo así
Dos pasajeros nunca deben recibir el mismo conductor. Cuando un conductor acepta, el motor lo reserva con una única actualización condicional: ocupado, pero solo si sigue disponible. Si no cambia ninguna fila, el conductor acaba de ser asignado a otro viaje y la carrera pasa al siguiente candidato. Los candidatos se ordenan por tiempo de conducción, no por distancia en línea recta, porque en Roma el coche más cercano a menudo no es el más rápido. Si Google no responde, la ordenación vuelve a basarse en la distancia.


