Data clean rooms are secure environments where two parties (typically an advertiser and a publisher or ad network) can match their first-party data without either party seeing the other's raw data. In mobile attribution, clean rooms let you measure campaign performance without sharing user-level data with ad networks, and without ad networks sharing their user data with you.
This guide explains how data clean rooms work for mobile attribution. For attribution and privacy regulations, see mobile attribution under GDPR. For SKAdNetwork, see SKAdNetwork and SKAN 5.0: complete developer guide.
Why Data Clean Rooms Exist
Traditional mobile attribution works by sharing user-level data between parties:
- Ad network shares click data (device ID, timestamp, campaign).
- Attribution provider matches clicks to installs using device IDs.
- Results are shared back to the ad network.
This model requires both parties to share raw user data, which conflicts with privacy regulations (GDPR, CCPA) and platform restrictions (ATT, Privacy Sandbox).
Data clean rooms solve this by providing a neutral environment where matching happens without data exposure.
How Clean Rooms Work
The Basic Flow
1. Advertiser uploads first-party data (user IDs, conversion events)
→ Data is encrypted/hashed before upload
2. Publisher/Ad Network uploads campaign data (impressions, clicks, user IDs)
→ Data is encrypted/hashed before upload
3. Clean room matches records using hashed identifiers
→ Neither party sees the other's raw data
4. Clean room outputs aggregate results
→ "Campaign X drove 1,200 installs with $45,000 revenue"
→ No user-level data is exposed
Privacy Protections
Clean rooms enforce privacy through several mechanisms:
| Protection | How It Works |
|---|---|
| Data isolation | Each party's data is stored separately and encrypted |
| No raw data export | Neither party can export the other's raw data |
| Aggregate-only output | Results are aggregated (no individual user records) |
| Minimum thresholds | Results with fewer than a minimum number of users (e.g., 50) are suppressed |
| Query restrictions | Only pre-approved queries are allowed (no arbitrary SQL) |
| Audit logging | All queries and access are logged for compliance |
Clean Room Providers
Major Platforms
| Provider | Type | Strengths |
|---|---|---|
| Google Ads Data Hub | Walled garden | Access to Google's ad data (Search, YouTube, Display) |
| Meta Advanced Analytics | Walled garden | Access to Meta's ad data (Facebook, Instagram) |
| AWS Clean Rooms | Infrastructure | Flexible, use with any data partner |
| Snowflake Data Clean Rooms | Infrastructure | SQL-based, integrates with existing Snowflake data |
| InfoSum | Independent | Decentralized (data never leaves your infrastructure) |
| LiveRamp Data Collaboration | Independent | Identity resolution + clean room |
Walled Garden vs. Infrastructure Clean Rooms
Walled garden clean rooms (Google, Meta) are built by the ad platform itself. You bring your conversion data; they have the ad exposure data. You can only measure campaigns on that specific platform.
Infrastructure clean rooms (AWS, Snowflake) provide the technology, and you choose your data partners. More flexible but require more setup.
Clean Rooms for Mobile Attribution
Measuring Install Campaigns
Instead of sharing device IDs with an ad network for real-time attribution, you can use a clean room for aggregate measurement:
-- Example clean room query (aggregate results only)
SELECT
campaign_id,
ad_group_id,
COUNT(DISTINCT matched_users) AS attributed_installs,
SUM(revenue_30d) AS revenue,
SUM(revenue_30d) / COUNT(DISTINCT matched_users) AS revenue_per_install
FROM
advertiser_installs
JOIN
publisher_impressions
ON
hashed_user_id = hashed_user_id
WHERE
impression_time < install_time
AND install_time - impression_time < INTERVAL '7 days'
GROUP BY
campaign_id, ad_group_id
HAVING
COUNT(DISTINCT matched_users) >= 50 -- minimum threshold
Comparing to Traditional Attribution
| Aspect | Traditional Attribution | Clean Room Attribution |
|---|---|---|
| Data sharing | User-level data shared between parties | No raw data shared |
| Granularity | User-level (real-time) | Aggregate (batch) |
| Latency | Real-time (seconds to minutes) | Batch (hours to days) |
| Campaign optimization | Real-time bidding optimization | Post-campaign analysis |
| Privacy compliance | Requires consent for data sharing | Privacy-safe by design |
| Cost | Included in attribution provider fee | Separate cost (query fees, infrastructure) |
| Complexity | Low (SDK integration) | High (data engineering required) |
When Clean Rooms Make Sense
Good Use Cases
- Measuring walled garden campaigns. Google and Meta campaigns where you want deeper analysis than the standard dashboard provides.
- Cross-publisher measurement. Comparing performance across multiple ad networks without sharing data between them.
- Privacy-regulated markets. EU markets where GDPR restricts user-level data sharing.
- Post-ATT iOS measurement. Supplementing SKAdNetwork data with aggregate clean room analysis.
- High-spend campaigns. When campaign budgets justify the cost and complexity of clean room setup.
When Clean Rooms Are Overkill
- Small ad budgets. If you spend less than $50,000/month on mobile ads, the standard attribution provider reports are sufficient.
- Real-time optimization. Clean rooms provide batch results, not real-time signals for bidding.
- Simple attribution needs. If last-click attribution from your provider meets your needs, clean rooms add complexity without proportional value.
Implementation Considerations
Data Preparation
Your first-party data must be prepared before upload:
import hashlib
def prepare_for_clean_room(user_data):
prepared = []
for user in user_data:
record = {
# Hash PII before upload
'hashed_email': hashlib.sha256(
user['email'].lower().strip().encode()
).hexdigest(),
'hashed_phone': hashlib.sha256(
user['phone'].strip().encode()
).hexdigest() if user.get('phone') else None,
# Non-PII conversion data (sent as-is)
'install_date': user['install_date'],
'revenue_7d': user['revenue_7d'],
'revenue_30d': user['revenue_30d'],
'subscription_status': user['subscription_status'],
'country': user['country']
}
prepared.append(record)
return prepared
Match Rates
Clean rooms match users based on shared identifiers (typically hashed email or phone). Match rates vary:
| Identifier | Typical Match Rate |
|---|---|
| Hashed email | 30-60% (depends on whether users signed up with the same email on both platforms) |
| Hashed phone | 20-40% |
| MAID (device ID) | Declining (ATT, Privacy Sandbox) |
| Combined (email + phone) | 40-70% |
A 50% match rate means half of your users cannot be measured through the clean room. Factor this into your analysis.
Cost
Clean room costs include:
- Infrastructure fees. AWS Clean Rooms charges per query. Snowflake charges per compute credit.
- Data preparation. Engineering time to format and upload data.
- Analysis. Data science time to write queries and interpret results.
- Ongoing maintenance. Regular data uploads and query updates.
Expect $5,000-$50,000/month depending on scale and complexity.
Tolinku for Privacy-Safe Attribution
Tolinku's analytics provide deep link attribution without requiring user-level data sharing with third parties. Click and conversion data stays in your Tolinku dashboard. Configure privacy-safe tracking in the Tolinku dashboard.
For mobile attribution, see mobile attribution: a developer's guide. For GDPR compliance, see mobile attribution under GDPR.
Get deep linking tips in your inbox
One email per week. No spam.