Noodo Bakers
Food Delivery App
End-to-end food delivery platform for Noodo Bakers: Flutter customer app plus Node.js API covering menus, checkout, local payments, loyalty, and live delivery tracking over Socket.IO.
- Role
- Mobile App and Backend Developer
- Timeline
- Aug 2024 — Feb 2025
- Status
- Completed

Overview
Noodo Bakers needed a delivery product that worked as a system, not just a UI, catalog, checkout, Ethiopian payments, loyalty, and live tracking had to stay consistent from phone to server.
I built both sides: a Flutter customer app and a Node.js/Express API on MySQL. The mobile client follows feature-first clean architecture (domain / data / presentation) with Riverpod, GoRouter, and Dio + Retrofit. The API owns auth, cart, orders, products, branches, promo codes, achievements/points, notifications, and payment webhooks, and recomputes order totals server-side so the client is never the source of truth for money.
Payments integrate Chapa and Telebirr end to end, in-app initiation on mobile, verification and notify handlers on the API, including fee transparency. Live order status and driver tracking run over Socket.IO, with map/ETA UX on the client (Gebeta) and room-based tracking handlers on the server. Auth spans phone OTP and Google sign-in, with JWT sessions, Firebase Admin for push, and secure token handling on device.
Shipped as a production customer pathway: browse → pay → track, with the hard edges (pricing, payments, realtime, permissions) designed as one coordinated stack.
Problem
- Ordering needed a full product path, not a brochure app: catalog, cart, checkout, payments, and fulfillment status in one flow.
- Money had to be trustworthy. Client-calculated totals, promo codes, points, VAT, and delivery fees diverge quickly without a server authority.
- Local payment rails (Chapa, Telebirr) required reliable initiation, verification, and webhook/notify handling, not just a checkout button.
- Delivery UX demanded live order and driver updates; polling alone was too slow and too noisy.
Approach
- Shipped a Flutter customer app and a Node.js/Express + MySQL API as one product surface, with clear contracts between mobile and backend.
- Moved pricing to the API: recompute subtotals, VAT, delivery, promo discounts, and points from authoritative DB data; never trust client totals.
- Integrated Chapa and Telebirr across both layers, mobile payment UX plus API verification/notify flows with explicit fee handling.
- Used Socket.IO for order status and driver tracking events, with map/ETA presentation on the client and room-based handlers on the server.
Challenges
- Keeping mobile and API order/payment state aligned through interrupted networks, SDK back-navigation, and async payment confirms.
- Encoding checkout rules once on the server (coverage, fees, promo, points, pickup vs delivery) without turning the client into a second source of truth.
- Stabilizing realtime tracking when sockets reconnect mid-delivery while map and order UI stay coherent.
Results
- A production end-to-end delivery stack: customer app + API covering browse, pay, loyalty, notifications, and live tracking.
- Server-authoritative money math and dual payment rails that reduce the usual trust breaks around checkout.
- A modular split, clean-architecture Flutter client, service/controller API, so payments, realtime, and catalog can evolve independently.
Architecture
Mobile
- Flutter customer app (iOS / Android)
- Feature-first clean architecture: domain, data, presentation
- Riverpod + code generation for state and DI
- GoRouter for typed, auth-aware navigation
API
- Node.js (ESM) + Express REST API
- MySQL via mysql2; service / controller / model layering
- Joi validation, JWT auth, bcrypt credentials, rate limiting
- Pino logging; cron jobs for scheduled backend work
Networking & data contracts
- Typed mobile networking: Dio + Retrofit + Freezed models
- Auth interceptors, retries, secure token storage on device
- Server-authoritative order totals (VAT, promo, points, delivery)
Realtime & location
- Socket.IO server rooms/handlers for order and driver tracking
- Socket.IO client on mobile for live status updates
- Gebeta GL + flutter_map + Geolocator for map/ETA UX
- Haversine / delivery-zone logic on the API for coverage
Payments & identity
- Chapa and Telebirr: in-app flows + API verify/notify handlers
- Firebase Auth / Google sign-in on mobile; Firebase Admin for FCM
- Phone OTP, JWT sessions, push + local notifications
Core domains
- Auth, catalog, cart, checkout, orders, addresses, branches
- Promo codes, loyalty/achievements, reviews, favorites, notifications
- Admin portal request surface and app configuration APIs
Stack
- Flutter
- Dart
- Riverpod
- WebSockets
- Push Notifications
- Deep Linking
- Payment Integration
- Authentication and JWT
- Node.js
- REST APIs
- MySQL
- Firebase Admin
- flutter_map
- Gebeta Maps
Built at
MALTT Enterprise PLCBackend and Mobile Application Developer