Skip to content

Where every number comes from

Every number in a deliverable can name where it came from. This is the machinery that makes that true, and what happens when a number simply is not available.

For each individual metric, a skill resolves it on a ladder, stopping at the first rung that works:

RungSourceWhat gets carried into the deliverable
1A connected tool (your Meta connector, for instance)Tool name, the window, the pull timestamp
2Your own API key against a scriptScript, key name, pull timestamp
3A dated export you produced by handThe file and its export date
4NO-DATAWhat is missing and the manual path to get it

It resolves per metric, not per source. A normal run sits on several rungs at once, and that is fine rather than degraded. The alternative, dropping a whole data source because one field inside it is missing, throws away good data.

This is the part that keeps a hole honest. A metric that lands on rung 4 does not get dropped from the report and does not get a substitute. The row ships with the gap labelled and everything derived from it withheld:

FlowReachValue bandPriority score
Browse abandonmentNO-DATA — trigger-event counts not available on this rung; task raised$2.10 to $4.40NOT RANKED — reach term absent

Three things are true of that row at once: you can see the flow exists, you can see exactly which input is missing, and you cannot mistake it for a ranked recommendation. A blank cell, a dash, or a quietly deleted row would each fail at least one of those.

When a required number falls to rung 4, you do not get a refusal. You get five specific things:

SETUP NEEDED — Klaviyo
Missing: KLAVIYO_API_KEY
Get it: Klaviyo → Settings → API Keys → create a read-only key
This run: Flow revenue rows go NO-DATA. Deliverability and the
flow map still complete.
Instead: Export the flow performance CSV and I'll read that.
Want me to proceed with the CSV path?

What is missing, the exact identifier, where to get it, what this run degrades to, and the next best move. A message missing any of the five is not a setup message, it is a refusal.

Sourcing a number correctly says nothing about whether it describes the right account. A perfectly sourced, fully evidenced report about somebody else’s ad account fails silently and cleanly: every pull succeeds, every gate passes, and nothing looks broken.

So every account-scoped skill:

  1. Binds its account from the identifiers recorded during onboarding.
  2. Confirms by rendering the account name as the platform itself reports it, next to the brand you said, before any verdict rests on it.
  3. Stops and asks if the stored name and the live name disagree, rather than silently updating.

This is why the first line of an audit is often “confirmed as Example Brand LLC (act_1234…)”. A near name-match is otherwise indistinguishable from the real thing.

  • Connect what you can, once. Identifiers get recorded and inherited, so later skills stop asking.
  • A NO-DATA row is a to-do, not a bug. It names the one thing that would unlock it.
  • Read the confirmation line. It takes two seconds and it is the check that prevents an entire report being about the wrong account.
  • Export paths work. If an API is not available, a dated CSV is a legitimate rung.

Gates and verdicts explains why NO-DATA blocks. Your files covers where identifiers get recorded.