Android 17 ships a system-level Handoff API that lets a user start something on their phone and pick it up on a tablet, another phone, or the web, without losing their place. The system captures “ephemeral state” — scroll position, form input, video playback timestamp — and offers it as a suggestion in the launcher of nearby signed-in devices. For users, that’s a small piece of magic. For anyone measuring engagement, retention, or funnel completion, it’s a new way for a single continuous journey to look like two unrelated sessions on two different install IDs.
Most analytics stacks still assume a session belongs to one device. A user who starts checkout on their phone and finishes it on a tablet via Handoff will, by default, show up as an abandoned cart on device A and a fresh, contextless session on device B — no referring event, no funnel step one or two, just a purchase that appears to come from nowhere. Multiply that across onboarding flows, form completions, and any multi-step task, and Handoff quietly inflates both your drop-off numbers and your “new session” counts for what was actually one uninterrupted user action. Apps that adopt Handoff without instrumenting for it will see engagement metrics get noisier the more the feature succeeds.
Data Points to Track
- Handoff initiation events, firing when
setHandoffEnabled()is active and the system captures state for an activity, including which activity and what state was serialised - Handoff acceptance events, firing on the receiving device when a user taps the launcher suggestion, with the source device type and a shared identifier linking the two sessions
onHandoffActivityDataRequested()payload contents, logging exactly what state is being handed off so a continued session can be reconstructed and audited later- Cross-device session stitching keys — a stable user or account ID that ties the originating and receiving sessions together, separate from the per-device install ID
- Handoff fallback outcomes, distinguishing native app-to-app handoff from app-to-web fallback when the receiving device doesn’t have the app installed
- Time-to-resume, the gap between state capture on the origin device and resumption on the receiving device, as a signal for how “hot” the continuity actually is
Setup Steps
- Identify every activity worth continuing — checkout, onboarding, long-form input, media playback — and call
setHandoffEnabled()deliberately rather than leaving it off by default everywhere. - Emit a handoff-initiated event at the moment state is captured, tagging it with the activity name and a session-linking identifier tied to the signed-in account, not the device.
- Emit a handoff-accepted event in
onHandoffActivityDataRequested()on the receiving device, carrying the same linking identifier so the two events can be joined downstream. - Stitch sessions in your analytics pipeline using the shared identifier before funnel or retention reports run, so a handed-off journey rolls up as one session rather than two.
- Add a dashboard segment for Handoff-assisted conversions so product and growth teams can see how much of “abandoned then somehow purchased later” is actually successful continuity, not real drop-off.
Actionable Insights
Without session stitching, Handoff success looks identical to Handoff failure in most dashboards: both show up as an incomplete session on one device. Tracking the initiation and acceptance events separately, then joining them on a shared account identifier, turns Handoff from an invisible feature into a measurable one — you can see genuine adoption, spot activities where handoff is offered but never accepted (a sign the receiving-device experience isn’t good enough), and stop over-counting abandonment that was really just a user finishing on a different screen.
Related Resources
Need help tracking this in your app?
Our team sets up analytics pipelines for mobile and web teams every day. Talk to us and get your first events flowing in under an hour.
Talk to an expert