{"id":1743,"date":"2026-07-14T09:00:00","date_gmt":"2026-07-14T14:00:00","guid":{"rendered":"https:\/\/tolinku.com\/blog\/?p=1743"},"modified":"2026-03-07T03:50:06","modified_gmt":"2026-03-07T08:50:06","slug":"cross-device-attribution","status":"publish","type":"post","link":"https:\/\/tolinku.com\/blog\/cross-device-attribution\/","title":{"rendered":"Cross-Device Attribution: Tracking Users Across Devices"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Users do not live on a single device. A user might see your ad on their phone during their commute, research your product on their laptop at work, and finally convert on their tablet at home. Without cross-device attribution, each device looks like a separate user, and the conversion appears organic on the tablet while the phone ad and laptop visit get no credit.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This guide covers how cross-device attribution works. For web-to-app attribution, see <a href=\"https:\/\/tolinku.com\/blog\/web-to-app-attribution\/\">web-to-app attribution: bridging the gap<\/a>. For fingerprinting methods, see <a href=\"https:\/\/tolinku.com\/blog\/fingerprinting-vs-deterministic-matching\/\">fingerprinting vs deterministic matching<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Cross-Device Problem<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Why It Matters<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Consider a typical user journey for a fintech app:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li><strong>Phone (Day 1):<\/strong> Sees a Facebook ad for a savings account with 4.5% APY. Does not tap.<\/li>\n<li><strong>Laptop (Day 2):<\/strong> Searches for &quot;high yield savings account,&quot; finds the company&#39;s website, reads about features.<\/li>\n<li><strong>Phone (Day 3):<\/strong> Sees a retargeting ad. Taps it. Installs the app. Opens an account.<\/li>\n<\/ol>\n\n\n\n<p class=\"wp-block-paragraph\">Without cross-device attribution:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>The Facebook ad gets no credit (the install happened on a different session).<\/li>\n<li>The website visit appears as a separate user.<\/li>\n<li>The retargeting ad gets full credit for the install.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">With cross-device attribution:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>All three touchpoints are linked to the same user.<\/li>\n<li>The Facebook ad gets credit for awareness.<\/li>\n<li>The website visit gets credit for consideration.<\/li>\n<li>The retargeting ad gets credit for conversion.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Scale of the Problem<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Users typically have 3-5 connected devices. Studies show that <a href=\"https:\/\/www.thinkwithgoogle.com\/marketing-strategies\/app-and-mobile\/multi-device-consumer-path-to-purchase\/\" rel=\"nofollow noopener\" target=\"_blank\">60-70% of conversions involve more than one device<\/a>. Ignoring cross-device journeys means misattributing the majority of conversions.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deterministic Cross-Device Matching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Deterministic matching links devices by a known identifier, typically a logged-in user account.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">How It Works<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">When a user logs in on multiple devices with the same account (email, phone number, user ID), those devices are linked:<\/p>\n\n\n\n<pre><code>Phone: login(user@example.com) \u2192 Device A\nLaptop: login(user@example.com) \u2192 Device B\nTablet: login(user@example.com) \u2192 Device C\n\nAll three devices \u2192 same user graph\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Strengths<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>High accuracy.<\/strong> If the user logged in on both devices, the match is definitive.<\/li>\n<li><strong>Privacy-friendly.<\/strong> Based on first-party data (your own user accounts).<\/li>\n<li><strong>No guessing.<\/strong> No probabilistic models or assumptions.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Limitations<\/h3>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Requires login.<\/strong> Only works for logged-in users. Pre-login touchpoints (ads, website visits before signup) cannot be matched.<\/li>\n<li><strong>Limited graph.<\/strong> Only covers devices where the user has your app or has logged into your website.<\/li>\n<li><strong>Shared devices.<\/strong> A family tablet shared by multiple users creates false matches.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Implementation<\/h3>\n\n\n\n<pre><code class=\"language-typescript\">interface DeviceGraph {\n  userId: string;\n  devices: Device[];\n}\n\nfunction linkDevices(loginEvent: LoginEvent): void {\n  const userId = loginEvent.userId;\n  const deviceId = loginEvent.deviceId;\n  const deviceType = loginEvent.deviceType; \/\/ phone, tablet, desktop\n\n  \/\/ Add device to user&#39;s graph\n  const graph = deviceGraphDB.getOrCreate(userId);\n  graph.addDevice({\n    id: deviceId,\n    type: deviceType,\n    firstSeen: loginEvent.timestamp,\n    lastSeen: loginEvent.timestamp\n  });\n\n  \/\/ Retroactively attribute pre-login events on this device\n  const unattributedEvents = eventDB.getUnattributed(deviceId);\n  for (const event of unattributedEvents) {\n    event.userId = userId;\n    eventDB.update(event);\n  }\n}\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Probabilistic Cross-Device Matching<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Probabilistic matching uses statistical signals to infer that two devices belong to the same user, without a login-based identifier.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Signals Used<\/h3>\n\n\n\n<figure class=\"wp-block-table\"><table>\n<thead>\n<tr>\n<th>Signal<\/th>\n<th>Reliability<\/th>\n<th>Privacy Impact<\/th>\n<\/tr>\n<\/thead>\n<tbody><tr>\n<td>IP address<\/td>\n<td>Medium (shared networks create false matches)<\/td>\n<td>Low<\/td>\n<\/tr>\n<tr>\n<td>Location (GPS\/Wi-Fi)<\/td>\n<td>High (if precise)<\/td>\n<td>High<\/td>\n<\/tr>\n<tr>\n<td>Browser fingerprint<\/td>\n<td>Medium (changes over time)<\/td>\n<td>High<\/td>\n<\/tr>\n<tr>\n<td>Usage patterns (app open times)<\/td>\n<td>Low<\/td>\n<td>Medium<\/td>\n<\/tr>\n<tr>\n<td>Language\/locale settings<\/td>\n<td>Low<\/td>\n<td>Low<\/td>\n<\/tr>\n<tr>\n<td>ISP\/carrier<\/td>\n<td>Low<\/td>\n<td>Low<\/td>\n<\/tr>\n<\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\">How It Works<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">The system builds a probabilistic model that scores the likelihood two devices belong to the same user:<\/p>\n\n\n\n<pre><code class=\"language-python\">def calculate_match_probability(device_a, device_b):\n    score = 0.0\n\n    # Same IP address at the same time\n    if share_ip_simultaneously(device_a, device_b):\n        score += 0.4\n\n    # Same Wi-Fi network\n    if same_wifi_network(device_a, device_b):\n        score += 0.3\n\n    # Similar usage patterns (both active at similar times)\n    time_correlation = calculate_time_correlation(device_a, device_b)\n    score += time_correlation * 0.15\n\n    # Same language and locale\n    if device_a.locale == device_b.locale:\n        score += 0.05\n\n    # Same carrier\/ISP\n    if device_a.carrier == device_b.carrier:\n        score += 0.05\n\n    # Penalty for different geographies\n    if not same_city(device_a, device_b):\n        score -= 0.3\n\n    return min(max(score, 0.0), 1.0)\n<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Accuracy<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Probabilistic matching typically achieves 60-80% accuracy. This means 20-40% of matches are wrong (false positives linking different users) or missed (false negatives failing to link the same user).<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Privacy Concerns<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Probabilistic cross-device tracking is under increasing regulatory scrutiny:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><a href=\"https:\/\/gdpr.eu\/\" rel=\"nofollow noopener\" target=\"_blank\">GDPR<\/a>:<\/strong> Probabilistic matching that creates a profile of users across devices likely constitutes profiling under GDPR and requires consent.<\/li>\n<li><strong><a href=\"https:\/\/developer.apple.com\/documentation\/apptrackingtransparency\" rel=\"nofollow noopener\" target=\"_blank\">ATT<\/a>:<\/strong> Apple considers cross-device linking as &quot;tracking&quot; and requires ATT consent on iOS.<\/li>\n<li><strong>Browser restrictions:<\/strong> Safari, Firefox, and Chrome are blocking or restricting the fingerprinting signals that probabilistic matching relies on.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Platform-Provided Solutions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">Google Signals<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/support.google.com\/analytics\/answer\/7532985\" rel=\"nofollow noopener\" target=\"_blank\">Google Signals<\/a> uses logged-in Google account data to link devices. When a user is signed into their Google account on multiple devices, Google can provide cross-device attribution within Google Analytics and Google Ads.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Apple&#39;s SKAdNetwork<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/developer.apple.com\/documentation\/storekit\/skadnetwork\/\" rel=\"nofollow noopener\" target=\"_blank\">SKAdNetwork<\/a> does not support cross-device attribution. Each install is attributed independently on the device where it occurred.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Privacy Sandbox (Android)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Google&#39;s <a href=\"https:\/\/developer.android.com\/design-for-safety\/privacy-sandbox\" rel=\"nofollow noopener\" target=\"_blank\">Privacy Sandbox<\/a> does not include a cross-device attribution API. Attribution is per-device.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Deep Links for Cross-Device Journeys<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Deep links can bridge cross-device journeys by carrying context:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Email as a Cross-Device Bridge<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A user browses products on their laptop, adds items to a wishlist, and receives a deep-linked email. When they tap the email on their phone, the deep link opens the app to their wishlist:<\/p>\n\n\n\n<pre><code>https:\/\/links.app.com\/wishlist?user_ref=encrypted_user_id\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The email serves as a deterministic cross-device bridge because it is sent to a known user who opens it on a different device.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">QR Codes<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">A QR code on a desktop screen opens the app on the user&#39;s phone:<\/p>\n\n\n\n<pre><code>https:\/\/links.app.com\/checkout\/CART-123?source=desktop_qr\n<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">The QR code links the desktop session to the mobile install\/open.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">SMS\/Push to App<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">After a web session, send an SMS with a deep link to continue in the app:<\/p>\n\n\n\n<pre><code>Continue in the app: links.app.com\/continue?session=abc123\n<\/code><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">Measurement Without Cross-Device Tracking<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If cross-device tracking is not feasible (privacy constraints, insufficient login rates), you can still estimate cross-device impact:<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Survey-Based Attribution<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ask new users how they first heard about the app:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>&quot;Where did you first learn about us?&quot; (options: social media ad, web search, friend recommendation, etc.)<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\">Marketing Mix Modeling (MMM)<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Use aggregate data (total ad spend, total installs) to model the relationship between marketing activities and conversions without user-level tracking. See <a href=\"https:\/\/tolinku.com\/blog\/media-mix-modeling-apps\/\">media mix modeling for apps<\/a> for details.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Incrementality Testing<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Run controlled experiments (geographic holdouts or randomized treatment\/control) to measure the true impact of campaigns across all devices.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tolinku for Cross-Device Attribution<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/tolinku.com\/features\/analytics\">Tolinku&#39;s analytics<\/a> track deep link clicks with attribution parameters that persist across devices. When a user clicks a Tolinku deep link on one device and converts on another (via email, QR code, or shared link), the attribution context is preserved. Configure cross-device tracking in the <a href=\"https:\/\/tolinku.com\/docs\/concepts\/attribution\/\">Tolinku dashboard<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For mobile attribution, see <a href=\"https:\/\/tolinku.com\/blog\/mobile-attribution-developers-guide\/\">mobile attribution: a developer&#39;s guide<\/a>. For web-to-app attribution, see <a href=\"https:\/\/tolinku.com\/blog\/web-to-app-attribution\/\">web-to-app attribution: bridging the gap<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Attribute conversions across phones, tablets, and desktops. Learn deterministic and probabilistic approaches to cross-device measurement.<\/p>\n","protected":false},"author":2,"featured_media":1742,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"rank_math_title":"Cross-Device Attribution: Tracking Users Across Devices","rank_math_description":"Attribute conversions across phones, tablets, and desktops. Learn deterministic and probabilistic approaches to cross-device measurement.","rank_math_focus_keyword":"cross-device attribution","rank_math_canonical_url":"","rank_math_facebook_title":"","rank_math_facebook_description":"","rank_math_facebook_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-cross-device-attribution.png","rank_math_facebook_image_id":"","rank_math_twitter_title":"","rank_math_twitter_description":"","rank_math_twitter_image":"https:\/\/tolinku.com\/blog\/wp-content\/uploads\/2026\/03\/og-cross-device-attribution.png","footnotes":""},"categories":[14],"tags":[37,28,520,341,20,69,36,33],"class_list":["post-1743","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-analytics","tag-analytics","tag-attribution","tag-campaign-measurement","tag-cross-device","tag-deep-linking","tag-mobile-development","tag-privacy","tag-user-experience"],"_links":{"self":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1743","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/comments?post=1743"}],"version-history":[{"count":3,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1743\/revisions"}],"predecessor-version":[{"id":2695,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/posts\/1743\/revisions\/2695"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media\/1742"}],"wp:attachment":[{"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/media?parent=1743"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/categories?post=1743"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tolinku.com\/blog\/wp-json\/wp\/v2\/tags?post=1743"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}