The Problem
Platform Numbers Didn't Add Up
Attribution Overlap: Meta, Google, and TikTok each reported conversions using their own attribution windows. The same customer journey could therefore be credited to multiple platforms, overstating aggregate marketing performance.
Demand Capture vs. Demand Creation: Meta Retargeting reported strong ROAS, but platform attribution alone could not determine whether those conversions were actually caused by advertising or would have occurred through Organic, Direct, or another marketing channel.
The core business problem was not simply determining which channel received credit for a conversion. It was determining: Which channels actually created additional customer demand?
Approach
From Raw Touchpoints to Marketing Decisions
1. Unified Marketing Data Pipeline
The analysis combines marketing spend, user touchpoints, campaign metadata, and backend conversion records into a unified analytical dataset.
- Ad Spend Data: Campaign spend and platform-reported metrics from Meta, Google Search, and TikTok.
- User Touchpoint Logs: Clickstream events containing user IDs, timestamps, channels, campaigns, and UTM parameters.
- Backend Conversions: Ground-truth purchase records used to validate conversion events independently of ad platform claims.
2. Customer Journey Reconstruction
Before assigning attribution, customer interactions were reconstructed chronologically to understand how users moved across channels before converting.
Example journey:
PostgreSQL window functions and CTEs were used to sequence touchpoints, identify first and last interactions, and calculate each channel's position within the customer journey.
3. SQL Multi-Touch Attribution
Built a SQL-based attribution layer using PostgreSQL window functions, CTEs, and customer journey sequencing to compare five attribution models side-by-side.
- First-Touch: Credits the channel responsible for customer discovery.
- Last-Touch: Credits the final interaction before conversion.
- Linear: Distributes credit equally across all touchpoints.
- Time-Decay: Assigns greater credit to interactions closer to conversion.
- Position-Based: Assigns greater weight to the first and last touchpoints while distributing the remaining credit across middle interactions.
4. Geo-Holdout Incrementality Testing
Attribution models estimate which channels should receive credit. Incrementality testing answers a different question:
Would this conversion have happened without the marketing intervention?
- Conducted a 30-day matched-market geo-holdout experiment across treatment and control DMAs.
- Compared conversion outcomes between markets where campaigns remained active and matched markets where campaigns were held out.
- Estimated Incremental Conversions, Conversion Lift, Incremental CAC, and Incremental ROAS.
Attribution Findings
Attribution Changes the Story
Comparing multiple attribution models showed that channel performance depended heavily on how conversion credit was assigned.
true channel impact
| Channel | Platform | First | Last | Linear | Time-Decay | Position |
|---|---|---|---|---|---|---|
| Meta Paid Social | 3.25x | 2.38x | 1.46x | 2.05x | 1.72x | 1.88x |
| Google Paid Search | 2.80x | 1.95x | 3.10x | 2.54x | 2.88x | 2.76x |
| TikTok Ads | 1.60x | 2.45x | 0.90x | 1.78x | 1.42x | 2.10x |
Meta appeared strongest under platform-reported attribution but consistently received less credit when the full customer journey was considered.
TikTok showed the opposite pattern: weak last-touch performance but strong first-touch and position-based performance, suggesting that the channel contributed more to demand creation than demand capture.
Incrementality Findings
The Incrementality Reality Check
Attribution models provide different ways to distribute credit. Incrementality testing was used to validate whether that attributed performance translated into true causal impact.
| Channel | Platform ROAS | Attributed ROAS Range | Incremental ROAS |
|---|---|---|---|
| Meta Paid Social | 3.25x | 1.46x – 2.38x | 1.26x |
| Google Paid Search | 2.80x | 1.95x – 3.10x | 2.65x |
| TikTok Ads | 1.60x | 0.90x – 2.45x | 2.10x |
Meta's platform ROAS of 3.25x masked a modeled incremental ROAS of 1.26x.
Attribution models consistently showed that Meta captured credit late in the customer journey, while geo-holdout testing suggested that a meaningful portion of those conversions may have occurred without Meta exposure.
TikTok showed the opposite pattern: weaker last-touch performance but stronger first-touch and incremental performance. This suggested that TikTok was more effective at creating demand than capturing existing demand.
Recommendation
From Measurement to Budget Decisions
The goal of the analysis was not simply to compare metrics. The final step was translating measurement results into clear marketing decisions.
Meta Paid Social
High Platform ROAS → Low Incremental ROAS → Reduce Retargeting Spend
Meta Retargeting appeared to capture conversions generated by other channels and organic demand. The recommendation was to reduce spend in saturated retargeting segments and prioritize higher-value audiences.
Google Paid Search
Strong Last-Touch + Strong Incremental ROAS → Increase High-Intent Budget
Google Search showed strong performance near conversion and maintained high incremental efficiency, supporting additional investment in high-intent campaigns.
TikTok Ads
Weak Last-Touch + Strong First-Touch + Strong Incrementality → Increase Prospecting Investment
TikTok was undervalued by last-touch attribution but demonstrated stronger top-of-funnel contribution and incremental impact, supporting increased investment in prospecting campaigns.
Modeled Business Impact
Budget Optimization Recommendation
The final output was designed as an interactive Streamlit decision-support dashboard that allows users to compare platform attribution, multi-touch attribution models, and incremental performance before evaluating budget allocation scenarios.
Tech Stack
Tools & Methods
Live App
Try the Dashboard
The full three-page Streamlit attribution dashboard is deployed and interactive. Explore multi-touch attribution models, geo holdout experiment results, and budget decision analysis with synthetic data.
Open live appSource Code
Code & Documentation
Full SQL attribution models, Python incrementality analysis, data generation scripts, and Streamlit dashboard code are available on GitHub.
View on GitHub