How Offline Works
What Kassly stores on the device, how it decides you are offline, what it guarantees about your sales — and the truth about how long you can keep trading without a connection.
8 min read · Updated 26 Sep 2026
On this page
Philippine internet fails. Kassly is built on the assumption that it will fail during your busiest hour, and that you should keep selling anyway.
This page explains the machinery. If you just want to know whether a particular screen works, go straight to What works offline.
Which parts of Kassly work offline
Offline support lives in the Kassly app on your phone or tablet. That is where the till runs, and that is what keeps a copy of your data on the device.
The web dashboard — reports, settings, the product catalogue, purchase orders — needs a connection for everything. It is a window onto the server, not a copy of it. See Installing the app.
How Kassly decides you are offline
Kassly does not trust the phone's signal bars. A phone can show four bars of data on a network that cannot reach anything.
Instead the app asks the server a tiny question every 30 seconds, and gives it 5 seconds to answer.
| What happens | What Kassly does |
|---|---|
| The check answers | Online. Straight away, no delay |
| One check fails | Nothing changes. A single slow answer on congested mobile data is not an outage |
| Two checks fail in a row | Offline |
| The phone reports the network link is gone | Offline immediately, without waiting for a check to time out |
| The link comes back | Kassly checks at once rather than waiting for the next 30-second tick |
Two consecutive failures is roughly a minute. That delay is deliberate: flapping between online and offline every few seconds would take features away and give them back while a cashier was mid-sale.
Right after you open the app it reads as offline until the first check answers. That is normal and clears within a few seconds. Do not read the very first badge you see as a verdict on your connection.
What is kept on the device
The app keeps a working copy of everything the till needs to serve a customer.
| Kept locally | Used for |
|---|---|
| Products, variants, modifiers, barcodes, categories | Searching, scanning and pricing |
| Services | Selling a service or a booking |
| POS collections and their products | The tile layout on the register |
| Stock levels | Blocking an oversell, showing what is out |
| Recipe availability | Telling a kitchen a dish can no longer be made |
| Customers | Attaching a sale, looking somebody up |
| Membership plans and members' memberships | Scanning a member in, issuing a plan |
| Staff roster, with PIN checks | Verifying a manager approval or a time-clock punch |
| Tables | The floor plan and the table picker |
| Appointments and resources | The day's agenda |
| Held carts and held sales | Recall |
| Receipts, for 30 days | Reprinting |
| Your open cart | Surviving a crash or a restart |
Your catalogue is downloaded in full the first time, then refreshed incrementally — only products and stock levels that actually changed — so a store with tens of thousands of items refreshes in a moment instead of re-downloading everything. A full pass runs at least every 12 hours, which is what catches deletions and refreshes everything else.
Everything in that list is as of the last successful sync. A price you changed on the web five minutes ago is not on an offline till.
The outbox
Anything you do offline that changes something goes into a queue on the device and is sent when the connection returns.
| Queued offline | Notes |
|---|---|
| Sales | Including the payments, discounts and the receipt number |
| Shift opens and closes | |
| Cash In and Cash Out | |
| New customers | |
| Edits to a customer you created offline | |
| Memberships issued, and member visits | |
| Job orders taken in | |
| Appointments created, checked in, cancelled or moved on | |
| Time-clock punches | Station mode only — see the warning on What works offline |
| Payments collected against an account |
Receipt numbers while offline
Every paired till is handed a block of 500 receipt numbers in advance. The app refreshes the block whenever fewer than 50 remain, so under normal use it never runs dry.
Offline, the app takes the next number from its block. The receipt looks exactly
like an online one — Counter 1-00000042 — because it is the same sequence.
That is what lets an offline sale be attributed to the right till when it
eventually syncs.
If a device was never paired to a till, or a block runs out while offline,
receipts fall back to a timestamp format beginning OFL-. Those sales are
still complete and still sync. They just cannot be traced back to a till
afterwards, so they land in the Unattributed row of
Sales reports. Pair your devices and this never happens
— see Terminal management.
Numbers are marked as used before the sale is saved. A crash at the wrong moment therefore skips a number rather than reusing one. Skipping is safe; reusing would not be.
How syncing works
| When | What |
|---|---|
| Every 60 seconds | If the device has any network link at all, Kassly tries to drain the outbox |
| The moment the link returns | An immediate attempt, rather than waiting up to a minute |
| When you tap the sync badge | An immediate attempt, on demand |
Note that sync uses a looser test than the badge does. The badge wants a quick answer from the server; sync only asks "is there any point trying". This is on purpose — on congested mobile data the quick check times out while a longer upload would have gone through perfectly well, and starving sync in that situation was worse than trying and failing.
Sales go up in batches of up to 100, and Kassly keeps draining batch after batch until the outbox is empty or something fails.
What Kassly guarantees
These are the promises the offline design is built to keep.
A sale is never posted twice. Every offline sale carries an id generated on the device. The server locks on that id, and if it has already seen it, it hands back the sale it already has instead of creating a second one. That is why retrying a sync — automatically, or by tapping the badge over and over — is always safe.
A failed sale is never deleted. Not by housekeeping, not by a new shift, not ever. A rejected sale is real money that was taken, so it stays visible until somebody resolves it. See Troubleshooting sync.
Kassly does not stop retrying. There is no attempt limit after which a sale is abandoned.
Statutory discounts are recalculated by the server. A senior-citizen or PWD discount is not simply trusted from the device — when the sale lands, the server recomputes it from which lines were marked. See Discounts.
A void undoes its stock. An offline sale that is later voided does not leave your stock permanently short, and it does not inflate consumption in Inventory reports.
You cannot oversell offline. The stock check runs against the local copy, so selling past zero is refused the same way it is online. What can happen is the opposite: the local copy is stale, so the till may refuse something you actually have, or allow something another till just sold. When that second case syncs, the sale is recorded in full, the item goes below zero, and the branch is asked to recount it. See When stock goes below zero.
How long can you stay offline
There is no cutoff. Kassly does not stop you selling.
What happens instead is that the badge gets more insistent. After 24 hours it starts naming the age of your oldest unsynced sale. After 48 hours it adds "Reconnect soon". Keep going past that and it keeps selling; the wording does not change again.
Older Kassly documentation said "up to 72 hours offline". Do not plan around that. There is a 72-hour figure inside the app, but nothing enforces it — it only shapes how the warning is worded. Selling is not blocked at 72 hours, or at any other hour.
The real limits are practical, not a timer:
| Limit | What runs out |
|---|---|
| Receipt numbers | 500 per block. After that, receipts fall back to OFL- and lose their till |
| Blocked features | Everything in the blocked column of What works offline stays blocked the whole time |
| Stale data | Prices, stock and your customer list are frozen at the last sync. Another branch's activity is invisible |
| No Z-reading | An offline close produces this device's own totals. The official numbered Z-reading is only generated when the close reaches the server. See X and Z readings |
| Device storage | The outbox grows with every sale |
Treat a day as the sensible ceiling and sync before you close. A week of unsynced trading is technically possible and is a genuinely bad idea.
Housekeeping
The app tidies up after itself, carefully.
| Data | When it goes |
|---|---|
| Delivered queue entries | Immediately after delivery |
| Cached receipts | After 30 days — unless their sale has not synced yet |
| Last shift's synced sales | When a new shift opens |
| Synced job orders and appointment queue entries | After 30 days |
| Failed sales | Never |
That last row is the important one, and it is why a red badge can sit there for days. It is not stuck because Kassly forgot about it; it is being kept deliberately.
Next
- What works offline — the feature-by-feature table.
- Sync status — reading the badge.
- Troubleshooting sync — clearing something stuck.