Caso de estudio · Producto propio
Sonir
Plataforma de movilidad y delivery construida desde cero.
- Rol
- Socio · Responsable tecnológico
- Mercado
- Barinas, Venezuela
- Servicios
- Moto · Carro · Delivery
- Estado
- Pre-lanzamiento, en pruebas de campo
- Catálogo maestro
- Más de 10.000 productos
- Pago en tienda
- QR desde la billetera

01Contexto
El producto
Sonir es una plataforma venezolana de transporte —moto y carro— y delivery, que opera en Barinas.
Es un producto propio. Soy socio y responsable de toda su construcción tecnológica: desde las decisiones de producto y negocio hasta la infraestructura.
02Reto
Lo que había que resolver
Construir desde cero una plataforma que conecta pasajeros, choferes y comercios, en un mercado con sus propias reglas de dinero y de pago.
- Viajes y delivery en el mismo producto, con un único motor de despacho.
- Pagos en bolívares con el dólar como referencia, billetera propia y pago móvil bancario.
- Delivery sin que el chofer adelante dinero: el pedido se paga antes y la compra se cobra en la caja de la tienda con un QR.
- Un mercado de comercios locales: cada tienda publica su catálogo sobre un catálogo maestro compartido de más de 10.000 productos.
- Cobertura por zonas, con tarifas y tráfico propios de cada zona.
- Operación diaria desde un panel propio: verificación de identidad, soporte, incidencias y liquidaciones.
- Un asistente de voz en tiempo real dentro de la app.
03Solución
Cinco piezas, un producto
01
App del pasajero
Expo · React Native
Viajes en moto o carro, delivery de comercios locales, billetera, chat y asistente de voz.
- Viaje: destino, cotización, pago y seguimiento en vivo
- Delivery: búsqueda, carrito de una tienda, pago y seguimiento
- Billetera: recarga, retiro y métodos de pago
- Mi tienda: los dueños de comercio gestionan productos, pedidos y cobro con QR
- Asistente de voz
02
App del chofer
Expo · React Native
Recibe ofertas en tiempo real y gestiona viajes y entregas.
- Conexión con deslizador; ofertas con sonido, vibración y notificación local
- Ubicación en segundo plano mientras está en servicio
- Delivery con lista de compras y escáner QR para cobrar en la tienda
- Ganancias, retiros y liquidación de comisiones
03
Backoffice
Next.js
El panel de operación de la plataforma.
- Solicitudes y verificación de choferes
- Viajes, soporte, incidencias y conversaciones
- Comercios, catálogo maestro de más de 10.000 productos y revisión
- Zonas de cobertura dibujadas sobre el mapa
- Pagos, liquidaciones, costos y reportes
- Modo muro para pantallas de operación
- Roles: Administrador, Operaciones y Soporte
04
API
Node.js · Express · PostgreSQL
El núcleo: 21 módulos de dominio con arquitectura hexagonal.
- REST /api/v1 y tiempo real con Socket.IO
- Despacho, viajes, pedidos, billetera y liquidaciones
- Autenticación con email y Google, con tokens de refresco rotativos
- Verificación de identidad con cédula y selfie
- Catálogo con páginas públicas para compartir por WhatsApp
- Asistente de catálogo con IA y servidor MCP
05
Voz
Python · FastAPI · Gemini Live
Puente en tiempo real entre la app del pasajero y la Live API de Gemini.
- Conversación voz a voz, sin pasos separados de transcripción y síntesis
- El modelo detecta cuándo habla el usuario y permite interrumpir
- Conoce los servicios Moto, Carro y Delivery y explica los flujos de la app
04Comercios
Tiendas afiliadas
Un mercado de comercios locales: cada comercio publica su tienda sobre un catálogo maestro compartido de más de 10.000 productos.
- Cada comercio gestiona su tienda desde la app: productos, fotos, horario, pedidos y su dinero.
- Publica desde el catálogo maestro poniendo solo su precio: hereda nombre, categoría y fotos.
- O escanea el código de barras: si el producto ya está en el catálogo, solo falta el precio.
- Recibe los pedidos en vivo, confirma el monto real y cobra con un QR en su propia caja.
- Elige cómo cobra: corte semanal (3 %) o pedido a pedido (6 %).
- El acceso es por propiedad: quien gestiona la tienda es su dueño, no un rol global.
05Flujos
Cómo funciona
Pedido de delivery con pago QR
El chofer nunca pone dinero: el cliente paga antes y la compra se cobra en la caja desde su billetera.
- 01
01Pide y paga una sola vez· Cliente
Servicio más mercancía estimada; el pago recarga su saldo.
- 02
02Despacha el pedido· Sonir
Ofertas por rondas al chofer más cercano, con el nombre de la tienda.
- 03
03Compra en la tienda· Chofer
Con la lista del pedido, sin poner dinero de su bolsillo.
- 04
04Confirma el monto real· Tienda
Ajusta lo que hay y el precio final desde Mi tienda.
- 05
05Muestra el QR· Tienda
Un puntero al pedido, con un código de 6 dígitos de respaldo.
- 06
06Escanea en la caja· Chofer
Un segundo escaneo no vuelve a cobrar.
- 07
07Cobra desde la billetera· Sonir
Del saldo del cliente; si no alcanza, pide solo la diferencia.
- 08
08Pagado, en tiempo real· Sonir
Cliente, tienda y chofer lo ven al instante por socket.
- 09
09Entrega el pedido· Chofer
Con seguimiento en vivo en la app del cliente.
- 10
10Recibe su liquidación· Tienda
Corte semanal (3 %) o pedido a pedido (6 %).
Del catálogo maestro a la tienda
Más de 10.000 productos compartidos: la tienda no escribe fichas, solo pone su precio.
- 01
01Sube una lista de productos· Sonir
Hasta 500 líneas por lote.
- 02
02Propone cada ficha· IA
Claude sugiere nombre, categoría y atributos.
- 03
03Aprueba la ficha maestra· Sonir
Entra al catálogo compartido de más de 10.000 productos.
- 04
04Genera las fotos· Sonir
Una foto, cinco versiones: miniatura, tarjeta, WhatsApp, cuadrada y story.
- 05
05Publica en su tienda· Tienda
Desde el maestro o escaneando el código de barras; solo pone su precio.
- 06
06Revisa lo nuevo· Sonir
Una ficha creada fuera del maestro pasa por revisión antes de verse.
- 07
07Lo encuentra y lo pide· Cliente
Búsqueda por producto y carrito de una tienda.
- 08
08Lo comparte· Cliente
Página pública del producto con tarjeta para WhatsApp.
Viaje en moto o carro
Moto y carro comparten el mismo flujo: cambian la tarifa y el vehículo.
- 01
01Elige destino y servicio· Pasajero
Moto o carro, dentro de una zona de cobertura.
- 02
02Cotiza por kilómetro· Sonir
Tarifa vigente de la zona, con su factor de tráfico.
- 03
03Elige cómo pagar· Pasajero
Efectivo, saldo o pago móvil, que se cobra antes de crear el viaje.
- 04
04Despacha por rondas· Sonir
Ofertas que expiran, reintentos y un radio que se amplía.
- 05
05Acepta la oferta· Chofer
Con sonido, vibración y notificación, aun en segundo plano.
- 06
06Va a la recogida· Chofer
Su ubicación se ve en vivo en la app del pasajero.
- 07
07Marca la llegada· Chofer
Sonir le avisa al acercarse; al marcar arranca la espera de 5 min.
- 08
08Completa el viaje· Chofer
Cada estado del viaje llega a ambos en tiempo real.
- 09
09Liquida· Sonir
Ganancia del chofer y comisión de Sonir en el libro contable.
06Cobertura
Zonas de cobertura
La cobertura se abre por zonas, y todo se configura como datos desde el panel: nada vive en el código.
Zona metropolitana · Tarifa y tráfico propios
Casco central · Dentro de otra zona: gana la más pequeña
Comercio · Su radio de entrega
Esquema, no a escala.
- Jerarquía país → estado → zona: Venezuela (bolívares) → Barinas → zonas de cobertura.
- Cada zona es un círculo (centro y radio) que se dibuja sobre el mapa desde el backoffice.
- Las zonas pueden solaparse: gana la más pequeña, como un casco central con tarifa propia dentro de una zona metropolitana.
- Cada zona define su tráfico (factor de ruta y velocidad media) para estimar distancia y duración.
- Cada comercio tiene su radio de entrega; por omisión, la cobertura de la plataforma (15 km).
07Rol
Mi rol
Tomé las decisiones y construí las cinco piezas del producto.
- Producto
- Negocio
- Flujos
- UX/UI
- Arquitectura
- Frontend
- Backend
- Mobile
- Infraestructura
- IA
08Arquitectura
Cómo está construido
Tres clientes, una API central y un servicio de voz independiente.
Clientes
Servicios
sonir-api
Node.js · Express · Prisma
21 módulos · hexagonal + DDD
- audit
- auth
- broadcasts
- compliance
- costs
- dispatch
- drivers
- geo
- identity
- incidents
- messages
- orders
- payments
- places
- platform
- pricing
- promotions
- settlements
- support
- trips
- wallet
sonir-voice
Python · FastAPI
Servicio independiente: recibe el audio de la app y lo conecta en tiempo real con la Live API de Gemini, por WebSocket directo y sin SDK.
Datos y proveedores
- Cada módulo separa dominio, aplicación e infraestructura: la dependencia siempre apunta hacia adentro.
- El esquema de base de datos también está dividido por módulo.
- La API se despliega en Railway.
09Decisiones
Decisiones técnicas
01
Hexagonal + DDD por módulo
21 módulos con dominio, aplicación e infraestructura separados. La dependencia siempre apunta hacia adentro.
02
Dinero en enteros exactos
El tipo Money trabaja con enteros, nunca con decimales flotantes.
03
Las tarifas son datos, no código
Tarifas por kilómetro versionadas y configurables desde la operación.
04
La moneda se convierte una sola vez
La conversión entre bolívar y dólar se fija al cotizar, para que una subida del dólar no cambie lo ya acordado.
05
El banco detrás de un puerto
La integración bancaria es un adaptador intercambiable: se puede cambiar de banco sin tocar el dominio.
06
Voz en Python, sin SDK
WebSocket directo a la Live API de Gemini, sin SDK ni compresión. En Node la conexión añadía latencia.
07
IA intercambiable
El asistente de catálogo está detrás de un puerto: Claude hoy, Gemini u otro mañana.
08
Comercios por propiedad, no por rol
Quien gestiona una tienda es su dueño; el acceso no depende de un rol global.
09
El chofer no pone dinero
En delivery el pasajero paga por adelantado; el comercio confirma el monto y el chofer cobra escaneando un QR o un código de 6 dígitos.
10Complejidad
Lo difícil, y cómo se sostiene
Complejidad
- Despacho con ofertas que expiran, reintentos y un radio de búsqueda que se amplía por rondas.
- Máquina de estados del viaje con la ubicación del chofer en vivo, sobre Socket.IO con adaptador Redis.
- Billetera con libro contable, liquidaciones a choferes y pagos semanales a comercios.
- Horarios de comercios con hora de último pedido, calculados en la zona horaria de la plataforma y no en la del servidor.
- Voz en tiempo real: unos 1,3 s hasta el saludo y unos 2,5 s de respuesta tras dejar de hablar, medido en pruebas desde Barinas.
Calidad
- 489 tests automatizados en la API y 28 en el servicio de voz.
- Antes de desplegar, una verificación importa los 778 módulos compilados para detectar errores de inicialización que no aparecen en desarrollo.
- 34 migraciones de base de datos, aplicadas en cada arranque.
11Estado
Dónde está hoy
Pre-lanzamiento
- Alrededor del 85 % del producto construido, incluidos los pagos.
- Apps instaladas en teléfonos y probadas con un chofer real.
- Siguiente paso: pruebas en condiciones reales.
- Pendiente: notificaciones push con la app cerrada y la conexión con el banco Mercantil.
12Galería
Capturas de Sonir
public/images/sonir/pasajero-inicio.png
public/images/sonir/pasajero-viaje.png
public/images/sonir/pasajero-delivery.png
public/images/sonir/chofer-oferta.png
public/images/sonir/backoffice-panel.png
public/images/sonir/backoffice-muro.png
13Stack
Con qué está hecho
- Mobile
- Expo
- React Native
- TypeScript
- Mapbox
- Backoffice
- Next.js
- React
- TypeScript
- Mapbox GL
- Backend
- Node.js
- Express
- TypeScript
- Prisma
- PostgreSQL
- Redis
- Socket.IO
- Zod
- JWT
- InversifyJS
- IA y voz
- Gemini Live API
- Python
- FastAPI
- Claude Agent SDK
- MCP
- Servicios
- Railway
- Resend
- Google Sign-In
- Almacenamiento S3
- Banco Mercantil
Siguiente proyecto
SetMatch
Leonardo Tapia