If your company has both a mobile app and a website, you've probably noticed a problem: the same person using both platforms shows up as two completely different users in your analytics.
Your website assigns them a visitor ID. Your app assigns them a device ID. These two systems have no way to know they're looking at the same person.
Why this happens
Every platform generates its own anonymous identifier:
-
Website: A visitor ID stored in localStorage or a cookie (e.g.,
visitor_8f2k) -
Android app: A device-scoped ID (e.g.,
device_x9m2) -
iOS app: Same concept, different ID (e.g.,
device_p4wn) -
In-app WebView: Yet another visitor ID (e.g.,
visitor_q7wv)
None of these systems talk to each other. So one real person browsing your site and using your app looks like 2, 3, or even 4 separate "unique users" in your data.
The impact
This isn't just a data quality issue. It causes real business problems:
- Inflated user counts — your "monthly active users" number is higher than reality
- Broken funnels — a user starting on web and converting in the app looks like a web drop-off
- Wasted ad spend — you're retargeting users who already converted, because your ad platform doesn't know they're the same person
- Blind support teams — when a user calls, your support team can't see what they just did in the app
Common approaches (and their limitations)
1. Wait for login
The simplest approach: once a user logs in on both platforms with the same account, you link them.
Problem: Many users never log in, or only log in on one platform. You're blind to anonymous cross-platform behavior, which is often the majority of your traffic.
2. Build it yourself in dbt
Some teams write SQL models that try to stitch identities together in the warehouse after the fact.
Problem: This gets complex fast. You need to handle edge cases like cascade merges (two already-merged profiles need to merge again), shared email addresses, and retroactive event re-tagging. Most DIY solutions break on these edge cases.
3. Use Segment's identity resolution
Segment has a basic identity graph that merges anonymous and known users.
Problem: It's limited — last-seen-wins merge logic, no WebView bridge, no real cross-platform stitching. If your user opens a WebView inside your app, Segment creates a brand new identity.
4. Enterprise tools (Celebrus, mParticle)
These handle identity resolution well but cost $50k-$500k/year and take months to integrate.
The WebView bridge problem
The hardest part of cross-platform identity is the WebView. When a user taps a link inside your app that opens a web page in an embedded browser (WKWebView on iOS, WebView on Android), a completely new web session starts. The web page has no idea it's running inside your app.
This is where most solutions fall short. The WebView session becomes an orphaned identity that never gets connected to the app user.
The solution is a bridge: the app SDK injects the device's visitor ID into the WebView's localStorage before the web page loads. The web SDK reads it and includes it with every event. The server sees both IDs and merges them — no login required.
How we solved this
We built CrossTrack specifically for this problem. It's a set of lightweight SDKs (Web, Android, iOS) that handle visitor ID generation, cross-platform session stitching, and WebView bridging automatically.
The SDKs send events to an identity resolution service that merges anonymous sessions into unified profiles. When identifiers overlap (same user logs in on both platforms, or a WebView bridge fires), profiles merge and all historical events get re-tagged to the surviving profile.
You can see this working in an interactive demo: https://crosstrack-demo.onrender.com
It walks through the full scenario — anonymous web visit, app open, WebView bridge, login on both platforms — and shows profiles merging in real-time.
If cross-platform identity is a problem your team deals with, take a look: https://crosstrackdata.com
Top comments (0)