Health Data on Mobile: HealthKit, Health Connect, and the Permission Puzzle
Platform health stores are a goldmine with a permission gate. How to design health sync that users trust and platforms allow.

Health Data on Mobile: HealthKit, Health Connect, and the Permission Puzzle
Every fitness, sleep, and wellness app eventually faces the same gate: the user's health data lives in a platform store — HealthKit on iOS, Health Connect on Android — and getting to it means asking for permission at exactly the right moment, in exactly the right way. Ask too early and users refuse. Ask too broadly and they get suspicious. Sync naively and you get gaps, duplicates, and angry support tickets about missing workouts.
Health data is the most permission-sensitive data on the phone. It is also the most valuable: steps, workouts, sleep, and heart rate are the raw material for habit loops, coaching, and retention. The teams that win at health features are the ones that design the permission journey, the sync architecture, and the privacy story as one product decision.
Why Health Data Is Different From Any Other Permission
Camera and location permissions are transactional. The user understands the exchange immediately: grant the camera, take a photo. Health data is different in three ways that change the whole design problem.
First, the value is delayed. A user grants step-count access today, and the payoff — a weekly trend, a streak, a coaching insight — arrives days later. At the moment of the ask, they are being asked to trust you on spec.
Second, the data feels intimate in a way location does not. Steps feel harmless; resting heart rate and sleep patterns feel medical. Users grant health permissions to apps they trust, not apps they merely tolerate. One creepy moment — a heart-rate insight surfaced in a push notification, a sleep score shared in a social feed by default — and trust is gone for good.
Third, the platforms treat health data as a special category. Apple reviews HealthKit usage with extra scrutiny, requires a privacy policy, and rejects apps that use health data for advertising or sell it to third parties. Google's Health Connect has its own declaration process, permission tiers, and Play policy requirements. The permission puzzle is not just UX. It is compliance, and getting it wrong can block your release.
The product consequence is simple: health sync is not a feature you bolt on after the core loop works. The permission journey, the data model, and the privacy story are the feature.
The Two Stores: HealthKit and Health Connect
Apple's HealthKit has been around since 2014, and it shows in the best way: the model is mature, the permission granularity is fine, and users understand what they are sharing. An app requests read access per data type — steps, workouts, sleep analysis, heart rate — and the user can approve some types and deny others. Your app never learns which types were denied. It just sees no data for them, which forces you to design for partial access from day one.
Health Connect is Google's answer, and it consolidates what used to be a fragmented mess of Google Fit APIs and vendor SDKs. On modern Android, Health Connect is the single store for health and fitness data, with a similar per-type permission model and a permission screen that groups data into sensible categories. The catch is fragmentation of a different kind: Health Connect availability varies by Android version and device, some data types are read-only for most apps, and the permission declaration flow on Play adds a review step that can take days.
The practical difference that matters most for product teams is not the API shape. It is the permission UX. On iOS, the HealthKit permission sheet is a system sheet your app triggers, and it lists every data type you requested with individual toggles. On Android, the Health Connect permission screen is a separate system activity with grouped categories. Both are moments where your app is not in control of the screen — which means everything that happens before the sheet appears is your only chance to set context.
That asymmetry drives the single most important design decision in health features: never trigger the system sheet cold.
The Permission Journey: Earn the Ask Before You Make It
The highest-converting health apps treat permission as a three-act journey, not a dialog.
Act one is value before access. The user should experience the core loop — log a workout manually, set a goal, see a plan — before you ever mention health sync. The apps that ask for HealthKit access on the onboarding carousel, before the user has done anything, see grant rates that are dramatically lower than apps that wait until the third session. The reason is obvious once you say it: a stranger asking for your heart rate is creepy; a coach you have already used asking for your heart rate is helpful.
Act two is the priming screen. This is your screen, in your visual language, and it exists to answer the three questions every user silently asks: what data, why, and what happens if I say no. The best priming screens are specific — "We read your steps and workouts to build your weekly activity score" — not vague ("to improve your experience"). They show the data types as a short list, not a wall of toggles. And they always include the graceful-decline path: "You can connect later in Settings, and manual logging works fine." Paradoxically, telling users they can say no makes them more likely to say yes.
Act three is the system sheet itself, and your job here is to have already done the work. Request only the data types you actually use in the next two weeks of the user journey. Every type you request and never visibly use is a trust withdrawal. If your roadmap includes sleep analysis in quarter three, do not request sleep access in quarter one. Users notice, reviewers notice, and the permission screen itself becomes a moment of doubt: why does a step counter want my heart rate?
One more rule that sounds small and matters enormously: ask once, well, and never nag. If a user denies a type, do not re-trigger the sheet on every launch. Offer a quiet, in-context path back — a "Connect Health" row in Settings, or a contextual prompt the next time the user manually logs the exact thing sync would automate. The second ask should arrive at a moment of felt friction ("You just logged your third run by hand — want us to pull these in automatically?"), not on a timer.
Designing for Partial Access
Because both platforms let users approve some types and deny others, and because neither tells you which were denied, your product must work gracefully with partial data. This is where most health features quietly break.
Design every health-powered feature with a data-availability matrix in mind. For each feature, ask: what happens with full access, with partial access, and with no access? A weekly activity score that silently drops to zero when workout access is denied reads as a bug. A score that says "Based on steps only — connect workouts for the full picture" reads as honesty, and it converts: it is a contextual, low-pressure second chance at permission.
The same logic applies to the empty state. A blank health dashboard is a product failure, not a data failure. If there is no data yet, the screen should teach: what will appear here, what the user needs to do (connect, or just wait for tomorrow's sync), and how long until the first insight lands. Users who see a blank screen assume the app is broken and churn.
Partial access also affects your metrics. If you measure "percentage of users with health connected" as a binary, you will mislead yourself. Track it per data type, and track the feature-level consequence: what share of users see a complete weekly score, a partial one, or none at all. That is the number that predicts whether the health feature retains users or frustrates them.
Sync Is a Product Problem, Not Just an Engineering One
Once permission is granted, the sync itself creates product decisions that surface in the UI whether you plan for them or not.
Background delivery is limited on both platforms. HealthKit offers background delivery and observer queries, but delivery is opportunistic — the system decides when to wake your app, and it may batch updates. Health Connect has similar constraints, and on Android, battery optimization and manufacturer-specific background restrictions add another layer of unpredictability. The product consequence: never promise real-time. A step count that updates "as you move" sets an expectation the platform will break. A count that updates "a few times a day" is honest, and users accept it without thinking twice.
Data gaps are inevitable. Users switch watches, leave their phone at home, wear a tracker that syncs weekly, or take a rest week. Your trends, streaks, and averages must survive gaps without lying. The classic failure is the streak: a user with a 40-day streak who forgets their watch for a day loses everything, and the app that punishes them for a data gap loses the user too. The better pattern is gap-aware design: distinguish "no activity recorded" from "no data available," show the gap honestly in charts instead of interpolating silently, and build streak rules that forgive missing data (a rest day, a travel day) rather than treating every gap as a broken habit.
Duplicates are the other sync classic. A run recorded on a watch and a phone can arrive twice; a workout edited in one app can arrive as a second entry. Deduplication is an engineering task, but the visible symptom is a product one: a user whose weekly total is double-counted stops trusting every number you show. If you cannot dedupe perfectly — and nobody can — at least make totals reconcilable: show the underlying entries somewhere, so a suspicious user can check rather than assume the app is wrong.
Finally, deletion and correction matter more than teams expect. Users delete workouts, correct sleep times, and revoke access. Your app needs a story for each: when health data disappears upstream, does your derived insight silently change, or do you freeze it with a note? The apps users trust freeze history and annotate it. Rewriting someone's past week because they deleted a workout feels like gaslighting, even when it is technically correct.
The Privacy Story Is the Marketing
For health apps, privacy is not a compliance checkbox at the bottom of the settings screen. It is the pitch. Users choose health apps the way they choose doctors: on trust signals.
The concrete elements of that story are unglamorous and effective. A privacy policy written in plain language, linked from the permission priming screen — not buried three taps deep. A settings screen that shows exactly which data types are connected, with per-type disconnect that actually works. A clear statement about what never happens: no selling health data, no advertising use, no sharing without explicit action. And one feature that earns disproportionate trust: on-device processing where possible. If your weekly score is computed on the phone and only the score leaves the device, say so. Users understand "your health data stays on your phone" instantly, and it differentiates you from every competitor whose architecture they cannot inspect.
There is also a policy dimension that product teams ignore at their peril. Both stores can and do reject apps whose health data usage is unclear or overbroad. The review-safe pattern is boring on purpose: request the minimum types, describe the use in the permission purpose strings, keep the privacy policy current, and never use health data for anything outside the described purpose. The purpose strings themselves deserve product attention — on iOS, the usage description is user-visible copy, and the teams that treat it as product copy ("We use your step count to build your daily activity ring") convert better than teams that leave a placeholder.
One line to never cross, because it ends apps: using health data for advertising, or sharing it with data brokers. Both platforms prohibit it, users would revolt if they knew, and the reputational cost dwarfs any revenue it could produce. If a business model requires health data to leave the user's control, it is the wrong business model.
Metrics That Tell You Whether Health Sync Works
Health features need their own instrumentation, because the generic funnel hides the interesting failures.
Grant rate per data type is the headline metric: of users who see the priming screen, what share grants each type? A type with a much lower grant rate than its siblings is telling you something — either the priming copy does not justify it, or users do not believe you need it.
Time-to-first-value is the second: how long from grant to the first visible insight powered by synced data? If it is more than a day, your onboarding is promising something the sync cannot deliver yet, and the user will judge the feature before it has had a chance to work.
Sync health metrics — gap rate, duplicate rate, background delivery lag — belong on a dashboard the product team actually reads, not just in crash logs. A rising gap rate after an OS update is an early warning that something changed upstream, and catching it in days instead of weeks is the difference between a quiet fix and a wave of one-star reviews about missing workouts.
And the metric that ties it together: retention of connected versus unconnected users, compared honestly. Connected users almost always retain better, but the comparison is confounded — users who grant health access were already more engaged. The honest version segments by engagement at the time of grant, and asks whether sync adds retention on top of that baseline. When it does, you have a real moat. When it does not, the health feature is decoration, and the roadmap should say so.
Takeaways
Health data on mobile is a permission puzzle before it is a technical one. The platforms give you powerful stores and strict rules; the product work is everything around them.
Earn the ask before you make it: value first, a specific priming screen second, and only the data types you will visibly use in the next two weeks. Design for partial access from day one, because partial access is the normal case, not the edge case. Treat sync honestly — no real-time promises, gaps shown rather than hidden, streaks that forgive missing data. Make privacy the pitch, with plain-language policies, per-type disconnect, and on-device processing wherever you can. And measure the health funnel per data type, not as a binary, so you can see which asks are earning trust and which are spending it.
Get that right, and health sync stops being a permission headache and becomes what it should be: the quiet infrastructure that makes your app feel like it knows the user, without ever making them wonder what else it knows.