Offline support: the feature nobody asks for until they need it
Offline support almost never makes it into an app's initial written specification, precisely because it's genuinely invisible during any demo running comfortably on fast, reliable office wifi. It only really shows up much later, in one-star app store reviews left by real users on a subway, in a genuinely rural area, or simply stuck on a carrier network with consistently poor coverage, all describing an app that "just doesn't work" from their actual daily experience.
Decide deliberately what genuinely needs to work offline, and what doesn't
Full offline functionality across every single feature is rarely genuinely necessary or even realistic to build for most apps. We scope this specific area quite deliberately with every client: which particular screens or actions genuinely need to work reliably without any active connection at all, viewing previously loaded content, queuing a specific action to sync automatically later, versus which ones can reasonably just show a clear, honest "you're currently offline" state instead.
Sync conflicts are genuinely the hard part here, not the offline storage itself
Simply storing data locally on the device while a user is offline is genuinely the easy half of this whole problem. The genuinely hard half is properly resolving conflicts when a user makes real changes while offline on two entirely different devices, then eventually reconnects both, and the two resulting versions of the data disagree with each other. We now design an explicit, well-considered conflict resolution strategy well before actually building any offline support, rather than discovering the real problem later as an awkward edge case during testing.
A clear, honest offline state beats a silent, confusing failure every time
An app that fails silently, or shows only a generic, unhelpful error message when genuinely offline, reads immediately to a real user as simply broken. An app that instead clearly and explicitly communicates something like "you're currently offline, here's exactly what's still available to you, here's what will automatically sync once you reconnect" reads as genuinely well-designed and trustworthy, even though the actual underlying technical limitation is functionally identical in both cases.
How we prioritize which screens get offline support first
We rank screens by two factors: how often a user is likely to be genuinely offline when they'd want to use that specific screen, and how bad the consequence is if they can't. A transit app's schedule screen ranks high on both counts. A settings screen ranks low on both. That ranking, not a generic feature checklist, is what actually determines where we spend the real engineering effort.
How we communicate this scoping decision back to the client clearly
We document the offline-support ranking explicitly in the project spec, screen by screen, so a client can see and agree with the reasoning before development starts, rather than discovering later that one specific screen they cared about doesn't work offline and feeling blindsided by a decision that was actually made deliberately, just never communicated clearly enough.
We document the offline-support ranking explicitly in the project spec, screen by screen, so a client can see and agree with the reasoning before development starts, rather than discovering later that one specific screen they cared about doesn't work offline and feeling blindsided by a decision that was actually made deliberately, just never communicated clearly enough.
How we actually test offline behavior before an app ships
Simulating offline conditions in a controlled testing environment misses a lot of the messier, more realistic scenarios real users actually encounter: a connection that drops mid-request rather than cleanly before it starts, a genuinely flaky connection that toggles between weak signal and no signal repeatedly rather than a clean binary online-or-offline state. We test explicitly against these messier, more realistic patterns, not just the simple airplane-mode-on scenario that's easiest to simulate in a testing environment.
This more realistic testing approach has caught genuine bugs that a simple offline simulation missed entirely, particularly around partial data syncs that left an app in a genuinely inconsistent, confusing state after a connection dropped and reconnected at an inconvenient moment mid-transaction.
What a good offline-first architecture actually costs relative to bolting it on later
Building genuine offline support in from the start, with a data layer designed around local-first storage and background sync from day one, costs real additional engineering time upfront, and it's considerably cheaper than retrofitting the same capability onto an app that was originally built assuming a constant, always-on connection. We've quoted both scenarios for different clients, and the retrofit consistently runs meaningfully more expensive than building it in from the beginning would have, mostly due to the amount of existing code that has to be reworked to properly support a fundamentally different underlying data model.
We now raise this specific tradeoff explicitly during initial scoping for any app where offline use is even a plausible future consideration, since the cost difference between building it in early versus retrofitting it later is large enough that it genuinely deserves a deliberate, informed decision rather than getting deferred by default and revisited only once real user complaints eventually force the issue.
A specific example of offline support directly preventing a wave of bad reviews
One client's field-service app, used primarily by technicians working inside buildings with genuinely poor cellular coverage, initially shipped without meaningful offline support, and negative reviews specifically citing lost work and app crashes when connectivity dropped began appearing within the first two weeks after launch. We prioritized an offline-first rework of the core job-logging screen, the single feature technicians actually needed most while genuinely offline, and shipped it within three weeks of identifying the pattern in the review data.
Review sentiment around this specific issue improved noticeably within the following month, and the client's own support ticket volume related to lost work dropped by a clearly measurable amount. It's a concrete, real example we now use with other prospective clients building apps for field workers or other genuinely connectivity-challenged real-world use cases.
How we now ask about connectivity conditions during initial app scoping
We now ask a specific, direct question during discovery for every new mobile app project: where physically will most users actually be when they're using this, and what does the real, honest cellular and wifi coverage genuinely look like in those specific locations. This question alone has surfaced offline requirements that a founder hadn't initially thought to mention, simply because they'd never had to think carefully about their own users' actual physical environment and connectivity conditions before building the product.
Asking this early, before any architecture decisions are locked in, costs almost nothing and avoids the considerably more expensive retrofit scenario described earlier, which is exactly why it's now a standard, required part of our discovery questionnaire for every mobile project we scope.