HookGet Open dashboard

Ad spend to revenue, in one event stream

Meta, TikTok, Google Analytics and Search Console — read on a schedule, normalised to one envelope, delivered next to your leads and payments. Cost per lead and ROAS stop being an export-and-spreadsheet project.

In short

  • Four pull sources: meta-ads, tiktok-ads, google-analytics, google-search-console.
  • One event per settled day per source: ad.spend_reported, web.traffic_reported, seo.performance_reported — money always in cents.
  • Joined with lead events and payment events, the funnel ratios are divisions between metrics that already sit side by side.
  • Connections are one credential each: an access token for the ad networks, a service-account key for Google — pasted once, stored encrypted, returned by no route.
  • Days are read once, after they settle. Restatements are not chased, and that policy is written on every source page.
Spend to revenue, joined across four sources Ad spend events from Meta and TikTok, traffic events from Google Analytics, lead events from a CRM and payment events from Stripe flow through one pipeline. Because every event shares the same envelope, cost per click, cost per lead and return on ad spend are divisions between metrics that already live side by side. Spend ad.spend_reported Meta · TikTok Traffic web.traffic_reported Google Analytics 4 Leads lead.created · deal.won GoHighLevel Revenue payment.succeeded Stripe spend_cents / clicks cost per click spend_cents / leads cost per lead amount_cents / spend_cents return on ad spend every stage in cents, every stage the same envelope — the divisions are yours to run, anywhere the events land
Four providers, one pipeline, and the three ratios a growth team runs on. Because every connector reports money in cents and every event carries the same envelope, cost per click, cost per lead and ROAS are simple divisions wherever you land the events — a warehouse, a sheet, your own database.

What each source contributes

SourceEventThe numbersRead
Meta Adsad.spend_reportedspend_cents, impressions, clicks, reachdaily, 1-day settle
TikTok Adsad.spend_reportedspend_cents, impressions, clicks, reachdaily, 1-day settle
Google Analytics 4web.traffic_reportedactive_users, sessions, page views — or your metric listdaily, 2-day settle
Search Consoleseo.performance_reportedclicks, impressions, ctr_permille, avg_positiondaily, 3-day settle
GoHighLevellead.created, deal.wonamount_cents, pipeline stagepush, instant
Stripepayment.succeededamount_cents, currencypush, instant

Where teams land it

GoalHow
Spend and revenue in the warehouseRoute both event types to an S3-compatible bucket or a queue destination — one object per event, signed
A daily budget alertFilter ad.spend_reported on {"metrics.spend_cents": {"gt": 50000}} to a Slack-bound endpoint
Networks compared on one axisBoth networks emit the same event type — group by the provider attribute on your side
SEO regression watchFilter seo.performance_reported on falling clicks; the events carry position, so a rank slide is visible in the payload

Questions

Is this a marketing dashboard?

No. It is the layer under one: verified, normalised events — spend, traffic, search, leads, revenue — delivered wherever you already work. Point them at a warehouse and chart there; point them at a webhook and alert; point them at a bucket and keep them forever.

How do the ratios work if providers report money differently?

That is the point of the normalisation: Meta reports whole units as strings, TikTok reports strings, Stripe reports cents, GoHighLevel reports whole units — and every connector converts at its own boundary, so spend_cents and amount_cents are the same kind of number. Cost per lead is a division, not a data-cleaning project.

How fresh are the numbers?

Each source reads a day once, after the provider stops revising it — one day for the ad networks, two for GA4, three for Search Console. This is the durable daily record; for minute-by-minute in-flight numbers, the providers’ own consoles remain the right tool, and this page does not pretend otherwise.

What about attribution?

Each network reports its own attributed numbers and each arrives labelled by provider. HookGet does not re-attribute — dedupe across networks is a modelling decision that belongs in your analysis, made honest by having every network’s claim in one place, in one unit.