Two answers to the same question before ten in the morning

Two people pulled the same headline figure on the same Tuesday morning and came back eight percent apart. Neither had made a mistake. One counted by the date each record was created, the other by the date it closed, and the gap walked into a meeting booked to decide whether a product family stayed open. The decision waited while three senior people argued about arithmetic.

A figure that a second person cannot reproduce from a written definition is a governance problem, and calling it a reporting bug is why it keeps coming back. Reporting bugs get fixed in a model and stay fixed. This one returns every quarter with a different pair of people, because nothing about who owns the definition has changed in between.

The cost is rarely the number itself. It is the hour of meeting time, the second and third rebuild, and the quiet erosion of trust in every other figure in the pack. Once a room has watched two competent analysts disagree about revenue, every chart that follows gets read with a squint.

The filter that drops rows nobody counted

Start with filters, because they account for more of these gaps than anything else I have seen. Someone builds a measure that joins out to an account attribute and adds a condition on it. The condition looks harmless on screen. What it does is remove every row where that attribute is empty, and the share of empty rows is usually larger than anyone guesses.

On one Power BI model I reviewed, the revenue measure was filtered by a sales region pulled from a lookup on the account. About nine percent of accounts had no region at all, nearly all of them created before a CRM migration three years earlier. A colleague writing SQL against the warehouse had no reason to add that condition, so his total came in higher by roughly the same nine percent.

Null handling is the first thing to check in any disagreement. Ask which rows each version excludes, then count them. If one version quietly dropped records with an empty field and the other kept them, you have the answer in ten minutes instead of a week. The same check catches inner joins that lose orphans, which look identical from the outside.

Dates and currency move the answer on their own

Dates are the next largest cause. A single record carries a created date, a modified date, a close date, a posting date and whatever extra date someone added for a campaign two years ago. A measure sliced by one of them answers a different business question than the same measure sliced by another, and the chart title tells the reader none of that.

Bookings by created date says when work entered the pipeline. Bookings by close date says when it landed. Both are legitimate. The trouble starts when a monthly figure is rebuilt by someone who takes the first date field in the table, because the rebuild reshuffles which month each deal falls into while leaving the annual total untouched. The year ties, the months do not, and the argument runs for days because half the evidence agrees.

Currency does the same damage on another axis. One version converts at the rate on the transaction date, a second at the month-end rate, a third at whatever the finance close loaded overnight. For a business with real non-domestic revenue, that spread alone puts two to four percent between two honest rebuilds.

The definition moved and nobody logged the date

Definitions change, and most changes are correct. Someone decides internal test accounts should come out, or that a certain order type never counted, or that the partner channel now does. What goes missing is the record of when the change landed. Anyone comparing this year against last year then compares two definitions and reads the difference as business performance.

I watched a team spend most of a week on a drop in active customers that turned out to be a filter added in March, removing accounts with no billing contact on file. The filter was a sensible call. There was no note, no ticket and no version stamped on the measure, so the only way to find it was to read six months of merged changes. Teams that keep a release record for shared solutions already have the habit, and measures rarely get the same treatment.

Late-arriving data produces the same symptom honestly. Run the identical query today and again tomorrow and the answer moves, because invoices posted with a backdated document date, timesheets were approved late, or the overnight load reprocessed three days of source records. Nothing is broken. The figure will not settle until the window closes, and a definition with no stated cut-off guarantees that two runs a day apart disagree.

The rebuild that took longer than the decision

Last spring I was pulled into a pricing review at a distributor with a few hundred million in annual revenue. The question was whether to keep a low-margin product family. Gross margin for that family came in at 14.2 percent from the finance model and 17.6 percent from the commercial team, and both versions had been built in the previous fortnight by people who had never seen each other's work.

Reconciliation took nine working days across three of us, and four differences were stacked on top of each other. Rebates accrued monthly in one version and credited at the invoice line in the other. Freight recovery sat inside revenue on one side and inside cost of sales on the other. Currency converted at month end against transaction date. Eleven product codes were mapped into the family by one model and left out by the other.

The decision itself took forty minutes once the number was agreed. We kept the family and raised prices on two codes. Nine days of three people's time supported a forty-minute conversation, and the only durable output was a one-page definition of gross margin that should have existed long before anyone opened a model.

Write the definition down and put a name on it

The fix is mostly organisational, which is why it keeps not happening. Every number that reaches leadership needs one written definition in plain language, naming the source tables, the filters, the date field it is sliced by, the currency rule and the cut-off. One page is enough. Write it so an analyst who has never opened the model can rebuild the figure and land on the same answer.

That page needs a named owner, a person and never a team, who approves changes and picks up the phone when the figure moves. It needs a version history with dates, so a year-on-year comparison can say which definition sat on each side. And it needs one rule with teeth. A number presented to leadership must be reproducible by a second person from the definition alone.

Most of that is governance work rather than modelling work, and it sits beside the case for making analytics questions part of the requirement instead of a ticket raised after go-live. No catalogue product supplies the owner. A tool can hold the definition once somebody has written it and somebody else has agreed to defend it.

Ask a second analyst to rebuild the front page

Take last quarter's board pack, pick the three figures on the opening slide, and ask an analyst who did not build them to reproduce each one from whatever definition exists today. Two of the three usually fail to reconcile on the first pass, and the reasons will be the ones above. That afternoon produces a better backlog than any maturity assessment, because every item on it carries a number and a person who already cares.

Then put the owner's name and a link to the definition on the tile itself. Settling who gets to define revenue is far easier in a room that has just watched one figure come out twice with two values, and if your dashboards carry decisions without carrying that, the next rebuild will disagree with this one too.