For agencies who report on other people's money

Monday's reporting is finished before you get in.

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 walkthrough
Kist / Workspace / Weekly readSynthetic, not a client’s dataSample data
Clientsample workspaceRequested range4 Aug to 31 AugGranularityweek

Sample · link clicks against spend by format

link clicks spend · basis: link clicks

Sample · spend by placement

Sample · link clicks by day

MonTueWedThuFri

Sample · cost per link click by campaign

The workspace, shown with sample data. Ask in a sentence and the chart lands on the canvas with its working beside it.

Six platforms, six versions of the truth, and a spreadsheet holding them together.

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

One set of numbers, four states.

METAADSGA4GSCRAWCAMPAIGN_IDCAMPAIGNSPENDCLICKSLEADSROASWHY DID CLICKS JUMP?ONE PLACEMENT, +41%

Click any step to drive it. Synthetic sample, not a client’s data.

One campaign, measured end to end

Under 2 to over 9

Sales a day, across the paid run, on lower spend than the campaign started with.

6.3x

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.

112%

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

What you get back.

Monday mornings get shorter

The reconciliation that used to take a morning is done before you open the laptop.

Questions stop being projects

Asking something new costs a sentence, not a data request and a week.

The numbers stop disagreeing

One model, one definition of spend, used by every report you produce.

The difference

Most models can tell you what a metric means. None of them have seen your account.

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.

Analyst · sample workspace · goldSynthetic sample, not a client’s data
> Which placement is carrying the campaign?
Instagram Reels£412.605.1x
Facebook Feed£780.151.7x
Audience Network£206.400.6x

It shows the query

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.

QUESTIONGOLD_V14ANSWER+ SQL

It counts visits

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.

ALL TAPSLINK CLICKSNEVER LEFT THE PLATFORM

It stays in your tenant

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.

QUERYYOUR ROWS××COMPILER, NOT POLICY

What an answer looks like

One table, one basis, nothing rounded into agreement.

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.

Synthetic sample, not a client’s datagold_ghl_campaign_measurement · demo-tenant-alpha · 1–31 AugClick basis: link clicks. taps that followed the link off-platform.
  • Verified · ledger-backed
  • Platform-estimated
gold_ghl_campaign_measurement · demo-tenant-alpha · 1–31 Aug. Click basis: link clicks. taps that followed the link off-platform. Synthetic sample data; no client is named or represented.
campaign_idSpend (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.403,211£0.4096£13.3811£8,250£6,400
brand-search-defence£612.081,902£0.3274£8.2714£9,100£8,950
retargeting-30d£448.951,063£0.4238£11.815£3,400£2,100
prospecting-broad£2,010.772,884£0.7041£49.042£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

Two numbers, a signed difference, and the basis for both.

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.

Synthetic sample, not a client’s dataPeriod over period · same entity, same definitionsHeld constant: demo-tenant-alpha · all campaigns. Only the window moves.
  • 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.

Synthetic sample, not a client’s dataEntity against entity · same window, same basisHeld constant: 1–31 Aug, and link clicks on both sides.
  • 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

The Monday pack, produced without an engineer in the room.

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.

22:00CONNECTORS LAND01:00MODELS REBUILD04:00ANALYST WRITES07:00ONE URL, OPENEDNOBODY PRESENT FOR ANY OF THIS

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

The platforms you already pay for.

Meta AdsGoogle AdsGA4Search ConsoleMicrosoft ClarityDataForSEOGoHighLevelFreeAgentBusiness Profile · soon
ONE MODELEIGHT SOURCES, ONE DEFINITION OF SPEND

Governance

The questions procurement asks.

Data residency

Storage region is fixed at bucket creation and stated in the contract.

Processor position

Your client is controller, you are processor, we are sub-processor.

DPA gate

An executed DPA comes before the first data connection, not the first invoice.

Tenant isolation

Row-level output is constrained to a single tenant structurally, in the query compiler.

Raw retention

The unmodified platform response is kept, so a model change never means re-fetching.

Access

Named accounts, scoped roles, and an audit trail on every query the analyst runs.

Sub-processors

Listed, versioned, and changed on notice.

Deletion

Tenant deletion removes bronze, silver and gold together.

Portability

The modelled layer exports as open tables you can take with you.

Bring one account. We will run it through and show you what comes out.

Book a walkthrough