All projects

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
Noodo Bakers cover

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
  • AdminerFirebase Admin
  • flutter_map
  • Gebeta Maps

Built at

  • MALTT Enterprise PLCBackend and Mobile Application Developer

Have something similar to build?