Lean Agencyleanagency
← Back to case studies

Case Study

How We Found an 18x Conversion Gap Hiding in a $50K/mo Ad Budget

Paid acquisition analytics for an AI-powered bar exam prep platform

PostHogEdTech / SaaSPaid AcquisitionConversion APIs

Context

The Client

  • AI-powered bar exam prep platform (freemium SaaS)
  • Running paid ads across Google, Meta, Reddit, and TikTok
  • Free trial model: landing page → signup → trial → paid subscription
  • PostHog already installed but no paid acquisition analytics
The core tension: Money was going out the door to four ad platforms, but the team had no way to compare which channel actually drove trial signups — let alone paying customers. Each platform reported its own numbers, and none of them agreed.

Problem

What Was Missing

“Each platform says it's working. We can't tell which one is actually converting.”
  • No unified conversion funnel across channels
  • No landing page bounce rate per campaign or creative
  • No server-side conversion tracking (relying on pixels only)
  • No cross-platform comparison on equal terms
  • Ad platform data siloed — not connected to product events
  • No visibility into which ad creatives drove bounces

Solution

What We Built

A three-layer paid acquisition stack in PostHog, delivered in under two weeks:

Data Warehouse Connections

Google Ads, Meta Ads, Reddit Ads, and TikTok Ads connected as data sources for cross-platform HogQL queries

Conversion API Destinations

6 server-side event streams sending trial starts, registrations, and purchases back to each ad platform

19-Tile Dashboard

Conversion funnels per channel, bounce rate by campaign/creative, and unified user counts across all platforms

Why conversion APIs matter: Browser-based pixels miss 20–40% of conversions due to ad blockers and iOS privacy changes. Server-side APIs send events directly from PostHog to each ad platform, so their algorithms optimize on real conversions — not partial signals.

Scale

90-Day Snapshot

5,889

Paid visitors

518

Trial signups from paid

8.8%

Overall paid conversion rate

4

Ad platforms connected

6

Conversion API destinations

14

Charts by analyst

5

Charts added by client

81%

Signups from paid channels

Finding 1

The 18x Conversion Gap

For the first time, the team could compare every paid channel on equal terms: same funnel, same attribution window, same data source.

ChannelVisitorsTrialsConversion rate
Google Ads2,65628910.9%
Meta Ads2,26724310.7%
Reddit Ads1,02360.6%
TikTok Ads100%

Visitor-to-Trial Conversion Rate by Channel

Google Ads10.9%
Meta Ads10.7%
Reddit Ads0.6%
Key insight: Reddit was sending 1,023 visitors per quarter but converting only 6. That's an 18x conversion gapvs Google and Meta. The traffic looked good in Reddit's own dashboard — but almost none of it converted in the product.

Finding 2

Per-Creative Bounce Rate Analysis

Standard analytics tools show bounce rate by channel. We went deeper: bounce rate per campaign, per ad creative — by JOINing PostHog event data with the Google Ads and Meta Ads data warehouse tables directly in HogQL.

67%

Google Ads bounce rate

72%

Meta Ads bounce rate

Technical highlight: The bounce rate detail chart is a 7-CTE HogQL query that JOINs PostHog sessions with Google Ads campaign tables and Meta Ads creative tables, filters to only active campaigns, and calculates per-creative bounce rates. Some individual creatives had 90%+ bounce rates— an immediate kill list.

Finding 3

Closing the Attribution Loop

We configured 6 server-side conversion destinations so each ad platform receives real conversion data regardless of browser privacy settings:

Meta Ads — Purchase

ACTIVE

Meta Ads — Registration

ACTIVE

Meta Ads — Start Trial

ACTIVE

Google Ads — Conversions

ACTIVE

TikTok Ads — Conversions

ACTIVE

Reddit — Conversions API

ACTIVE

Why this matters: Without server-side events, ad platforms optimize on incomplete data. With conversion APIs active, Meta and Google can now see the full picture — which means their bidding algorithms optimize on real trial starts and purchases, not just pixel fires that ad blockers let through.

Outcome

Knowledge Transfer

The real measure of an analytics engagement isn't the dashboard — it's whether the team can build on it independently.

5

Charts added by client after delivery

2

New dashboards client built independently

Within weeks of delivery, the product lead built 5 additional charts on the Paid Acquisition dashboard — Reddit funnels, cross-channel comparisons, and purchase tracking — following the same patterns. He then created two entirely new dashboards (Email Engagement and Onboarding Analytics) using the same framework.

Actions

What We Recommended

  1. 1

    Reallocate Reddit budget to Google and Meta

    0.6% conversion rate vs 10.9% on Google — same dollar buys 18x more trials

  2. 2

    Kill high-bounce ad creatives immediately

    Several creatives showed 90%+ bounce rates — wasting spend on traffic that never scrolls

  3. 3

    Use the per-creative bounce data to inform new creative briefs

    Best-performing creatives had 60% bounce rates; worst had 100%. Pattern: video outperformed static images

  4. 4

    Monitor conversion API delivery weekly

    Server-side events are only valuable if they keep flowing — set up alerts for delivery gaps

Impact

What This Engagement Delivered

Before

  • Each ad platform reported its own numbers
  • No cross-channel conversion comparison
  • Pixel-only tracking missing 20-40% of events
  • No visibility into which creatives drove bounces
  • Budget allocated by platform self-reporting

After

  • Single source of truth across 4 ad platforms
  • 18x conversion gap between channels surfaced
  • 6 server-side conversion APIs closing the attribution loop
  • Per-creative bounce rate analysis via data warehouse JOINs
  • Client building their own charts independently

Want results like these?

I help growth teams turn their ad spend data into decisions — not just dashboards. Book a free call and let's talk about your paid acquisition stack.