Saltar al contenido
Leonardo Tapia
Lo que he construido

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
Logo de Sonir: Muévete. Pide. Recibe.

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

  1. 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
  2. 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
  3. 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
  4. 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
  5. 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.

  1. 01Pide y paga una sola vez· Cliente

    Servicio más mercancía estimada; el pago recarga su saldo.

  2. 02Despacha el pedido· Sonir

    Ofertas por rondas al chofer más cercano, con el nombre de la tienda.

  3. 03Compra en la tienda· Chofer

    Con la lista del pedido, sin poner dinero de su bolsillo.

  4. 04Confirma el monto real· Tienda

    Ajusta lo que hay y el precio final desde Mi tienda.

  5. 05Muestra el QR· Tienda

    Un puntero al pedido, con un código de 6 dígitos de respaldo.

  6. 06Escanea en la caja· Chofer

    Un segundo escaneo no vuelve a cobrar.

  7. 07Cobra desde la billetera· Sonir

    Del saldo del cliente; si no alcanza, pide solo la diferencia.

  8. 08Pagado, en tiempo real· Sonir

    Cliente, tienda y chofer lo ven al instante por socket.

  9. 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.

  1. 01Sube una lista de productos· Sonir

    Hasta 500 líneas por lote.

  2. 02Propone cada ficha· IA

    Claude sugiere nombre, categoría y atributos.

  3. 03Aprueba la ficha maestra· Sonir

    Entra al catálogo compartido de más de 10.000 productos.

  4. 04Genera las fotos· Sonir

    Una foto, cinco versiones: miniatura, tarjeta, WhatsApp, cuadrada y story.

  5. 05Publica en su tienda· Tienda

    Desde el maestro o escaneando el código de barras; solo pone su precio.

  6. 06Revisa lo nuevo· Sonir

    Una ficha creada fuera del maestro pasa por revisión antes de verse.

  7. 07Lo encuentra y lo pide· Cliente

    Búsqueda por producto y carrito de una tienda.

  8. 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.

  1. 01Elige destino y servicio· Pasajero

    Moto o carro, dentro de una zona de cobertura.

  2. 02Cotiza por kilómetro· Sonir

    Tarifa vigente de la zona, con su factor de tráfico.

  3. 03Elige cómo pagar· Pasajero

    Efectivo, saldo o pago móvil, que se cobra antes de crear el viaje.

  4. 04Despacha por rondas· Sonir

    Ofertas que expiran, reintentos y un radio que se amplía.

  5. 05Acepta la oferta· Chofer

    Con sonido, vibración y notificación, aun en segundo plano.

  6. 06Va a la recogida· Chofer

    Su ubicación se ve en vivo en la app del pasajero.

  7. 07Marca la llegada· Chofer

    Sonir le avisa al acercarse; al marcar arranca la espera de 5 min.

  8. 08Completa el viaje· Chofer

    Cada estado del viaje llega a ambos en tiempo real.

  9. 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

App del pasajeroExpo · React Native
App del choferExpo · React Native
BackofficeNext.js

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

PostgreSQL 17
Redisadaptador de Socket.IO
Mapboxrutas
Resendemail
Almacenamiento S3documentos
Google Sign-In
Claude Agent SDKasistente de catálogo
Banco Mercantilpago móvil · en integración
Gemini Live APIvoz a voz
  • 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

  1. 01

    Hexagonal + DDD por módulo

    21 módulos con dominio, aplicación e infraestructura separados. La dependencia siempre apunta hacia adentro.

  2. 02

    Dinero en enteros exactos

    El tipo Money trabaja con enteros, nunca con decimales flotantes.

  3. 03

    Las tarifas son datos, no código

    Tarifas por kilómetro versionadas y configurables desde la operación.

  4. 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.

  5. 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.

  6. 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.

  7. 07

    IA intercambiable

    El asistente de catálogo está detrás de un puerto: Claude hoy, Gemini u otro mañana.

  8. 08

    Comercios por propiedad, no por rol

    Quien gestiona una tienda es su dueño; el acceso no depende de un rol global.

  9. 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

[POR COMPLETAR]

public/images/sonir/pasajero-inicio.png

App del pasajero · inicio
[POR COMPLETAR]

public/images/sonir/pasajero-viaje.png

App del pasajero · viaje en curso
[POR COMPLETAR]

public/images/sonir/pasajero-delivery.png

App del pasajero · delivery
[POR COMPLETAR]

public/images/sonir/chofer-oferta.png

App del chofer · oferta
[POR COMPLETAR]

public/images/sonir/backoffice-panel.png

Backoffice · panel
[POR COMPLETAR]

public/images/sonir/backoffice-muro.png

Backoffice · modo muro

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