One meaning per number, so the screens stop arguing
Two tabs of the same BI disagreed on the same month, and neither had a bug. Writing each rule down once, with its date, and checking every copy against it fixed that.
The problem
Tabs and the Ask chat used different rules for the same number.
The solution
Write each rule once with its date, and check every copy against it on every change.
In mid-October, two tabs of AHA’s sales BI showed the same September, and one total was more than twice the other. Neither tab had a bug. Each was following its own rule, and the rules had drifted apart.
One number, three hidden choices
Each tab had picked up its own answer to three questions:
- Which date? Overview put a win on the deal’s closing date. Closed put it on the day someone marked it won in Zoho.
- Which amount? One showed amounts after GST. The other showed them as stored in Zoho, with 18% GST included.
- Which people? One counted the consulting team. The other counted every consultant.
It wasn’t only the tabs. On 22 Sep it was decided that a deal still waiting for its advance (“Closed and Advance Pending”) is not a win. Two weeks later, the database views and the written instructions behind the Ask chat still counted it as one.
Even the words drifted. In conversation, “taxed” meant the amount with 18% GST taken off. The BI labelled that same figure “untaxed”.
Write each rule once, with its date
The fix was one home for every definition, each filed under the date it was decided:
SQL call rating 3 or higher, from any source
HQ rating 4 or 5, always counted inside SQL
CPL channel spend / all leads in that channel’s bucket
Google includes WhatsApp-direct and Exotel leads
Win stage Closed Won, dated by its closing date
Consultant the deal’s Lead Assigned To
Amounts after 18% GST is deducted, and labelled so
Those rules live in a compact context file that Claude Code, which wrote much of the code, reads at the start of every session, before any analysis or build. The same file says which source wins for each kind of number, lists every known data defect and what to do about it, files decisions by date, and keeps open questions with the default in use until they’re answered. A separate glossary holds 750 terms.
Most rules have a story. CPL had three candidate denominators (paid-ad leads only, every lead in the channel’s bucket, or the platform’s own count) until one was picked. The consultant rule changed when the BI and a consultant’s own saved filter in Zoho disagreed about their open deals: the BI credited whoever ran the demo, and the filter used Lead Assigned To. The record owner is never used, because it’s the same person on most records.
Why the date rule matters
45% of 2026 wins were marked won in Zoho after their closing date. For nearly half the wins the two dates differ, and the choice can move a win into another month. Marking also happens in batches: one clean-up day in 2025 marked dozens of wins at once.
Neither date is perfect, and a closing date can be backdated. The closing date won because it matches the wins sheet that already existed, and since 15 Oct every tab uses it.
Put the rules where people look
A rule in a file only helps people who open the file. So the BI has an admin panel, Fields & formulas, with 54 metric formulas in plain words, 104 field meanings, 33 traps to avoid when reading Zoho and all 573 Zoho fields, behind one search box. When a number looks odd, its definition is in the same app.
Labels carry rules too. Amounts say “18% GST deducted”, not a word that can be read both ways.
Keep the copies honest
A rule still lives in several copies: the database views, the panel and the instructions written for the Ask chat. Check 9 of the data audit compares every copy with the dated decisions on each change to the BI or its rules, and passes only when they match everywhere. The audit’s other checks, and the bugs they caught, are in Five bugs a data audit caught.
Rules I now keep for every metric
- A number is a definition, a date, an amount basis and a group of people. Write all four down.
- One home per rule, with its date. Everything else is a copy, and copies get checked.
- Labels say what was done. “18% GST deducted” can’t be misread. “Untaxed” was.
- When two screens disagree, compare definitions before data.
The numbers didn’t get bigger. They just stopped changing with the tab you opened.