Why a point of sale must own its data
Most “offline modes” are a cache in front of a server. They work until the moment that matters: the line drops mid-ticket, the application is killed, the power goes. Then the cache and the server disagree, and someone spends the evening reconciling. A register that sells for a living cannot be a cache.
The rule
Every register write lands in the register’s own database first, then in a durable outbox. The register never needs the server to sell. The internet is only for sync. Nothing staged may be lost on a network drop, an app kill, a power loss or a reboot.
What it takes
- An embedded database with transactions, so a ticket and its outbox row are written together or not at all.
- Append-only events: a ticket is a list of things that happened, never a row that is updated. A void is an event too.
- Client identity: every ticket and every event carries an identifier made on the register, so the server can accept each exactly once no matter how many times it is sent.
- A sequence and a hash chain per register, so the order of tickets is provable and a gap is visible.
- Everything needed to sell on the device: prices, taxes, promotions, rates, banknotes, layouts and the effective rights of every user.
- Drills, not promises: every outbox-backed flow is tested with the line dropped, the app killed, the power lost and SAP down.
What it buys
A cashier who never waits. A shop that keeps selling through an outage. A ledger that is exact because the server posts what happened, in order, once. And an upgrade path that cannot lose a sale, because the register’s database is the record and the server is a copy of it.