Tempio

Measure

Numbers that go blank rather than guess

Base counts are what Tempio stores. Every rate you read is worked out at the moment you read it, from the counts underneath, and a rate with nothing to divide comes back blank instead of zero.

Money is integer minor units with the currency the account reported in. Nothing crosses currencies quietly, and a figure that blends several is labelled an estimate and carries the date of the rate that made it.

A number you hope is right, or one you can take apart

Reporting assembled by hand
  • Three tabs, three date ranges, and a spreadsheet that adds them together as though they were the same money.
  • A cost per acquisition of zero, because the campaign had no acquisitions and the formula divided anyway.
  • Rates stored the day somebody pulled them, so a restated count leaves them wrong and nothing on the page says so.
  • Two currencies summed at whatever rate was open that afternoon, with no note of the rate or the day.
  • Last month’s figure cannot be reproduced, because the working was a formula somebody has since edited.

A figure you have to believe.

Counts stored, rates computed
  • One row per account, per campaign, per day, holding what the platform reported: impressions, clicks, spend, results and value.
  • A cost per acquisition with nothing underneath it comes back blank, and blank says there was nothing to divide.
  • Rates are worked out when you ask for them, so a restated count restates everything derived from it on the next read.
  • Each row keeps its own currency. A blended figure is converted once, labelled an estimate, and carries its rate date.
  • The working is a tool call: the same range, the same scope, the same counts, any time somebody wants to run it again.

A figure you can rebuild.

From the platform’s report to your answer

  1. 01

    The counts arrive

    Each connected account is read through the platform’s own reporting interface and stored as base counts: one row per entity per day, in the currency that account bills in. Ninety days are pulled by default when you connect (thirty, or none at all, if you would rather), so the first question you ask already has a baseline behind it.

  2. 02

    The rates are worked out on the way to you

    Click-through rate, cost per click, cost per thousand impressions, cost per acquisition and return on ad spend are derived at read time from the counts inside the scope you asked about. None of the five is stored anywhere, which is why none of them can disagree with the counts it came from, and each is blank whenever its denominator is zero.

  3. 03

    The scope decides the currency

    A scope that sits inside one currency answers in that currency and nothing is converted. A scope spanning several converts once into a target, marks the answer an estimate, and names the rate date and the currencies it drew from. The per-account rows beside it stay in their own money, so you can always see what was converted and what was not.

What the measurement layer refuses to do

Store a rate

Nothing in the database holds a click-through rate or a return on ad spend. Each is arithmetic over counts, done on the way to your screen, which is why a corrected count corrects every figure that leans on it.

Round money into a decimal

Spend, budgets and value are integer minor units of a named currency, from the platform’s response through to the figure on the page, where one formatter renders them once.

Turn absence into zero

A blank rate says the denominator was zero. A zero would say the answer is zero, which is a different statement about the account and usually a wrong one.

Call an estimate a fact

A cross-currency total is converted, marked as an estimate, and carries the date of the rate it used. The untouched per-account rows sit beside it, so the conversion is visible rather than assumed.

Pass off reach as people

Reach is the sum of each campaign’s daily reach across the range, not a count of people, and it is blank when no account in scope reported any. It is never presented as the size of an audience.

Order a list without saying what the order means

A per-campaign list states whether its order is a true ranking in one currency, a ranking converted at published rates, or raw minor units laid side by side, which is not a ranking at all and is reported as a hint.

Read the same counts from your own agent

Leave the plan out of it

The counts are what a flight is weighted against while you are building it, and what a change is judged on once it has landed. One store, read by the planner and by the queue alike.

Build a flight on them

Illustrative exchange

How did last month go, and which campaigns are dragging it down?
get_metrics
Reading the blended figures for the range, with the per-account breakdown.
range 2026-08-01 → 2026-08-31 · blended spend 4 128 300 minor units AUD · ctr 0.0094 · cpa 6 420 · roas 2.81 · fx null (single currency)
I have the month. Every account in scope bills in the same currency, so nothing was converted and the blended figures are exact rather than an estimate. Return on ad spend came out at 2.81 across the three accounts.
get_campaign_metrics
Ranking the campaigns in the range by spend.
14 rows · ranking native · 2 rows cpa null (0 results) · 3 rows zeroed, currency null, ordered last
Fourteen campaigns, and the order is a true ranking because they share one currency. Two of them show a blank cost per acquisition. They spent and returned nothing countable, so there is nothing to divide and I am not going to call that a zero. Three more had no delivery at all in the window and came back zeroed at the bottom.
Is that normal for these accounts?
get_account_brief
Reading the ninety-day baseline for each account.
3 briefs · window 90d · 28d against the prior 28 · worstByCpa: 2 campaigns above 2% of spend · bestCpaWeekday null (coverage 3 weeks) · dataNotes: 1
Against the last ninety days the month sits slightly ahead on cost per acquisition and flat on spend. I can rank the worst two campaigns inside each account, but not the weekday pattern. That needs four full weeks of coverage, and one account has three. The brief says so rather than guessing at the fourth.

Questions

Put frontier AI to work on every ad account you run.

Connect your accounts, point your own AI at them over MCP, and read the numbers and draft the work in one place. Every change is a draft until you approve it, or until a rule you wrote does.

Request early access
  • Read and draft by default. Approve is a separate permission you grant.