VasVoy
VasVoy — isotipo

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.

Movilidad y delivery · Super-app multi-rol2026

Diseño de producto, arquitectura y desarrollo full-stack (Flutter + Firebase)

Fase 1 completa y backend desplegado; delivery y app de comercios implementados, pendiente prueba en dispositivo end-to-end

7 min

3,2 km

Empieza el recorrido
01 / El punto de partida

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.

02 / Los roles

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.

Mapa y tarifaSeguimiento en vivoChat efímero

Pasa el cursor por los pines del plano para cambiar de rol. Las cuatro apps comparten brio_core y brio_ui.

03 / Lo que sostiene el viaje

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.

04 / La interfaz

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.

AS

¡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

Ver cartaVaciar

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

Cancelar

Mapa del cliente — buscando conductor

El radar de la hoja inferior es el mismo pulso que late en los pines de esta página.

LM

Hola, Luis

Higuerote

Bs 1.240,00

Carreras cercanas (2)

CARRERABs 168,00

Calle Bolívar #12

Playa Los Totumos

A 1,2 km de tiVer punto
Aceptar carrera
DELIVERYBs 96,00

Arepera La Costa

Res. Mar Azul, torre B

A 0,8 km de tiVer punto
Aceptar carrera

Panel del conductor — carreras cercanas

Tema oscuro real de la app: toca el interruptor de disponibilidad para verlo encender.

Pedido listo

Confirmando

Preparando tu pedido

Buscando repartidor

En camino

Entregado

LM

Luis M. · Moto roja

A 4 min de tu dirección

Banco0102 · Venezuela
CédulaV-18.402.115
Teléfono0414-8624450
MONTO A PAGARBs 742,50

Los productos se los pagas al comercio; el envío, al repartidor.

2× HamburguesaBs 520,00
1× Refresco 1,5 LBs 142,50
EnvíoBs 80,00

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.

panel.vasvoy · comercio
🍔

Arepera La Costa

Higuerote · Comida rápida

Créditos: Bs 310,00

Nuevos1

12:04#A-2291

Hamburguesa

sin cebolla, por favor

Refresco 1,5 L

Res. Mar Azul, torre B, apto 4-C

Portón azul, frente a la plaza

ProductosBs 662,50
EnvíoBs 80,00

Pago móvil reportado · Referencia 004417832

Confirmar que me llegó

AceptarRechazar

En preparación1

11:52#A-2290

Pabellón criollo

para llevar

Tequeños (6 u.)

Calle Bolívar #12

Casa blanca, reja negra

ProductosBs 940,00
EnvíoBs 80,00
Listo para recoger

En reparto1

11:31#A-2288

Empanada de cazón

Playa Los Totumos, kiosco 3

Preguntar por Ana

ProductosBs 285,00
EnvíoBs 90,00

Créditos insuficientes para la comisión estimada: recarga para aceptar nuevos pedidos.

Aceptar

Pedidos1CartaHistorialCréditosAjustes

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.

05 / La máquina de estados

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.

pendiente

El cliente confirma

Regla de Firestore

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

aceptado

El comercio acepta

Función · congela la base

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

en preparación

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.

asignado

Un conductor lo toma

Transacción atómica

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

recogido

Va en la moto

Realtime Database

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

entregado

Se cobra una sola vez

onDeliveryEntregado

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

06 / El modelo

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.

Comisión prepagaCobro idempotenteBase congelada por el servidor

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.

Precios canónicos en dólares, siempre visibles en bolívaresTasa oficial traída cada mañana a las 8:00 de CaracasRecargas por Pago Móvil verificadas a mano desde el panel

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

07 / Funcionalidades

Catorce paradas ya construidas

Arrastra la cinta: cada tarjeta es una funcionalidad implementada en alguna de las cuatro apps.

01

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)

02

Geocodificación inversa con Nominatim para mostrar direcciones reales en vez de nombres de zona genéricos

03

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

04

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

05

Cartera de créditos del conductor: saldo destacado, reporte de recarga por Pago Móvil e historial de movimientos

06

Calificación por estrellas al terminar el viaje, promediada por una Cloud Function en el documento del conductor

07

Catálogo de delivery con búsqueda, categorías, notas por producto, productos agotados y comercios cerrados atenuados con su motivo

08

Selección de dirección de entrega con pin fijo sobre mapa móvil, referencia escrita y hasta seis direcciones guardadas por usuario

09

Seguimiento del delivery con línea de cinco pasos, repartidor en vivo y detalle de compra con totales separados entre comercio y repartidor

10

Pago de productos directo al comercio: efectivo o Pago Móvil con referencia reportada por el cliente y confirmada por el negocio

11

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

12

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

13

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

14

Tema claro y oscuro conmutables desde ajustes en las cuatro apps, persistidos con SharedPreferences

08 / Bajo el capó

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.

09 / Stack

Con qué está hecho

Aplicaciones

Flutter 3.35+Dart 3.10Material 3flutter_riverpod 2.6flutter_animate 4.5google_fonts (Nunito Sans)flutter_map 8.2latlong2geolocator 14image_picker 1.1url_launchershared_preferencesflutter_launcher_icons

Backend Firebase

Cloud FirestoreFirebase Realtime DatabaseFirebase Auth (teléfono OTP y correo/contraseña)Cloud Functions v2 (TypeScript, Node 20)Firebase Cloud MessagingFirebase StorageCloud Schedulerfirebase-admin 13firebase-functions 6

Servicios externos

OSRM (router.project-osrm.org) para rutas y ETANominatim / OpenStreetMap para geocodificación inversaOpenStreetMap tilesve.dolarapi.com para la tasa oficial

Arquitectura del repositorio

Monorepo Flutter con paquetes por pathbrio_core (modelos, repositorios y estado)brio_ui (tema, paleta, logo y widgets compartidos)Reglas de seguridad Firestore, Realtime Database y Storage versionadas
10 / Los retos

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.

VasVoy

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.

Lockup completo de VasVoy: palmera con flecha en forma de V, ola y brújula sobre degradado turquesa-verde, con la bajada «Viajes y Delivery - Higuerote»
Lockup completo de VasVoy: palmera con flecha en forma de V, ola y brújula sobre degradado turquesa-verde, con la bajada «Viajes y Delivery - Higuerote»
Marca sin letras — palmera, flecha V y ola; es el isotipo que se usa dentro de las apps
Marca sin letras — palmera, flecha V y ola; es el isotipo que se usa dentro de las apps
Ícono maestro 1024 px con fondo arena opaco, fuente para los íconos de iOS y Android
Ícono maestro 1024 px con fondo arena opaco, fuente para los íconos de iOS y Android
Capa frontal transparente para el ícono adaptativo de Android
Capa frontal transparente para el ícono adaptativo de Android
Isotipo empaquetado en brio_ui, renderizado por el widget BrioLogo en splash y cabeceras
Isotipo empaquetado en brio_ui, renderizado por el widget BrioLogo en splash y cabeceras
Lockup empaquetado en brio_ui, usado por el widget BrioLockup
Lockup empaquetado en brio_ui, usado por el widget BrioLockup
HigueroteMunicipio BriónMototaxiTaxiDeliveryPago MóvilTasa BCVCréditos prepagosHigueroteMunicipio BriónMototaxiTaxiDeliveryPago MóvilTasa BCVCréditos prepagos
VasVoy

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.