EasyStock
Role-based POS with vendor/customer ledgers for small retail businesses
A Flutter POS and back-office system for small retail businesses — Admin/Cashier roles, a two-pane checkout terminal with partial/credit payments, and running vendor and customer ledgers, all on a real-time Firestore backend across web, Android and iOS.



The repository is private. The router-level role gating, the credit and partial-payment ledgers and the two-pane checkout are explained below.
About this project
Small retail shops don't just need a checkout screen — they need to know who owes them money, who they owe, and what's low on the shelf, all from one place. EasyStock covers that ground: products and categories, a two-pane POS terminal with barcode/name search, vendors with a running vendor-payments ledger (accounts payable), and customers with their own payments ledger that supports partial and credit sales (accounts receivable) — a customer can pay less than the total and the balance tracks as credit until it's settled.
The POS terminal itself is built for a keyboard-first checkout flow: search-or-scan a product, set quantity, add to cart, apply a discount as either a flat amount or a percentage, pick a payment method, and either take full cash payment with a live change calculator or leave part of the sale as customer credit — checkout is bound to F5 for a till-style workflow. Orders can be edited, returned or deleted after the fact through dedicated dialogs.
Every role is enforced through GoRouter redirects, not just hidden UI: an admin/cashier role model drives route guards that send an unauthorized cashier to a dedicated unauthorized screen rather than merely graying out a button — the dashboard, user management and settings routes are admin-gated at the router level. The dashboard itself runs period-filtered analytics (Today/Yesterday/This month/Last month/a custom date range) with a sales trend chart, period-over-period trend arrows on each stat, and low-stock warnings, built on fl_chart over live Firestore data.
Key features
- Admin and Cashier roles enforced at the router level (GoRouter redirects, not just hidden UI) with a dedicated unauthorized-access screen
- Two-pane POS terminal: barcode/name search, quantity, flat or percentage discount, payment method, live cash-received/change calculator, keyboard-bound checkout (F5)
- Partial and credit sales — a sale can be paid in full, partially, or fully on credit, tracked per order
- Running vendor-payments and customer-payments ledgers (accounts payable / accounts receivable), combining orders and payments into one chronological transaction history per party
- Order returns, edits and deletes via dedicated confirmation dialogs
- Analytics dashboard: period filters (Today/Yesterday/This month/Last month/custom range), a sales trend chart (fl_chart), period-over-period trend indicators, and low-stock warnings
- Real-time inventory and sales data via Firestore across web, Android and iOS from one codebase
- Admin-controlled user onboarding — no public self-signup
From the blog
More in E-Commerce & Retail

POS & Inventory Platform
Full-stack POS & inventory platform with offline-first sync
A POS and inventory management platform: a Node.js/TypeScript REST API on PostgreSQL paired with a Flutter app that keeps working offline and syncs when connectivity returns.



Food Gate
A category-browsable food-ordering app with a live Google Places address picker, plus a matching admin catalog console
A Flutter food-ordering app — browse a menu by category, build an order through per-item variations and modifiers, and check out with a Google Places-autocomplete address picker and a live Google Map marker — paired with a separate Flutter admin console for managing the menu catalog and user accounts over the same Firestore backend.
~/sherazi.dev$./say-hello
Say hello.
Questions about a case study, one of the packages, AI tooling or Flutter in general are always welcome.
// or browse the packages on pub.dev(opens in a new tab)