Android POS system for shops
A point-of-sale system for Android terminals with a catalogue, operators, cash-up, printing and a remote management dashboard.

The project
We developed an Android point-of-sale system and a mobile operations dashboard to manage products, operators, terminals, sales and revenue from a single backend.
On the terminal, the operator logs in with a PIN validated on the server, creates the sale, prints the receipt and can keep working from a local cache when the connection is unstable. The dashboard lets the owner monitor sales, products and terminals without interrupting the flow at the counter.
The hardware integration covers printing and contactless reading through the device’s SDK. The EMV flow was prepared and tested on development hardware; real bank authorisation still requires an acquirer, production keys and specific certification.
Stack: Kotlin · Jetpack Compose · Hilt · Room · Retrofit · WorkManager · Supabase · PostgreSQL.
Need something similar?
Tell us about your case: we start from what we have already built to get there faster and for less.
Related service: Mobile appsTechnical details
Challenges
- →Keeping the sales flow available when the connection is intermittent
- →Preventing two counters from claiming the same terminal or duplicating a sale if the connection drops mid-transaction
- →A cash-up that always balances, even if the device loses its connection right as the shift closes
- →A second management app that reflects the business in real time without slowing down the card terminal at the counter
How we solved them
- Integration with the terminal’s SDK for printing and contactless reading, with clear feedback on errors and timeouts
- A local queue with WorkManager that syncs in the background, with terminal assignment resolved atomically on the backend
- Cash-up validated on the server — the remote state always wins, and the device never “assumes” a cash-up went through
- A management dashboard on the same backend with its own sync cycle — the owner sees the business in real time without touching the counter flow