September 2025
Multi-channel performance analysis across 7 channels, 10,000 sessions, and 4 attribution models. Goal: ad spend optimization.
Overview
A DTC telehealth startup was spending across seven marketing channels with no clear picture of which were actually driving revenue and which were just taking credit for conversions that would have happened anyways.
I built a full attribution analysis pipeline: simulated a GA4-style dataset, designed a normalized SQL schema, and ran attribution models (Last-Touch, First-Touch, Linear, and Markov Chain). Analysis extended into funnel drop-off, cohort behavior, SEO opportunity sizing, and demographic segmentation.
The result:
- 3 findings that fundamentally change how the budget should be allocated and a reallocation recommendation estimated to generate +$42K/quarter from a single change.
View Attribution Dashboard β View Deep Analysis Dashboard
Dataset & Tools
Dimension | Detail |
Sessions | 10,000 |
Conversions | 467 |
Ad Spend | $16,133 |
Time Period | May-July 2025 (3 Months) |
Dimension | Detail |
Data | ChatGPT-5 Prompt Engineering |
Database | PostgreSQL Β· Postico Β· Custom SQL Helper Views |
Analysis | Python Β· Pandas Β· SQL Β· Jupyter |
Attribution | Custom Markov Chain (Monte Carlo, 20K simulations) |
Visualization | Power BI |
Reporting | Slide Deck Β· PDF Report |
Key Metrics
Metric | Value |
Total Revenue | $68,200 |
Total Ad Spend | $16,133 |
Blended ROAS | 4.2x |
Conversions | 467 |
Overall CVR | 4.67% |
Avg Order Value | $164 |
Three Findings That Change Budget Decisions
Finding 1: Paid Social has zero incremental ROAS
Paid Social is the highest-spend channel at $8,036 β but the Markov Chain model, which measures true incremental contribution by simulating what happens when each channel is removed, assigns it 0% revenue credit.
- First-Touch attribution inflates it to 19.9% by capturing discovery sessions. But Markov reveals those users would have converted via other channels regardless. Paid Social isnβt initiating unique journeys β itβs appearing in journeys that were already going to convert.
This is the single most urgent reallocation opportunity in the dataset.
Finding 2: Display Retargeting is severely underinvested at 10.5x ROAS
Last-Touch only gives Display Retargeting 9.3% revenue credit. Markov Chain raises this to 24.3%, with a 10.5x ROAS β the highest of any paid channel.
- It also has the highest checkout completion rate of all channels at 76.1%. Despite all of this, its current budget is just $1,582 β the lowest of any paid channel and a fraction of the $8,036 going to Paid Social.
This is the clearest budget mismatch in the analysis.
Finding 3: SEO holds a $324K/year opportunity in two low-difficulty keywords
Mental health therapy is currently ranked #33 (6,818 searches/mo, low difficulty) and Online doctor is currently ranked #47 (5,604 searches/mo, low difficulty)
At current organic CVR (5.2%) and AOV ($164), moving either keyword to a top-3 position represents +$148-176K/mo in incremental organic revenue with no additional ad spend. Both are low difficulty β this is an execution problem, not a competition problem.
Attribution Model Comparison
All four models run on the same 467 conversions and $68,200 in revenue.
Channel | Last-Touch | First-Touch | Linear | Markov Chain | Verdict |
Paid Search | $19,750 | $16,225 | $17,834 | $31,835 | β
Scale |
Display Retarg. | $6,375 | $3,775 | $4,715 | $16,573 | β
Scale |
Direct | $8,775 | $5,125 | $7,069 | $12,996 | π΅ Maintain |
Organic Search | $14,250 | $16,825 | $14,146 | $6,796 | π΅ Maintain |
Email | $8,550 | $9,450 | $9,419 | β | π‘ Fix CRO |
Paid Social | $7,475 | $13,575 | $11,830 | β | π΄ Cut |
Referral | $3,025 | $3,225 | $3,186 | β | π΅ Maintain |
Why trust Markov Chain over Last-Touch?
Last-Touch gives 100% credit to the final channel before conversion β systematically overvaluing closers (Direct, Paid Search) and ignoring everything that built intent. Markov Chain calculates each channelβs removal effect: how much does the overall conversion rate drop when this channel is taken out of the model? Thatβs a much better proxy for true incremental value.
Paid Channel ROAS by Model
Channel | Spend | Last-Touch ROAS | Linear ROAS | Markov ROAS |
Paid Search | $6,583 | 3.0x | 2.7x | 4.8x |
Display Retargeting | $1,582 | 4.0x | 3.0x | 10.5x |
Paid Social | $8,036 | 0.93x | 1.5x | 0.0x |
Funnel Analysis
Conversion Funnel β Drop-Off by Stage
Stage | Unique Users | Drop-Off |
Page View | 18,065 | β |
Product View | 8,918 | β51% |
Add to Cart | 6,790 | β24% |
Checkout Start | 4,459 | β34% |
Purchase | 2,246 | β50% |
The biggest single drop isΒ checkout β purchase at 50%. At $164 AOV, recovering just 10% of those abandoned checkouts = ~$73K in incremental annual revenue.
Checkout Completion Rate by Channel
Channel | Checkout Completion |
Referral | 78.7% β
|
Display Retargeting | 76.1% β
|
Paid Social | 73.0% |
Direct | 72.4% |
Organic Search | 71.2% |
Paid Search | 71.1% |
Email | 67.8% β οΈ |
Email sits 10pp below the best-performing channels. This is almost certainly a landing page mismatch β users arrive from an email expecting a specific offer and hit a generic experience.
SEO Opportunity Sizing
Assumption: moving to top-3 position captures ~30% CTR. Organic CVR: 5.2%. AOV: $164.
Keyword | Current Position | Volume/Mo | Difficulty | Incr. Visits | Incr. Revenue/Mo |
mental health therapy | #33 β οΈ | 6,818 | LOW | +20,949 | +$176K/mo |
online doctor | #47 β οΈ | 5,604 | LOW | +17,598 | +$148K/mo |
telemedicine services | #23 | 2,428 | LOW | +7,220 | +$61K/mo |
vitamin supplements | #17 | 1,377 | MED | +3,936 | +$33K/mo |
skin care treatment | #22 | 1,121 | LOW | +3,317 | +$28K/mo |
at-home test kits | #2Β β
| 5,989 | MED | Already top-3 | β |
Top two keywords alone = $324K/year in incremental organic revenue, both at LOW keyword difficulty.
Cohort Analysis
Cohort | Users | CVR | Avg Days to Convert | Avg Order Value |
March 2025 | 1,504 | 15.2% | 95.7 days | $158 |
April 2025 | 1,496 | 13.7% | 62.7 days | $170 |
April's CVR is slightly lower, but the cohort convertsΒ 33 days fasterΒ and spendsΒ $12 more per order. Something changed between March and April β in targeting, onboarding, creative, or the product itself. That change is worth identifying and making permanent.
Demographic Performance
CVR & AOV by Age Group
Age | CVR | AOV |
18β25 | 16.7% | $153 |
26β34 | 14.6% | $154 |
35β44 | 15.0% | $165 |
45β54 | 15.2% | $173 |
55β69 | 16.1% | $169 |
TheΒ 45β54 groupΒ has the highest AOV ($173) despite a middle-of-pack CVR. They're the most valuable customers by revenue per conversion.
CVR by Device & Country
Segment | CVR | AOV |
Tablet | 16.3% | $153 |
Mobile | 15.6% | $170 |
Desktop | 15.4% | $160 |
UK | 16.3% | β |
Canada | 16.3% | β |
US | 15.6% | β |
Australia | 14.2% | β |
Australia's 14.2% CVR is notably below the rest. Worth investigating for UX or localisation issues. UK and Canada overindex on CVR relative to their revenue share β they're underpenetrated markets worth targeting.
Recommendations
# | Action | Why | Est. Impact |
01 | Reallocate 50% of Paid Social budget to Display Retargeting | 0x Markov ROAS vs 10.5x. Move $4K/mo from worst to best paid channel | +$42K/quarter |
02 | Build SEO content for 'mental health therapy' + 'online doctor' | Positions #33 and #47, both LOW difficulty. Pillar pages + backlinks | +$324K/year |
03 | Build dedicated landing pages for email campaigns | 67.8% checkout completion vs 76β78% elsewhere. Offer-matched copy | +8β11% email CVR |
04 | Audit what changed between March and April cohorts | April converts 33 days faster with $12 higher AOV. Find the lever, keep it | +$12 AOV |
05 | Test 45β54 creative in UK and Canada | Highest AOV segment ($173), best-converting markets. Localised messaging | +2β3% CVR |
What I'd Do With More Data
A few analytical caveats worth flagging:
- Uniform CPCs (~$3.16β3.38 across keywords)Β suggest broad match pooling in the ad click data, which limits keyword-level ROAS confidence. With exact-match data, the keyword analysis would be significantly more precise.
- The Markov Chain model assigns zero credit to Email and Paid Social, which is the technically correct answer given the journey data β but in practice, these channels likely have brand-building value that a 3-month window doesn't capture. A longer dataset would give a clearer picture.
- April cohort finding is promising but not yet causal.Β The 33-day improvement in conversion speed could reflect a targeting change, a product change, or simply seasonal effects. I'd want a 6-month cohort view before treating it as a reliable lever.
- Australia's low CVR (14.2%)Β warrants a session recording review β it could be a payment friction issue, a localisation gap, or just lower intent traffic. Hard to diagnose from aggregate metrics alone.
Methodology
<details> <summary><strong>1. Problem Definition & Requirements</strong></summary>
Outlined the core business questions: which channels drive conversions, how to allocate spend between awareness and retargeting, and how to properly credit multi-touch customer journeys. Translated marketing needs into data requirements covering sessions, conversions, events, ad clicks, and SEO keyword metrics.
</details> <details> <summary><strong>2. Data Simulation & Schema Design</strong></summary>
Prompt-engineered a synthetic DTC healthcare dataset using ChatGPT-5 to produce realistic GA4-style distributions across user demographics, session patterns, and conversion behaviours. Designed and validated a normalised Postgres schema (in Postico) covering:Β users,Β sessions,Β events,Β conversions,Β ad_clicks,Β semrush_keywords. Built three SQL helper views βΒ session_channel_map,Β conversion_path, andΒ campaign_costsΒ β to power all downstream analysis without repeated joins.
</details> <details> <summary><strong>3. Exploratory Data Analysis</strong></summary>
Profiled all six tables in Jupyter Notebook. Key findings from EDA: user ages 18β69 (mean 43, US-dominant), Paid Social is the highest-spend channel, the 50% checkout abandonment rate immediately flags as a priority, and email-to-conversion paths are longer than other channels. This stage shaped the focus of the deeper analysis.
</details> <details> <summary><strong>4. Attribution Modelling β Baseline</strong></summary>
Implemented Last-Click, First-Click, and Linear attribution from scratch in Python. Compared credit allocation side-by-side to confirm that single-model reliance actively misleads budget decisions. Organic and Paid Social inflate under First-Click; Paid Search dominates Last-Click; Email emerges as an assist channel under Linear. No single model tells the full story.
</details> <details> <summary><strong>5. Attribution Modelling β Markov Chain</strong></summary>
Built a removal-effect Markov Chain model using Monte Carlo simulation (20,000 paths per channel). Process: computed transition probabilities from full session histories, modelled both converting and non-converting paths, then calculated each channel's incremental contribution by measuring the drop in overall conversion probability when that channel is removed from the model.
This is the most technically rigorous of the four models β it's the only one that actually measuresΒ incrementalΒ value rather than assigning credit by position.
Result: Paid Social drops to 0%, Display Retargeting rises to 24.3%, and Paid Search's true contribution is revealed to be significantly higher than Last-Touch suggests.
</details> <details> <summary><strong>6. Deep Analysis</strong></summary>
Extended across five dimensions after attribution:
- Funnel analysisΒ β drop-off rates by channel and device at each stage
- Cohort analysisΒ β conversion rates, speed-to-convert, and AOV by acquisition month
- Keyword ROASΒ β revenue per click across 2,019 attributed ad clicks
- SEO opportunity sizingΒ β incremental revenue projections using CTR curves by position
- Demographic analysisΒ β CVR and AOV segmented by age, device, gender, and country
</details> <details> <summary><strong>7. Outputs</strong></summary>
Delivered findings across four formats:
- Interactive HTML attribution dashboard (model toggle across all four models)
- Interactive HTML deep analysis dashboard (funnel, cohort, SEO, demographics)
- 9-page PDF report (consulting-style, with narrative, tables, and recommendations)
- 11-slide PowerPoint deck
</details>
Project completed September 2025. Dataset is synthetic and created for portfolio purposes.