Deep linking intersects with user privacy at every step. Click tracking collects IP addresses and device fingerprints. Deferred deep links match pre-install clicks to post-install opens using device attributes. Attribution sends user-level data to third-party services. Each of these practices has privacy implications under regulations like GDPR, CCPA, and platform policies like Apple's App Tracking Transparency (ATT).
This guide covers how to implement deep linking while respecting user privacy. For deep link security, see deep linking security: preventing hijacking and abuse. For the complete overview, see the complete guide to deep linking in 2026.
Privacy Regulations and Deep Links
GDPR (EU)
The General Data Protection Regulation affects deep link analytics:
| Data Collected | GDPR Classification | Requirement |
|---|---|---|
| IP address | Personal data | Legal basis required |
| Device fingerprint | Personal data | Legal basis required |
| Click timestamp | Not personal data (alone) | Generally safe |
| Route/URL clicked | Not personal data (alone) | Generally safe |
| Aggregated click counts | Not personal data | No restrictions |
| Country-level geolocation | Borderline | Legitimate interest may suffice |
| City-level geolocation | Personal data | Consent or legitimate interest |
Practical impact: If you collect IP addresses for click analytics, you are processing personal data under GDPR. You need either user consent or a legitimate interest basis.
Best practice: Anonymize IP addresses after geolocation lookup (truncate the last octet: 192.168.1.xxx). This reduces the data's personal nature while preserving geographic analytics.
CCPA (California)
The California Consumer Privacy Act requires:
- Disclosure: Tell users what data you collect from deep link clicks.
- Opt-out: Allow users to opt out of "sale" of personal information (note: sharing data with third-party analytics tools may qualify as "sale" under CCPA).
- Deletion: Honor requests to delete click data associated with a user.
App Tracking Transparency (iOS)
Apple's ATT framework (iOS 14.5+) requires user permission before tracking them across apps and websites. This directly affects:
- Deferred deep links that use fingerprinting. Matching a web click to an app open using device attributes is considered "tracking" under ATT.
- IDFA-based attribution. You need ATT consent to access the IDFA for attribution.
- Third-party analytics SDKs that send data to external servers for cross-app tracking.
What ATT does NOT affect:
- Direct deep links (Universal Links, App Links) that simply open the app to the right screen.
- First-party analytics that stay within your own infrastructure.
- Contextual deep links that pass data through URL parameters (no device fingerprinting needed).
Android Privacy Sandbox
Google's Privacy Sandbox for Android introduces:
- Topics API: Replaces third-party cookie-based interest targeting.
- Attribution Reporting API: Provides privacy-preserving attribution without user-level tracking.
- FLEDGE: On-device ad auction without revealing user data to advertisers.
These changes primarily affect ad-driven attribution, not direct deep linking.
Privacy-Impacting Deep Link Practices
Device Fingerprinting
Deferred deep links often use fingerprinting to match a click to an install:
Click event:
IP: 192.168.1.42
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 18_2...)
Screen: 393x852
Language: en-US
First app open:
IP: 192.168.1.42
Device: iPhone 16
Screen: 393x852
Language: en-US
Match confidence: 92% → Attribute install to the click
Privacy concern: Fingerprinting collects and correlates device attributes without explicit consent. Apple explicitly considers this tracking under ATT, and regulators increasingly scrutinize it under GDPR.
Privacy-safe alternative: Use platform-provided attribution (SKAdNetwork on iOS, Attribution Reporting API on Android) supplemented by first-party data (user login, URL parameters passed through the install flow).
Click-Level Tracking
Recording every click with full detail creates a rich dataset that may include personal information:
// High-detail click record (privacy concerns)
interface ClickRecord {
clickId: string;
timestamp: Date;
url: string;
ip: string; // Personal data under GDPR
userAgent: string; // Partial fingerprint
referrer: string;
country: string;
city: string; // City + timestamp can identify individuals
screenSize: string; // Fingerprinting attribute
language: string; // Fingerprinting attribute
}
// Privacy-preserving click record
interface PrivacyClickRecord {
clickId: string;
timestamp: Date; // Round to hour, not second
url: string;
country: string; // Country only, not city
platform: string; // iOS/Android/Web, not full UA
source: string; // UTM source
}
Third-Party Data Sharing
Sending click data to third-party analytics services may constitute "tracking" (ATT) or "sale" (CCPA):
| Practice | ATT Impact | GDPR Impact | CCPA Impact |
|---|---|---|---|
| Sending clicks to your own analytics server | No ATT required | Legal basis needed | Disclosure needed |
| Sending clicks to a third-party SDK | ATT consent required | Data processing agreement needed | May be "sale" |
| Sharing IDFA with ad networks | ATT consent required | Consent needed | Is "sale" |
| Using SKAdNetwork postbacks | No ATT required | Minimal personal data | Not "sale" |
Privacy-Safe Deep Linking
First-Party Data Strategy
Rely on data you collect yourself rather than third-party tracking:
- URL parameters survive the install. Pass campaign data through the app store URL:
// Android: Use referrer parameter
const playStoreUrl = `https://play.google.com/store/apps/details?id=com.yourapp&referrer=${encodeURIComponent('utm_source=email&utm_campaign=summer&deep_link=/products/123')}`;
// iOS: Use clipboard (with user consent) or SKAdNetwork
- Authenticated attribution. If the user is logged in on the web and in the app, you can attribute without device fingerprinting:
function attributeViaLogin(webUserId: string, appUserId: string) {
// Same user, different devices, no fingerprinting needed
if (webUserId === appUserId) {
attributeClicksToUser(appUserId);
}
}
- Contextual deep links. Pass the content directly in the URL instead of looking it up from a click database:
// Instead of: https://app.example.com/c/abc123 (requires server lookup)
// Use: https://app.example.com/products/summer-sale?ref=email&campaign=july
// All context is in the URL itself, no fingerprinting needed
Privacy-Preserving Analytics
Collect analytics without personal data:
function recordPrivacyClick(req: Request, deepLink: string) {
const record = {
// Generate a random click ID (not derived from user data)
clickId: crypto.randomUUID(),
// Truncate timestamp to the hour
timestamp: new Date().toISOString().substring(0, 13) + ':00:00Z',
// Route only, not the full URL with parameters
route: new URL(deepLink).pathname,
// Country from IP, then discard the IP
country: geoLookup(req.ip).country,
// DO NOT store req.ip
// Platform category, not full user agent
platform: detectPlatform(req.headers['user-agent']),
// DO NOT store full user agent
// Source from UTM parameter
source: new URL(deepLink).searchParams.get('utm_source') || 'direct'
};
analytics.insert(record);
}
Consent Management
If you need to collect detailed analytics, get consent:
async function handleDeepLinkClick(req: Request) {
const hasConsent = await checkConsent(req);
if (hasConsent) {
// Full analytics with IP, user agent, city, etc.
recordDetailedClick(req);
} else {
// Privacy-preserving analytics only
recordPrivacyClick(req);
}
// Deep link routing works regardless of consent
return resolveDeepLink(req.url);
}
Deep link functionality (opening the right screen) does not require consent. Only analytics (tracking who clicked what) may require consent depending on what data you collect.
Data Retention
Retention Policies
| Data Type | Recommended Retention | Reason |
|---|---|---|
| Aggregated metrics (daily counts) | Indefinite | Not personal data |
| Click records (anonymized) | 90 days | Troubleshooting and recent analysis |
| Click records (with IP) | 30 days | Minimize personal data storage |
| Device fingerprint matches | 24-48 hours | Only needed for deferred deep link matching |
| Raw user agent strings | 7 days | Debugging only |
// Automated data cleanup
async function cleanupOldData() {
// Delete IP addresses after 30 days
await db.query(`
UPDATE click_records
SET ip_address = NULL, user_agent = NULL
WHERE timestamp < NOW() - INTERVAL '30 days'
`);
// Delete fingerprint match data after 48 hours
await db.query(`
DELETE FROM fingerprint_matches
WHERE created_at < NOW() - INTERVAL '48 hours'
`);
}
Tolinku for Privacy-Safe Deep Linking
Tolinku uses first-party data for deep link analytics, with IP anonymization and configurable data retention. See the attribution documentation for privacy-preserving attribution options.
For security, see deep linking security: preventing hijacking and abuse. For attribution, see mobile attribution: a developer's guide.
Get deep linking tips in your inbox
One email per week. No spam.