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