Skip to content
All work
Android2026

A point-of-sale and field-sales system for an electronics distributor, built to keep selling when the phone has no signal.

Majestic — Field Sales & POS
  • RoleMobile & backend engineer
  • TookOngoing
  • Year2026
  • Built with
    • Flutter
    • Dart
    • Drift
    • Supabase
    • PostgreSQL
    • Edge Functions
    • RLS
  • 69Row-level security policies
  • 38Tables
  • OfflineSells without a signal

What was wrong

Reps sell from vans, warehouses and shop counters — places where connectivity is not a given. A POS that pauses for the network is a POS that loses the sale, and money moving through cash drawers, wallets and instalments has to reconcile exactly at the end of the day regardless.

What I did

The mobile app writes to a local Drift database first and queues every action in an idempotent outbox, so a sale completes whether the network is there or not and syncing twice never double-counts. The server is the authority: 38 tables, 82 functions and 69 row-level-security policies enforce who may see which warehouse, which treasury and which customer — in the database, not in the interface.

What changed

Selling no longer depends on the signal, and the day closes on a Z-report that ties every invoice, collection and expense back to a treasury. Because the rules live in the database, a new role is a permission row rather than a release.

What is inside

  • A POS that works offline

    The sale is written locally first and waits in an idempotent outbox, so no amount of re-syncing can count it twice.

  • Treasuries and a working day

    Cash, mobile wallets and sub-treasuries, with the day opened, banked and closed on a Z-report that ties every movement to its treasury.

  • Warehouses, stock counts and purchases

    Inventory, customers, purchases, advances and stock counts, with Excel import for anyone starting from records that already exist.

  • Permissions live in the database

    69 row-level-security policies decide who sees which warehouse and which treasury — the interface does not hide the data, the database never hands it over.

  • Reports, audit trail and backups

    Full reporting and an audit record for every movement, with automatic backups to Google Drive.

  • One codebase, phone and web

    The rep app and the admin dashboard are both Flutter from a single codebase, over Supabase.

Next

Abo Dola Studio

Still reading?

Then we should probably talk. Thirty minutes, free, no slide deck. Worst case you leave with a second opinion.