Point of sale for stores and restaurants in Saudi Arabia.
Dots is two halves of one product: a back office the owner opens in the morning, and a tablet POS the staff work on all day. Both run today, and so does the QR ordering menu. What Dots has not got yet is its first café.
The dashboard lives at app.dotspos.com. There is no signup on this page yet.
Where Dots is today
Stated plainly, because a product page that overstates is worth less than no page at all.
The back office
Menus, inventory, staff and permissions, customers, loyalty and reports. Built, deployed, and usable by an owner today.
The POS and the guest menu
The tablet POS sells: baskets, tabs and tables, discounts, loyalty points, refunds, and a ZATCA invoice on every sale. The QR menu is live on each café's own subdomain — a guest scans the code on their table and orders from their own phone.
A café trading on Dots
Everything above is built, deployed and under test, and none of it is ringing up a paying café's sales yet. Every figure in the product today is test data on our own tenant. What is missing is a first customer, not a screen.
What the back office does today
Every card below is a screen that exists, in Arabic and English, scoped per branch.
Menu
Menus, categories, items and modifier groups. Availability and price can be overridden per branch, so one branch charges differently without a second menu.
Inventory and recipes
Ingredients, stock levels and low-stock warnings. Recipes with a computed cost, supplier purchases, and transfers between branches.
Staff and permissions
Staff, roles, and the branches each of them can see. POS PINs are stored hashed, never as readable text.
Customers and loyalty
Customer records, the loyalty points programme, coupons and reviews. Ten points are earned per riyal of a sale; the counter finds a customer by phone number and takes a reward off the bill.
Reports
Sales, product mix and inventory, filtered by branch and date range, and exportable as CSV.
ZATCA Phase 1
The Base64 TLV QR and the SHA-256 invoice hash chain, on the device, offline, at the moment of sale. Every sale rung on the POS carries one. The chain cannot be backfilled, which is why it runs at the counter rather than in a nightly job.
One caveat worth stating: stock moves only for items that have a recipe. An item with no recipe sells without touching inventory — so a café gets stock control over exactly the products it has costed, and nothing it has not.
The parts you only notice when they are wrong
Decisions taken once, in the database, rather than re-argued screen by screen.
Money that reconciles
Every amount is an integer number of halalas. VAT is carved out of the inclusive price and derived as the remainder, so net plus VAT equals the total by construction — never three halalas short of itself.
Sales that cannot be rewritten
A completed order is append-only, enforced in Postgres rather than in application code. A correction is a new reversing record — which is what an audit and ZATCA both require.
One merchant cannot read another
Tenant isolation lives in Postgres row-level security, never in the frontend. A suite of cross-tenant attack queries is written against it and run directly on the database.
Arabic and English as data
Translations are rows, not columns. A third language is an insert, not a schema migration, and writing direction is a property of the locale rather than a check for Arabic.
What comes next
The café's own app
An iOS and Android app under the café's own name, on the café's own developer accounts — not one Dots app with a café picker in it. The menu, past orders, the loyalty card and offers. Built and running; not yet in either store.
Stock that costs every item
Ingredients, suppliers, transfers and recounts are in. What is next is coverage: a recipe on every item, so a sale deducts what it actually consumed and a café can read its margin per product rather than per basket.
See the dashboard for yourself
The back office is live at app.dotspos.com. Dots is early, and this page says exactly how early.