The problem
Independent stores run on a pile of tools that do not talk to each other: one for the register, one for stock, one for purchase orders, another for the online shop, and a spreadsheet for the accountant. Owners type the same numbers in three places, and when the internet drops, the register stops selling.
AOne POS replaces that pile with one system. It runs liquor stores, convenience stores and quick-service restaurants in several countries, on the printers and card terminals they already own.
What I built
AOne POS is six apps on one backend:
An Android tablet register for the counter
A mobile POS that turns a phone into a register and card reader
A web back office where owners run the business
An online storefront for every store, on its own subdomain
A super-admin panel for the AOne team
The marketing website, with a hardware shop
I am the lead full-stack developer and team lead. I designed and built the backend that every one of those apps talks to, the back office, the super-admin panel, the mobile POS and the online storefront. On the marketing site I built the translations into five languages, the hardware shop and the about and contact pages. The tablet register is written by another developer; I designed and built every API and real-time event it runs on.
The back office
This is where an owner spends their day. The dashboard shows net sales, receipts, gross profit, returns and tips for any date range, with sales by hour, payments by tender, top items, sales by department and a line for every employee. Everything is filtered by register and employee, and exports to PDF or goes out by email.

The dashboard, here showing a month of sales for a demo liquor store.
The back office also has a full register in the browser, so a store can sell from any laptop when a tablet is busy.

The web register: departments, products, a live cart with stock, tax and totals.
Behind the dashboard sit the screens that keep a store running: orders with refunds, voids and exchanges behind manager approval; inventory with packs, weighed items and special pricing; purchase orders with suggested quantities; vendors, employees and time clock; customers and loyalty; kitchens, kitchen display screens and order screens; printers, payment terminals and digital menu boards.

Orders, searchable by invoice, employee, payment method and type.

Reporting: daily, hourly, top sellers, employee sales, shift reports, vendors and inventory.
It keeps selling when the internet drops
A register that stops working when the Wi-Fi does is not a register. Every sale carries an idempotency key, so when a device comes back online it replays its sales in batches of up to 100 and the server accepts each one exactly once, even if the same upload arrives twice at the same moment. Sales are accepted up to 72 hours after they happened, and every register keeps its own invoice series.
Stock moves through one atomic ledger with three-decimal quantities, so two registers selling the last bottle at the same time cannot leave the count wrong.
A register in your pocket
The mobile POS turns an Android phone into a full register: search or scan, build a cart, take cash or card, and send the receipt by SMS or email. It also has inventory, orders, house accounts, rewards, reports, shifts and label printing, so staff can work the floor or a pop-up stand without going back to the counter.

The mobile POS: products, cart, payment and the order history.
Payments on every device
Card-present EMV through Datacap, with the logging Datacap certification asks for
PAX terminals and tap-to-pay on the phone in the mobile POS, through native payment and printer modules
Online payments through Datacap's e-commerce API and Authorize.Net, tokenised in the browser so card numbers never reach our servers
Tax compliance built in
Some tax authorities set strict rules for how a register records sales. For those stores, AOne POS has a compliance mode that:
keeps a separate invoice series for each register, with no gaps and no reuse
produces X and Z readings and an electronic journal
applies VAT and the statutory discounts for senior citizens, persons with disability, solo parents and others
keeps a tamper-evident audit log, where every entry is chained to the one before it
locks each register to one physical tablet
It also has a written backup and disaster-recovery plan for the auditors.
An online store for every store
Each store gets its own storefront on its own subdomain, built from the same catalogue the register sells from. The owner lays out the home page from the back office: hero, categories, best sellers, new arrivals, story and store details. Customers sign in with a code sent to their phone and order for pickup. The order lands on the register in real time, and if something is out of stock, the store can propose a change that the customer approves or declines from their account.

A storefront home page, laid out by the owner from the back office.

Shopping by department, with live prices and stock.
Everything stays in sync
Every app is connected over WebSockets, in rooms for each store, register, order screen and customer display. Change a price in the back office and every register has it a moment later. A kitchen marks an order ready and it moves to the order screen. Sign in on a register that is already in use and the other session is signed out.
Around that core are the integrations stores asked for:
QuickBooks, for both a store's own books and billing stores for the platform
Uber Eats and WooCommerce orders
A two-way sync with AOne Inventory that runs on seven different schedules, from every 30 seconds to once a day
Star CloudPRNT printers
OptiSigns and AbleSign digital menu boards
SMS and WhatsApp through Infobip, routed by country with automatic fallback
Email receipts
How I keep it reliable
The backend has 806 automated tests that run against an in-memory database. They cover the parts that cost a store money when they break: one store never seeing another's data, offline sync, tax rules, loyalty and payments.
I have made 674 of the backend's 678 commits since June 2024.
Results
Live at aonepos.com.
