AWRA OpsHub Search

The Count Is the One Thing the Phone Cannot Do Offline

A branch pharmacy in a mall basement, stocktake night, two staff and a phone each. The signal in that basement comes and goes. Our app will hold a stock transfer, a check-in, a check-out and an asset movement through a dead connection and push them when the bars come back. It will not hold a count — and the reason is not that nobody got round to it.

Pharmacy & Pharmaceutical Distribution Washingtone Aura 12 min read

Every offline demo is run in a room with good wifi. Somebody switches the phone to aeroplane mode, taps three things, switches it back, and everyone watches a little counter go from three to zero. It is a genuine capability and it is genuinely worth having. It also tells you almost nothing about the operation you are actually worried about, which is the one where two people spend four hours on a basement floor with a clipboard and a phone, counting every box in the branch.

So here is the specific answer, in one sentence, before the reasoning. Our mobile app will queue four operations offline — a stock transfer, an inventory check-in, an inventory check-out and an asset movement — and a stock count is not one of them. The count screens are on the phone and they work, but they need a live connection to the server for every step.

The rest of this post is the part that is more useful than the sentence: what the offline queue actually does, why counting is a different shape of problem from the four things that queue, and what a pharmacy should do about it on the night.

The four things the phone will hold for you

Operation Queued as What it means on the floor
Stock transfer stock-transfer Move stock between warehouses or locations with no signal
Inventory check-in checkin Receive stock into a location offline
Inventory check-out checkout Issue stock out of a location offline
Asset movement asset-movement Check out, check in, transfer, relocate, verify, mark damaged, mark lost or retire an asset

That last row is broader than it looks — eight distinct asset actions ride on one queued operation type, including verification, which is the one a pharmacy doing an equipment walk-round would use most.

The queue underneath those four is properly built, and it is worth describing because it is the part that determines whether offline capture is trustworthy or merely present.

  • Every operation carries an idempotency key. If the phone pushes and the response is lost, the retry does not create a second transfer.
  • Order is preserved on a transient failure. If a push fails for a reason that might succeed later — the network drops mid-sync — the operation stays pending and the sync stops there rather than skipping ahead and applying later work first.
  • Permanent failures are separated from transient ones. An operation the server has definitively rejected is marked failed and set aside, with the error message kept against it.
  • You are told, app-wide. An orange strip across the top of every screen reads "Offline mode", and once you are back online it keeps showing while anything is queued or failed, with the counts.
  • You can inspect the queue. There is a screen listing every queued and failed operation, and a detail screen for any one of them showing what it was and why it failed.
  • The subscription is checked before anything is pushed. On reconnect the app verifies the plan with the server first; if it has lapsed, queued work stays put rather than being pushed into a closed account.

One boundary before we go further

All of this is the mobile app. The browser has no offline mode. If your branch staff work on a desktop in a back office, a dropped connection means a dropped connection, and nothing is queued anywhere. Offline capture is a phone capability in this product, full stop.

Counting is on the phone. Counting offline is not.

This distinction gets lost, so it is worth being blunt about. There are four inventory count screens in the mobile app: the list of count sessions, the setup form, the counting form itself and the session detail. They are real screens with real functionality. A pharmacy technician can run a full count session from a phone — see their assignment, enter counted quantities, submit, watch variances resolve.

None of those four screens contains a single line of offline handling. No connectivity check, no queueing, no local draft. Search all four for any reference to the offline system and you get nothing. They call the server, and if the server is not reachable, the call fails like any other failed request. The app-wide orange strip will tell the counter they are offline; the count screen itself will not do anything clever about it.

The four operations that queue are all deltas. A count is not a delta. It is an assertion about absolute state at a specific moment, and a stale absolute is worse than none.

Why a count is a different shape of problem

It is tempting to assume counting was left out of the offline queue because it was further down a list. That is not the reason, and a buyer evaluating this is better served by the real one.

Look at what the four queueable operations have in common. Every one is a change relative to whatever is there. Move five boxes from A to B. Issue three units. This asset is now with that person. Those instructions are still correct six hours later. They can be applied in order against whatever state the server has reached in the meantime, and they land where they should. That property is what makes them safe to hold in a pocket.

A count says something categorically different: there are forty-two of these here, right now. That statement is only true at the instant it is made. Push it six hours later, against a system where four have been dispensed and a delivery of thirty has arrived, and you are not applying a delta — you are overwriting the truth with a photograph of the past, and generating a variance that describes nothing that happened.

Two counters, one dispensary, no signal

19:10 — Counter A records 42 boxes of paracetamol in the dispensary held on device A
19:40 — Counter B, working the other side, records 38 of the same item in the same location held on device B
20:15 — a pharmacist dispenses two boxes from that shelf server state changes
21:00 — both phones reconnect and push two absolute claims arrive
What the system should conclude genuinely unclear — and that is the point

With deltas there is no ambiguity: they add up. With two conflicting absolutes and a live movement in between, there is no correct automatic answer. Any product that queues counts offline has picked a rule for this — last write wins, or first, or highest — and you should ask which, because you will be living with it.

The lock is the real reason

There is a second, harder reason, and it is specific to how counting is built here rather than a general observation about distributed systems.

A count session in this product can freeze the stock it is counting. It is an option on the session, with a start and an end, and while a session holding that freeze is open, counting, submitted or awaiting approval, the items in it are locked. That is not advisory. Any attempt to move locked stock through the inventory service raises an error and refuses: this item is locked by an active inventory count session.

That lock is a promise the server makes to every other user at once — to the till, to the receiving bay, to the other branch requesting a transfer. A phone with no connection cannot hold that promise. It cannot take the lock, cannot know a lock was taken while it was dark, and cannot honour one it never heard about. Offline counting against a freeze-capable session is not a queueing problem; it is a promise the device is not in a position to make.

And a blind count pulls the other way entirely

Sessions can be run blind, which means the counter is not shown the expected quantity — the whole point being that they count what is there rather than confirming what they were told. The masking is enforced on the server. A phone caching expected quantities so it could work offline would be caching precisely the number a blind count exists to withhold. Offline counting and blind counting are in genuine tension, and any product offering both should be asked how it resolves that.

The frustrating part: the device already has the data

None of the above means the gap is small. It is worth seeing how close the pieces already sit, because it tells you what a fix would involve if you ever wanted to commission one.

The app caches a substantial reference set on the device: the item list, item form data, locations, warehouses, units of measure, adjustment reasons, assets, custodians, asset policy, recent asset movements, recent adjustments, and inventory levels. It also caches custom field definitions for nine modules — and one of the nine is inventory count sessions.

So the phone already holds the items, the locations and the stock levels a count screen would need to display with no signal. The queue that would carry the results already exists, with idempotency and ordering. The banner that would tell the counter what state they are in is already on every screen. What is missing is not the parts. It is the wire between the count screen and the queue — plus an answer to the two questions above, which is the part that takes real thought rather than real typing.

What to actually do on stocktake night

This is the practical section, and it assumes you are running the count in a place where signal is unreliable — a basement, a back store, a rural branch on a mobile hotspot.

  1. Test the signal where the stock is, not where the counter sits

    Walk the actual route with the app open a week before. The strip at the top of the screen turns orange the moment the connection drops, so you get a free survey by watching it. Note the dead spots.

  2. Decide the fallback before you need it, not at 21:00

    If a section of the branch has no signal, that section gets counted on paper and entered afterwards. Agreeing that in advance turns an outage into a procedure. Discovering it mid-count turns it into an argument.

  3. Do not run a frozen session across a dead zone

    If the session holds a stock freeze and counters cannot reach the server, they cannot submit, and the freeze stays on — which blocks the till and the receiving bay for as long as it takes. Either the signal is reliable where you are counting, or the session should not hold the freeze.

  4. Use the four queueable operations freely

    Transfers, check-ins, check-outs and asset movements really do survive a dead connection. If part of stocktake night is moving stock between locations or verifying equipment, that part is safe offline and you should lean on it.

  5. Check the queue is empty before anyone goes home

    The strip shows pending and failed counts, and the queue screen shows each one. An operation sitting failed is a movement that did not happen, and the morning after a stocktake is the worst possible time to discover one.

Survives a dead connection

  • Stock transfers between warehouses and locations
  • Inventory check-ins and check-outs
  • All eight asset movement actions, including verification
  • Looking up an item by barcode against the cached item list
  • Seeing that you are offline, and what is waiting to go
  • Reviewing and retrying anything that failed to push

Needs a live connection

  • Every step of an inventory count session
  • Anything at all in a desktop browser
  • Taking or releasing a stock freeze
  • Revealing a masked quantity in a blind count
  • Approving a variance, or any approval step
  • Everything not on the four-operation list above

The question worth asking every vendor

Offline is the single most over-claimed capability in this category, because the demo is easy and the boundary is invisible. These questions find the boundary in about two minutes, and they work on us as well as on anyone else.

Ask these, and ask for the screen

  • Name every operation with stock and asset movement captured offline. Not "inventory" — the specific list.
  • Is offline mobile only, or does the browser do it too?
  • Show me a full stock count started, entered and submitted in aeroplane mode.
  • Two counters count the same shelf offline and get different numbers. What does the system do when both reconnect?
  • If stock moved while I was offline, does my queued work still apply correctly, or does it overwrite?
  • Show me the screen where I can see what failed to sync, and why.
  • What happens to a queued operation if my subscription lapses before it pushes?

The fourth question is the one that separates products that thought about offline from products that added a queue. There is no free answer to it. A vendor who answers immediately and specifically has been through it; a vendor who says "it syncs automatically" has not.

Offline capture: what ships today, and what we can add

Built and verified in the mobile client

  • Four queueable operations. Stock transfer, inventory check-in, inventory check-out and asset movement — the last covering check-out, check-in, transfer, relocate, verify, mark damaged, mark lost and retire.
  • Idempotency on every queued operation, so a lost response does not become a duplicate record.
  • Ordered replay with transient-failure handling. A network failure leaves the operation pending and stops the sync there; a definitive server rejection marks it failed and keeps the reason.
  • An app-wide status strip showing offline state plus pending and failed counts on every screen.
  • An inspectable queue — a list screen and a per-operation detail screen with the error message.
  • A subscription gate on reconnect, verifying the plan with the server before any queued write is pushed.
  • A cached reference set on the device: items, locations, warehouses, units, adjustment reasons, assets, custodians, asset movements, adjustments, inventory levels and custom field definitions for nine modules.
  • Count sessions on mobile, fully functional with a connection: list, setup, counting form and session detail.

More we can add — each one verified against the code

  • Offline inventory counting. The four count screens contain no connectivity handling, no local draft and no queueing. A count needs the server for every step.
  • Offline anything in the browser. Offline capture is a mobile-app capability only.
  • An offline conflict resolution for absolute quantities, because no absolute quantity can be captured offline in the first place.
  • An offline participation in a stock freeze. The lock is enforced server-side and throws on any locked movement; a disconnected device cannot take, see or honour it.
  • Offline approvals. Variance approval and every other approval step require a live connection.
  • Offline POS. Not covered by the four operations, and not addressed in this post beyond saying so.

Where the line falls

  • If your offline need is moving, issuing and receiving stock in places with poor signal, this is well covered today and the queue underneath it is careful work.
  • If your offline need is a full stocktake in a basement, plan for paper in the dead spots. That is the honest answer and it is better to have it in writing now than at 21:00 on the night.
  • Offline capability lives in the app rather than the browser, and that should shape which device your staff are given.

Offline counting is buildable, and the device already carries most of what it needs. What it requires beyond the wiring is a decided answer to conflicting absolute counts and a policy for sessions that hold a stock freeze. Those are design decisions rather than typing, and we would rather agree them with you than guess.

Verified against the Laravel API and the React Native client on 7 August 2026. The four operations were established by finding every call site of the queueing function and every case in the sync handler, and confirming the two lists match.

More we can add to your workspace

Anything above that you need, we can build for you

Everything listed above as something we can add describes what ships in the standard product today — it is a starting point, not a limit on what AWRA OpsHub can do for your organisation. Kenya's eTIMS integration and its maintained payroll engine are both in the product because clients needed them and commissioned them; neither appeared by itself, and the same door is open for whatever you just read about. One qualification so this is worth what it claims: a small number of things on this blog we deliberately leave to a specialist rather than build — a statutory ledger we will not sign our name to, a rule that would decide a tax question for you, a clinical or member-funds record that belongs in a regulated system — and where that is true the post says so in those words. Everything else is a scope, a timeline and a price.

The operational work, which is what most commissions actually are

An extra approval stage in a chain that does not match the standard one, a custom field set on employees or assets that only your sector needs, an expiry that has to block an order rather than send an email, a report your board asks for in a shape nothing produces, or a scanner or weighbridge feeding the goods-in door. These are the commissions we are asked for most often and the smallest ones we quote — and unlike a revenue-authority pipeline, none of them waits on a regulator.

The module-shaped additions, which are the ones readers ask for most often

A price list with real discount authority, a customer-facing quotation that expires, a bill of materials or recipe costing, a staff advance that is issued, acquitted and chased, a member or unit ledger, a matching rule that holds a payment. Each of these is a build rather than a setting, and each has been quoted before — a bigger piece of work than a custom field, with a written spec and a date instead of a roadmap slide.

The report, document or pack nothing currently produces

The board pack in the shape your board actually asks for, a donor or funder layout, an invoice or receipt template carrying what your regulator or your customer expects, a dataset the report builder cannot reach yet. Usually the fastest thing on this list to deliver, because the data is already in the system.

Systems, rails and hardware you already run

The accounting package, CRM, online store, core banking or custom database you intend to keep — connected through our API so a fact is entered once and appears everywhere it is needed. Plus the physical edge: a scanner, a scale, a weighbridge or a till peripheral feeding the door it belongs to.

How it works: you describe the requirement, we return a written scope, timeline and cost, and once agreed it is built into your environment and maintained as part of the product. Nothing here waits on a regulator or a published specification, which is why operational builds are the ones we quote fastest. Tell us the requirement that would otherwise rule us out — that is a better first conversation than a demo.

Tell us what your operation needs

A narrow offline capability that is honestly described is worth more than a broad one that is vaguely described, because you can plan around the first and you cannot plan around the second. Four operations, mobile only, with a real queue underneath — that is the shape of it, and now stocktake night can be planned against a fact.

Tell us where the signal dies

If you run branches where connectivity is genuinely unreliable, describe the worst one and what has to happen there. We will tell you which parts work offline today, which parts need paper, and whether the gap is worth building out for your operation.

Talk to us about a multi-branch deployment

Share this article

LinkedIn X WhatsApp

Keep reading

All blogs

Help Center

Need a quick answer while you read?

Run inventory, procurement, assets, sales, and field work with approved AWRA guidance for setup, migration, integrations, security, pricing, and support.

Search all approved AWRA public help articles.

Open Help Center