Latin America · On-Demand Delivery · Live

Groceries delivered
in real time.

One Flutter codebase, four roles. ONOA connects customers, riders, and store owners on a single real-time map — with MercadoPago checkout, photo-verified drop-off, and a rider earnings dashboard. Android, iOS, and web from the same source tree.

4
Roles · customer · rider · store · admin
1
Codebase → Android · iOS · Web
Live
GPS tracking on every delivery
Photo
Verified proof of drop-off

Delivery platforms usually ship as a fractured stack — a customer app from one vendor, a rider app from another, a store dashboard bolted on the side, and an admin panel nobody enjoys using. Communication between them leaks: assignments end up on WhatsApp, status updates arrive ten minutes late, and customers refresh the map because they don't trust "on the way."

The client wanted the opposite. One platform. One codebase. One real-time source of truth. Local payment (MercadoPago) baked in from day one — not tacked on later. Photo-verified drop-off so nothing disappears at the door.

And it all had to run on a budget that a small city delivery service could afford. No enterprise stack. No per-seat licensing.

A single Flutter codebase covering Android, iOS, and Web. Clean architecture — data / domain / presentation — with BLoC for state and GetIt for dependency injection. go_router handles role-based navigation so the same binary serves four completely different UIs based on who logged in.

Firebase Authentication handles the four roles with a single login flow. Firestore is the real-time source of truth — rider GPS, order status, assignment state, all synchronising live. When a rider marks "picked up," the customer's map updates in under a second.

Live GPS pushes every few seconds from the rider's phone; customers see the scooter pin move on flutter_map. At drop-off, the app requires a location-verified photo before the delivery can be marked complete — no location match, no completion.

MercadoPago runs through an in-app WebView with full transaction status handling — a returned "success" isn't trusted until the webhook confirms.

Riders get their own dashboard powered by fl_chart — completed deliveries, income, weekly trends. All in the same app that assigns them work.

What we built it with.

Mobile & Web
Flutter (Dart)
One codebase → Android, iOS, and Web. No parallel teams for parallel platforms.
BLoC
Predictable state across four role-specific UIs.
GetIt
Service locator for clean architecture separation.
go_router
Declarative role-based routing — one binary, four experiences.
Backend
Firebase Auth
Single login flow, role encoded on the user record.
Firestore
Real-time sync between customer, rider, store, and admin. No polling.
Node.js
Rich message templating that FCM alone couldn't handle.
Firebase Cloud Messaging
Push infrastructure — Node.js decides what to send.
Maps & Payments
flutter_map
OSM-based mapping with custom marker layer for live rider tracking.
MercadoPago
Native Latin American payment rail. Webhook-confirmed status.
fl_chart
Rider earnings visualisation without a heavier charting library.

The intelligence layer.

Claude Sonnet 4.6
Development pair — clean architecture design, BLoC state modelling, MercadoPago webhook handling

From brief to production.

Phase 1 Architecture & Auth
Clean architecture set up, Firebase Auth wired for four roles, go_router for role-based navigation.
Phase 2 Customer + Store Flow
Product browsing, cart, checkout via MercadoPago. Store dashboard for incoming orders.
Phase 3 Rider App + Live Tracking
Rider assignments, live GPS push to Firestore, customer map updates via flutter_map.
Phase 4 Notifications & Photo Proof
Node.js notification server for rich templating. Photo-verified drop-off with location match.
Phase 5 Earnings + Admin
fl_chart rider earnings dashboard. Platform-wide admin panel for users, stores, riders.

What shipped.

1 codebase
3 platforms
Android, iOS, and Web from a single Flutter source tree. No parallel builds, no divergent bugs.
4 roles
One binary
Customer, rider, store, admin — each with tailored UI, all shipped in the same app.
Live GPS
Real-time
Rider location pushes to Firestore every few seconds. Customer sees pin move on flutter_map.
Photo proof
Verified drop-off
Location-verified photo required before delivery marks complete.
"
One app for everyone. Riders don't need WhatsApp for assignments anymore. Store owners don't call to check on orders. Customers stopped refreshing the map. That's what live means.
O
Operator
ONOA platform

Building something similar?

If your problem lives at the intersection of AI, product, and real business constraints, let's talk.

Trusted Worldwide — Long-Term Partnerships Built on Trust and Results

Take it from leading businesses around the world. Time and time again, our clients experience the quality, speed, and reliability of our AI solutions and automation services, leading to long-term partnerships with AXCEL.

Ready to Automate and Scale Your Business?

We design and deploy AI solutions that streamline operations and accelerate growth.

WhatsApp