I spend most of my time setting up PostHog's marketing analytics for agencies. Not because it's a bad feature. It's actually good. But getting it working right takes more time than most agency owners have.
You're running ads on Google, Meta, LinkedIn, maybe TikTok. You've got conversion events firing in PostHog. But connecting those two things so you can see the actual cost per conversion? That's the hard part.
Three Ways to Get Marketing Data Into PostHog
PostHog gives you three options. Each one has tradeoffs.
Native integrations are easiest. Connect Google Ads, LinkedIn Ads, Meta Ads, TikTok Ads, or Reddit Ads directly. PostHog syncs everything automatically. This works if you only use these platforms and your UTM parameters match your campaign names exactly.
Data warehouse sources let you connect to BigQuery. You map the required fields (campaign name, cost, date, source) and PostHog pulls the data. Good if you already have a data warehouse.
Self-managed sources pull from S3, GCS, Cloudflare R2, or Azure. You upload JSON files and map the fields. Most flexible option. Also most work.
Where Everyone Gets Stuck
The setup looks simple until you hit reality.
Your Google Ads campaigns use one naming system. Your Meta campaigns use another. Your UTM parameters are a disaster because three different people have been running ads for two years.
Now you need to map everything together. PostHog needs to know that "spring-promo" in Meta is the same as "Spring Promo 2026" in Google Ads, which is the same as utm_campaign=spring_promo in your conversion events.
PostHog gives you manual mapping tools. You can whitelist specific UTM sources for each platform. You can map custom campaign names to platform IDs. But someone actually has to do the work. And keep doing it when you launch new campaigns.
Conversion Goals Get Complicated Fast
You can track any event, action, or data warehouse table as a conversion goal. For events, PostHog automatically uses UTM parameters. For data warehouse tables, you map the fields yourself.
SQL knowledge becomes necessary pretty quickly.
Want to see cost per MQL instead of cost per signup? Write a query.
Want to merge data from sources PostHog doesn't support natively? Write a query.
Want a dashboard showing ROI by campaign across all platforms, using your specific attribution model? Write a query.
What I Actually Do for Agencies
When someone comes to me, I connect their marketing sources to PostHog. Native integrations where possible. Data warehouse or self-managed for everything else. I map all campaigns and UTM parameters so attribution works. I set up conversion goals for events that matter to their business.
Then I write custom queries for the dashboards they need. Cost per lead by source. ROI by campaign. Conversion rates at each funnel stage. Whatever metrics they check when deciding where to spend money.
The queries live in PostHog. Data updates automatically. They get accurate numbers without spreadsheet work.
The Maintenance Nobody Warns You About
Marketing analytics requires ongoing work. New campaigns launch. UTM parameters change. Conversion events get updated. Someone needs to maintain the mappings or attribution breaks.
I handle this through SmartMetrics. You run campaigns. I keep the data flowing and dashboards accurate.
You can do this yourself. PostHog's docs are solid. But most agency owners I work with prefer spending time on clients instead of figuring out why the Meta Ads cost data stopped syncing.
Need This Set Up?
I integrate marketing sources into PostHog, write custom queries, and build dashboards that answer your actual questions about campaign performance.
If you're spending real money on ads and want clean attribution data, reach out. I'll review your setup and explain exactly what needs to happen.