Sample · link clicks against spend by format
link clicks spend · basis: link clicks
For agencies who report on other people's money
Kist takes Meta, Google, GA4 and the rest, reconciles them into one model that agrees with itself, and answers questions about it in plain English. Every answer arrives with the query that produced it, so you can check the working or argue with it.
Book a walkthroughlink clicks spend · basis: link clicks
The workspace, shown with sample data. Ask in a sentence and the chart lands on the canvas with its working beside it.
Meta counts a conversion one way, Google counts it another, and neither agrees with the bank. So a person sits down with four exports and reconciles them, and the answer is correct right up until anyone asks it a follow-up question. Then it is a morning gone.
How it works
Click any step to drive it. Synthetic sample, not a client’s data.
One campaign, measured end to end
Sales a day, across the paid run, on lower spend than the campaign started with.
Return on ad spend, verified on Meta's own API and reconciled to money in the bank. Attribution was only wired up in the last two days of the run, so that is what we could prove, not what we achieved.
Of target. £16,777 pledged across 159 backers on a £15,000 goal, 94 of 96 pledges in the paid window settled, none refunded.
A Scottish musician’s album campaign.
What changes
The reconciliation that used to take a morning is done before you open the laptop.
Asking something new costs a sentence, not a data request and a week.
One model, one definition of spend, used by every report you produce.
The difference
Kist’s analyst queries your modelled data directly, so when you ask what happened last Tuesday it goes and looks. Then it shows you the statement it ran, so you can disagree with it.
Every answer carries the statement it ran, against a named version of the model. You can read it, argue with it, and run it yourself. That is the difference between an answer and an assertion.
A tap on the image and a click through to your site are not the same event, and one of them cannot buy anything. Kist reads the one that leaves the platform, on both sides of every ratio, and names the basis in the figure so nobody has to guess.
Row-level output is limited to one tenant inside the query compiler itself, so there is no role anyone can be granted to get past it. Ours included.
What an answer looks like
This is the shape a real answer arrives in. The columns are the ones the campaign-measurement model emits, in its order. The numbers are invented, because we never show a client’s.
| campaign_id | Spend (Platform-estimated) | Link clicks (Platform-estimated) | Cost / link click (Platform-estimated) | Leads (Platform-estimated) | Cost / lead (Platform-estimated) | Won (Platform-estimated) | Pipeline value (Platform-estimated) | Verified revenue (Verified · ledger-backed) |
|---|---|---|---|---|---|---|---|---|
| spring-tour-awareness | £1,284.40 | 3,211 | £0.40 | 96 | £13.38 | 11 | £8,250 | £6,400 |
| brand-search-defence | £612.08 | 1,902 | £0.32 | 74 | £8.27 | 14 | £9,100 | £8,950 |
| retargeting-30d | £448.95 | 1,063 | £0.42 | 38 | £11.81 | 5 | £3,400 | £2,100 |
| prospecting-broad | £2,010.77 | 2,884 | £0.70 | 41 | £49.04 | 2 | £1,150 | £0 |
Pipeline value and verified revenue are never summed together. The first is what an operator expects; the second is what settled. Adding them would produce a number that flatters every row.
A filled diamond is verified against the ledger. An open ring is the platform’s own estimate. The click column reads its label from the data.
Comparisons
The same metric across two periods, and two placements across one. Direction is declared per metric, because a fall in cost is good news and a fall in revenue is not.
Spend
1–31 Jul: £3,891.20
1–31 Aug: £4,356.20
+£465.00+12.0%, no inherent direction
Platform-reported spend, deduped on the full placement key. Rising spend is neither good nor bad on its own.
Cost / link click
1–31 Jul: £0.61
1–31 Aug: £0.49
−£0.12−19.7%, an improvement
Link clicks both sides. All-clicks would read ~38% cheaper and would be a different metric.
Cost / lead
1–31 Jul: £22.09
1–31 Aug: £24.10
+£2.01+9.1%, a decline
CRM leads joined on utm_campaign; unrecovered leads are excluded, not imputed. Cheaper clicks did not become cheaper leads, and the table does not hide that.
Verified revenue
1–31 Jul: £12,400
1–31 Aug: £17,450
+£5,050+40.7%, an improvement
Settled, ledger-backed receipts only. CRM pipeline estimates are excluded.
Spend
Reels placement: £1,836.50
Feed placement: £1,204.90
−£631.60−34.4%, no inherent direction
Platform-reported. Neither direction is an improvement by itself.
Link clicks
Reels placement: 4,102
Feed placement: 2,088
−2,014−49.1%, a decline
Link clicks on both sides. Never all taps, which flatters the image-heavy placement.
Cost / link click
Reels placement: £0.45
Feed placement: £0.58
+£0.13+28.9%, a decline
Same numerator basis and same denominator basis on both sides.
Verified revenue
Reels placement: £4,100
Feed placement: £9,350
+£5,250+128.0%, an improvement
Ledger-backed receipts attributed to the placement.
Both sides share one basis. Counting every tap makes an image-heavy placement look cheaper than it is.
One workflow
See what is working on one client. Put it to work on the other four. Overnight the connectors land, the models rebuild, and the analyst writes the week’s read. Someone opens one URL on Monday and it is already there, working attached.
What is worth noticing is what is missing. Nobody stitches exports together at nine on a Monday. Nobody is waiting on a data request. Nobody had to be awake for any of it. It means that when two numbers in the pack disagree, that disagreement is a finding you can act on, rather than a spreadsheet error somebody has to go and rule out first.
“We didn’t have overstated numbers. We had attribution issues.”
Connectors
Governance
Storage region is fixed at bucket creation and stated in the contract.
Your client is controller, you are processor, we are sub-processor.
An executed DPA comes before the first data connection, not the first invoice.
Row-level output is constrained to a single tenant structurally, in the query compiler.
The unmodified platform response is kept, so a model change never means re-fetching.
Named accounts, scoped roles, and an audit trail on every query the analyst runs.
Listed, versioned, and changed on notice.
Tenant deletion removes bronze, silver and gold together.
The modelled layer exports as open tables you can take with you.