Why your tools disagree on active customers
TL;DR. When every tool and every agent computes "active customers" or "revenue" on its own, each one writes its own definition, and the numbers silently disagree. The fix is not a new tool. It is one written definition per key number, read by every tool and agent, with a person approving each change. Start with a one page glossary before launch, move to metric files when you have paying customers, and add a shared layer of definitions only when growth is repeatable.
What is the real problem?
The problem is not that your tools are wrong. Each one is right by its own definition. The problem is that nobody wrote down which definition the company means, so every tool, every analyst and every agent fills the gap with a guess.
Picture a startup with a dashboard, a billing tool and an AI assistant in team chat. Before a board meeting, someone asks all three for the number of active customers. The dashboard counts anyone who logged in this month. Billing counts anyone with a paid invoice. The assistant writes a fresh query on the spot and counts anyone with a record in the users table, test accounts included. Three numbers, three confident answers, and no way to say which is right.
AI makes this faster. To answer a question about your data, an agent has to pick a definition, and unless you ask, it may not tell you which one.
Before
After
Where do the definitions hide?
A name like "active customers" or "revenue" hides several small choices, and each one moves the number.
- Who is counted. Test and internal accounts, free trials, paused plans, a company versus the people inside it.
- What counts as the thing. For "active": logged in, did a key action, or paid. For "revenue": invoiced, paid, or net of refunds and credits.
- Which period. Calendar month or the last 30 days, and in which time zone. An order placed near midnight at month end can land in different months for different tools.
- Which currency, and when converted. Two tools converting on different dates give two totals.
None of these choices is wrong on its own. Leaving them unwritten is the mistake.
When do you need one shared place for definitions?
I think the trigger is not company size. It is the second reader. The moment a number is computed in more than one place, you need its definition written down in one place. That includes a spreadsheet next to a dashboard, two dashboards, or any AI agent that can query your data.
The form of that place should grow with the company. A shared layer of definitions (software that holds each metric once and serves it to every tool, often called a semantic layer) is the right answer later, not first. Plain files come first, because they cost almost nothing and an agent can read them today.
What is the minimum at each stage?
Before launch. Write a one page glossary with the one or two numbers your current question needs. For each, write what it means, who is counted, and why you chose it. Leave test and internal accounts out from day one. If you ask an agent about your data, paste the glossary into its instructions.
First paying customers. Agree on a short list of key numbers, each tied to a decision, and give each one its own metric file in a shared folder. Every dashboard and every agent prompt points to those files. One person owns the list, even if that person works on it a few hours a week.
Repeatable growth. Now add the shared layer: each number is defined once, every tool reads that definition, and every change goes through review. It waited until now on purpose. Before this stage, the list of numbers changes too often to be worth the setup.
Many teams. Give each number one named owner, approve the data sets people should use, and keep a short note whenever a number turns out wrong and why. Teams that need a variant get a new, separately named metric, never a quiet edit to the shared one.
What goes wrong, and how do you catch it?
Each failure below has a guardrail and a check you can run without code.
Same name, different numbers. The dashboard and billing disagree on revenue for last month.
Guardrail: one metric file per number, and every tool reads it.
Check: ask two tools, or two people, for the same number for the same period. If they differ, ask each which definition it used.
The agent invents a definition. An assistant answers a question about your data with a definition it made up on the spot.
Guardrail: tell the agent to use only the definitions in your metric files, to name the file behind every number, and to say so when no file exists.
Check: ask your agent "which definition did you use for that number, and where is it written?" If it cannot point to a file, the definition was its own.
The meaning changes and the name stays. Someone edits what "active" means, and the chart keeps its old title and its old history.
Guardrail: version each metric file, and have a person approve every change.
Check: ask when the definition of your main number last changed, and who approved it. If nobody knows, it may have changed already.
Test accounts inside the count. Your own sign-ups look like customers.
Guardrail: the "who is counted" line excludes test and internal accounts by default, and says how they are marked.
Check: ask how many test or internal accounts sit inside your active customer count. The answer should be none.
For your data team
For your data team
This part gets technical. A metric file is a small text file, one per metric, stored with your code and changed only by a reviewed pull request. Every dashboard, query and agent reads from it.
name: active_customers
version: 3
definition: >
Paying accounts that completed at least one key action
in the period. Key actions are listed in key_actions.md.
who_is_counted:
unit: account # a company, not each user inside it
include: accounts with a paid, non-refunded invoice in the period
exclude:
- is_test = true # set on the account, inherited by users and events
- is_internal = true
pilots: excluded # decided on purpose, see the change log
period:
window: calendar month
time_zone: UTC
partial_periods: never shown as complete
decision: >
Where customer success spends time this month, and whether
the onboarding change is working.
owner: head of customer success
source_of_truth: billing invoices joined to product events on account_id
reconcile_with: billing paid account count for the same month
expected_gap: accounts paid but with no key action, listed by name
How the pieces fit:
- Agents. Put the metric folder in the agent's context and give it a written rule: compute only from these files, cite the file name and version in every answer, and stop and ask when no file covers the question. The written rule guides the agent; read-only access to a copy of the data, never the live database, enforces it.
- BI tools. Generate each tool's metric from the file, or at least link each chart to its file and version. A chart with no file behind it is a draft.
- Changes. A definition change is a pull request with a reason, a named reviewer, and a before and after number for the last few periods, so the shift is visible before it ships.
- Reconciliation. For each key metric, run the same period through the file's definition and through the
reconcile_withsource. Investigate any gap the file'sexpected_gapdoes not explain. - Exclusions are computed.
is_testlives on the account and flows to users and events. A query that countsis_test = truerows inside a reported metric should return zero. - Later, a shared layer. At the repeatable growth stage, the files feed a shared layer of definitions that serves BI, chat and agents from one place. The file stays the readable record of why.
Check it in 10 minutes
- Pick your most quoted number, like active customers or monthly revenue.
- Ask two tools, or a tool and your agent, for last month's value. Write both answers down.
- Ask where the definition is written. If the answer is "in someone's head", write it today: name, definition, who is counted, period, decision, owner.
- Ask your agent which definition it used. If it cannot name a file, give it one.
- Ask how many test accounts sit inside the number. It should be none.
See where your setup stands with the two minute self-check, or read the metric-files check your coding agent can run.
Check your setup in 2 minutesAll postsGet new posts by email