
VasVoy
Viajes y delivery — Higuerote
Viajes y delivery para Higuerote, en una sola super-app
En un pueblo costero donde la movilidad se resuelve por WhatsApp, aquí hay tarifa, ruta y rastro.
Diseño de producto, arquitectura y desarrollo full-stack (Flutter + Firebase)
7 min
3,2 km
El pueblo se mueve por WhatsApp
Higuerote, municipio Brión, estado Miranda. No hay plataforma formal de transporte ni de delivery: hay chats.
Se pide por chat
Los mototaxis se coordinan por WhatsApp y llamadas: sin tarifa transparente y sin saber dónde viene el conductor.
Nadie deja rastro
Ni historial ni calificaciones, y los datos personales de todos circulando por chats privados.
El comercio no tiene canal
Los negocios locales no tienen forma de recibir pedidos ni un repartidor confiable en quien apoyarse.
El problema completo
En Higuerote no existe una plataforma formal de transporte ni de delivery. Los mototaxis se coordinan por WhatsApp y llamadas, sin tarifa transparente, sin saber dónde viene el conductor, sin historial ni calificaciones, y con los datos personales de todos circulando en chats privados. Del otro lado, los comercios locales no tienen una forma de recibir pedidos ni un repartidor confiable, y cualquier solución tipo pasarela de pagos choca con la realidad venezolana: precios que se mueven a diario con la tasa del dólar, pagos por Pago Móvil que hay que verificar a mano y ninguna infraestructura de intermediación financiera disponible para un proyecto pequeño.
La solución
Una super-app con cuatro roles bien separados sobre un mismo backend Firebase. El cliente fija origen y destino tocando el mapa, ve la tarifa calculada por kilómetros reales de la ruta, sigue a la moto en vivo y coordina por un chat efímero que se autodestruye al terminar el viaje. El conductor se registra con un flujo KYC con fotos, es aprobado por un administrador, recibe solo las carreras dentro de un radio de 8 km ordenadas por cercanía y opera con un saldo de créditos prepago. El comercio administra su carta, horarios y pedidos desde un panel propio. Y el administrador acredita recargas, aprueba conductores y comercios, y despacha deliveries desde una consola web. Las reglas de Firestore y Realtime Database, más diez Cloud Functions, sostienen las transiciones críticas: asignación atómica de carreras, cobro idempotente de comisiones y borrado automático de los chats.
Cuatro apps, un mismo mapa
Un monorepo Flutter con cuatro aplicaciones y dos paquetes compartidos, todas sobre el mismo proyecto Firebase.
App 1 de 4
Cliente
Fija origen y destino tocando el mapa, ve la tarifa calculada por kilómetros reales de la ruta, sigue a la moto en vivo y coordina por un chat efímero que se autodestruye al terminar el viaje.
Pasa el cursor por los pines del plano para cambiar de rol. Las cuatro apps comparten brio_core y brio_ui.
Seis piezas que no se pueden caer
Seguimiento en vivo sobre Realtime Database
La posición del conductor se publica en `posiciones/higuerote/{uid}` con `onDisconnect`, y el cliente ve la moto avanzar con un pulso animado sobre el mapa mientras la ruta se traza con OSRM (con respaldo offline si el servicio no responde).
Comisión prepaga que nunca falla dos veces
Las Cloud Functions `onCarreraCompletada` y `onDeliveryEntregado` descuentan la comisión dentro de una transacción que marca el pedido como cobrado. Como Cloud Functions entrega al menos una vez, sin esa marca una reentrega cobraba doble.
Chat efímero conductor↔cliente
Mensajería sobre Realtime Database con tres capas de borrado (al entregar, al cancelar y una limpieza diaria a las 3 AM). Los mensajes son inmutables por reglas y el número de teléfono viaja solo en la metadata temporal que escribe el servidor.
Dólar canónico, bolívar visible
Todos los montos se guardan en USD y se muestran en Bs con la tasa oficial que una función programada trae cada día a las 8:00 de Caracas desde una API pública, con override manual desde el panel de administración.
KYC blindado por reglas
Los documentos de identidad viven en Storage bajo `kyc/{uid}` y la colección `usuarios` dejó de ser listable: los datos del conductor que ve el pasajero se congelan en el propio pedido desde el perfil real, escritos por una Cloud Function para impedir suplantación de Pago Móvil.
Panel de comercios con máquina de estados propia
El delivery recorre pendiente → aceptado → en preparación → asignado → recogido → entregado, y el comercio marca «listo para recoger» como bandera independiente, para que el repartidor pueda ir en camino mientras la comida todavía se prepara.
Cinco pantallas, cuatro apps
Recreadas aquí en HTML y CSS con la paleta real: turquesa de agua clara, verde de palmera y un único dorado de acción por pantalla.

¡Hola, buenas! 👋
Arturo
¿A dónde vamos?
Toca el mapa y calculamos la tarifa
Mis viajes
Delivery
ÚLTIMO VIAJE
Av. Principal → Playa Los Totumos
Ayer · 3,2 km · Moto
Bs 168,00
5,0
Arepera La Costa
3 artículos · Bs 742,50
Home del cliente — «¿A dónde vamos?»
El llamado principal abre el mapa; abajo, el carrito de delivery si quedó activo.
7 min
3,2 km
Buscando tu VasVoy…
Conectando con motos cercanas en Higuerote
Mapa del cliente — buscando conductor
El radar de la hoja inferior es el mismo pulso que late en los pines de esta página.
Hola, Luis
Higuerote
Carreras cercanas (2)
Calle Bolívar #12
Playa Los Totumos
Arepera La Costa
Res. Mar Azul, torre B
Panel del conductor — carreras cercanas
Tema oscuro real de la app: toca el interruptor de disponibilidad para verlo encender.
Confirmando
Preparando tu pedido
Buscando repartidor
En camino
Entregado
Luis M. · Moto roja
A 4 min de tu dirección
Los productos se los pagas al comercio; el envío, al repartidor.
Seguimiento del delivery — cliente
Cinco pasos con conectores, contacto con el repartidor y el pago móvil del comercio con copiar en cada línea.
Arepera La Costa
Higuerote · Comida rápida
Nuevos1
2× Hamburguesa
“sin cebolla, por favor”
1× Refresco 1,5 L
Res. Mar Azul, torre B, apto 4-C
Portón azul, frente a la plaza
Pago móvil reportado · Referencia 004417832
Confirmar que me llegó
En preparación1
1× Pabellón criollo
“para llevar”
2× Tequeños (6 u.)
Calle Bolívar #12
Casa blanca, reja negra
En reparto1
3× Empanada de cazón
Playa Los Totumos, kiosco 3
Preguntar por Ana
Créditos insuficientes para la comisión estimada: recarga para aceptar nuevos pedidos.
Aceptar
Panel del comercio — cola de pedidos
La misma aplicación corre en web y en Android. El chip de abierto/cerrado se togglea al tacto — pruébalo — y el de créditos avisa cuando el saldo ya no cubre la comisión.
Cómo viaja un pedido
Seis paradas del mismo recorrido. Cada una la custodia una Cloud Function o una regla, no la buena fe del cliente.
El cliente confirma
Regla de FirestoreEl pedido nace con los precios del catálogo y una tarea programada lo expira si nadie lo toma: cada cinco minutos pasa una función revisando los que quedaron colgados.
El comercio acepta
Función · congela la baseUna función relee los precios reales en Firestore, valida las cantidades y congela ahí la base de la comisión. Si algún producto no se pudo verificar, el pedido queda marcado para revisión manual.
La cocina arranca
Bandera independiente«Listo para recoger» es una bandera aparte del estado, para que el repartidor pueda ir en camino mientras la comida todavía se prepara.
Un conductor lo toma
Transacción atómicaLa asignación escribe solo estado, conductor y marca de tiempo dentro de una transacción, para que dos conductores no puedan tomar el mismo viaje. Las reglas exigen estar aprobado y con saldo.
Va en la moto
Realtime DatabaseLa posición se publica en posiciones/higuerote/{uid} con onDisconnect y el cliente ve la moto avanzar con un pulso animado, con la ruta trazada por OSRM.
Se cobra una sola vez
onDeliveryEntregadoLa comisión se descuenta dentro de una transacción que marca el pedido como cobrado. El chat se borra al entregar, y una limpieza diaria a las 3 AM barre lo que quede.
El dinero no pasa por aquí
Sin pasarela, sin cobranza posterior y sin intermediación financiera: comisiones prepagas descontadas de un saldo de créditos.
12%
al conductor
Sobre el viaje, descontado del saldo de créditos que compró por adelantado.
10%
al comercio
Sobre los productos, calculado siempre desde la base congelada por el servidor.
0%
de intermediación
El pasajero le paga al conductor y los productos al comercio: VasVoy nunca toca ese dinero.
4
Aplicaciones Flutter (cliente, conductor, comercio, admin)
42
Pantallas implementadas
10
Cloud Functions desplegadas
7
Colecciones Firestore
12
Repositorios en el paquete core
2
Paquetes compartidos del monorepo
27.7k
Líneas de Dart
Catorce paradas ya construidas
Arrastra la cinta: cada tarjeta es una funcionalidad implementada en alguna de las cuatro apps.
Carreras con origen y destino libres: el cliente toca el mapa y la tarifa se calcula por kilómetros reales de la ruta (banderazo más costo por km, distinto para moto y carro)
Geocodificación inversa con Nominatim para mostrar direcciones reales en vez de nombres de zona genéricos
Motos cercanas en vivo en el mapa del cliente y filtro por radio de 8 km en el panel del conductor, ordenado por cercanía al punto de recogida
Onboarding del conductor en wizard de cuatro pasos con KYC, vehículo, Pago Móvil y carga de documentos desde cámara o galería
Cartera de créditos del conductor: saldo destacado, reporte de recarga por Pago Móvil e historial de movimientos
Calificación por estrellas al terminar el viaje, promediada por una Cloud Function en el documento del conductor
Catálogo de delivery con búsqueda, categorías, notas por producto, productos agotados y comercios cerrados atenuados con su motivo
Selección de dirección de entrega con pin fijo sobre mapa móvil, referencia escrita y hasta seis direcciones guardadas por usuario
Seguimiento del delivery con línea de cinco pasos, repartidor en vivo y detalle de compra con totales separados entre comercio y repartidor
Pago de productos directo al comercio: efectivo o Pago Móvil con referencia reportada por el cliente y confirmada por el negocio
Panel del comercio con cola de pedidos agrupada, alerta sonora al entrar uno nuevo, CRUD de carta con fotos, horarios por día y pestaña de créditos
Back-office web con dashboard de indicadores, acreditación de recargas en transacción idempotente, aprobación de conductores y comercios, y despacho manual de deliveries
Notificaciones push segmentadas: topic para conductores en carreras, token directo al comercio en deliveries y push por mensaje de chat con badge de no leídos
Tema claro y oscuro conmutables desde ajustes en las cuatro apps, persistidos con SharedPreferences
Un monorepo sin ciclos
4 apps
cliente · conductor · comercio · admin
brio_ui
tema, paleta, logo y widgets compartidos
brio_core
7 modelos · 12 repositorios · providers
Monorepo Flutter con dos paquetes internos y cuatro aplicaciones que dependen de ellos por path, sin ciclos: apps → brio_ui → brio_core. `brio_core` concentra siete modelos de dominio (Pedido, Comercio, Conductor, Producto, Usuario, Zona, MensajeChat), doce repositorios que exponen streams de Firestore y Realtime Database como providers de Riverpod, y las constantes de negocio; `brio_ui` define la paleta, los dos temas y los widgets compartidos, incluida la pantalla de chat. El estado es reactivo de punta a punta: las pantallas observan providers de Riverpod que envuelven snapshots en vivo, y no hay capa de caché intermedia. El backend son diez Cloud Functions v2 en TypeScript desplegadas en us-east1 (una en us-central1, porque los disparadores de Realtime Database deben correr en la región de la base): disparadores sobre documentos de pedido para notificar, congelar la base de la comisión y cobrarla, disparador de creación de mensaje para el push del chat, y tres tareas programadas que expiran pedidos cada cinco minutos, traen la tasa cada mañana y limpian los chats viejos cada madrugada. La autorización vive en las reglas: Firestore separa lo que puede escribir cada rol campo por campo con `hasOnly`, exige que el conductor esté aprobado y con saldo para tomar un pedido, y las reglas de Realtime Database validan cada hoja de mensaje para impedir suplantación. La asignación de una carrera es una transacción atómica que escribe solo estado, conductor y marca de tiempo, para que dos conductores no puedan tomar el mismo viaje.
Con qué está hecho
Aplicaciones
Backend Firebase
Servicios externos
Arquitectura del repositorio
Seis baches del camino
Cada uno se abre con lo que falló y con lo que quedó en su lugar.
Cómo se resolvió
Los neutros de la paleta pasaron de constantes a getters que leen un modo global derivado de la preferencia del usuario y del brillo de la plataforma, de modo que todas las llamadas voltean sin editar una sola pantalla. El costo fue perder la constancia en tiempo de compilación: hubo que retirar unos ciento cincuenta `const` con un script consciente de paréntesis, y aprender la regla dura de no guardar nunca esos colores en `final`, porque Dart los evalúa una vez y el tema deja de reaccionar.

La marca
Caribe costero y luminoso: turquesa de agua clara, verde de palmera y dorado de arena al atardecer sobre neutros gris pizarra. Cercano y de pueblo, pero con acabado de app seria — tipografía Nunito Sans redondeada, tarjetas blancas de esquinas suaves y un único botón dorado de acción principal por pantalla.
VasVoy (antes Brío) es una super-app de mototaxi, taxi y delivery pensada para Higuerote, en el municipio Brión del estado Miranda: un pueblo costero donde la movilidad se resuelve por WhatsApp y llamadas sueltas.
Es un monorepo Flutter con cuatro aplicaciones que comparten dos paquetes internos: la app del cliente, la del conductor, el panel del comercio y el back-office administrativo, todas sobre el mismo proyecto Firebase.
El modelo de negocio no toca el dinero del pasajero: VasVoy cobra comisiones prepagas descontadas de un saldo de créditos (12% al conductor sobre el viaje, 10% al comercio sobre los productos), lo que evita la intermediación de pagos y la cobranza posterior.
Todo el sistema está localizado a la realidad venezolana: precios canónicos en dólares mostrados siempre en bolívares a la tasa BCV que se actualiza sola cada mañana, y recargas por Pago Móvil verificadas manualmente desde el panel de administración.







VasVoy
¿Quieres algo así para tu producto?
Una super-app de movilidad y delivery pensada para un pueblo real: cuatro apps, un backend Firebase y reglas que sostienen el dinero. Si necesitas algo así —tiempo real, roles separados y cobros que no se repiten— es terreno conocido.