Why do two dashboards show different numbers for the same metric?

Two dashboards can both be working and still disagree, because each computes the metric its own way. The common causes are different definitions, different default filters, data refreshed at different times, a join that duplicated rows, and inconsistent category values. Find which one by comparing totals at each layer, then make one definition authoritative and test it.

Key points

  • A common source of dashboard disagreement is the same rule implemented in different places: when a definition changes, some copies get updated and some don't.
  • Some metrics legitimately differ by source: finance reports revenue from the ERP and sales reports it from closed-won CRM opportunities, so one system has to be declared authoritative for each question.
  • Timing causes disagreements that look like errors: a report can pull yesterday's transactions against today's customer dimension while every pipeline job succeeds.
  • A join that fans out on duplicate keys can make revenue high with no failure anywhere (DataKitchen's illustration uses 4 percent), which is why row counts and totals need checking between layers.
  • An aggregate balance test, which compares totals by group against a source or prior delivery, catches the join and category cases on the load where they start.

Your VP has two tabs open, and revenue is different on each. Nobody changed anything. Both refreshed this morning. The data team now has a week of forensics ahead and a meeting at 3.

Often neither dashboard is broken. They’re answering slightly different questions under the same name.

Five causes, and how each one shows up

CauseWhat it looks likeHow to check
The same rule written in two placesNumbers match for months, then drift after a definition changeFind every copy of the calculation; compare their SQL
Different sources or default filtersA steady gap that never closesList each dashboard’s source system and filters side by side
Data refreshed at different timesNumbers converge by afternoon, disagree in the morningCompare each source table’s last load time with the dashboard refresh
A join that duplicates rowsOne dashboard is high by a few percentRow count before and after the join; uniqueness on the join key
Inconsistent category valuesTotals agree, but a group or segment splits differentlyDistinct values in the grouping column (“NY”, “N.Y.”, “New York”)

The same rule, written twice

This one starts quietly. A rule gets implemented in a report, copied into a spreadsheet, rebuilt in a second BI tool. When the definition changes, some copies get updated and some don’t. The cost shows up as two reports that disagree and a week spent finding which one holds the real rule.

Two systems, two honest answers

Some metrics live in more than one system. Finance reports revenue from the ERP. CRM reports it from closed-won opportunities. They’re different numbers because they measure different points in the process. The same goes for default filters that live in analyst muscle memory: internal accounts, test users, pilot markets. One dashboard excludes them and the other doesn’t.

The clock

Timing problems masquerade as data errors. A report runs cleanly and pulls yesterday’s transactions against today’s customer dimension. Every job succeeded. Row counts and schema checks passed. The numbers are still wrong for this hour.

The join

When a join matches more than one row on a key that should be unique, the measure repeats. DataKitchen’s illustration in The Seven Deadly Sins of AI-Generated Data Pipelines, a hypothetical rather than a measured case: a revenue number 4 percent high because a join fanned out on duplicate keys. Nothing failed, and the dashboard rendered.

The categories

Three spellings of the same category give each analyst a different workaround, and each workaround becomes its own version of the truth.

A worked check: split the difference layer by layer

Say dashboard A shows $4.10M for October and dashboard B shows $3.95M.

  1. Compare each dashboard’s filters and source table. If B excludes internal accounts and A doesn’t, that’s a definition gap. Pick one and label it.
  2. Same source and filters? Compare the source table’s total with each dashboard’s total. If the table says $3.95M, A is adding something.
  3. Check row counts on A’s path before and after each join. A jump means a fan-out. Test the join key for uniqueness.
  4. Counts match but a region splits differently? Check the distinct values in the grouping column.
  5. Everything matches by 2pm? It’s refresh timing. Compare load times with refresh times.

Make it stop happening

Specify your contested metrics once. DataKitchen’s context framework puts it at three to five metrics first: revenue, active users, churn, whatever leadership asks about most. Name the authoritative source for each and record when a definition changes.

Then test it. An Aggregate Balance test compares totals by group against a reference, such as the source or the prior delivery, so a SKU moving between product groups or a fanned-out join shows up on the load where it starts. A Unique Values test on every join key catches the fan-out before the total moves.

Frequently asked questions

Short answers to the follow-up questions people ask next.

Why does my dashboard not match finance's number?

Usually because the two numbers measure different things from different systems. Finance reports revenue from the ERP, while sales and CRM-based dashboards report revenue from closed-won opportunities, at a different point in the process. Both can be right. The fix is to write down which system is authoritative for which question, and label each dashboard with the definition it uses.

Can two dashboards disagree even when every pipeline succeeded?

Yes. A successful job proves it ran, not that its inputs were aligned in time. One report can pull yesterday's transactions against today's customer dimension, or refresh before an upstream load finished, while every pipeline success check, row count, and schema check passes. Timing problems look like data errors and need checks on arrival time relative to what depends on the data.

How do I find which dashboard is wrong?

Work backward one layer at a time. Compare the metric's total in each dashboard, then the totals in the tables each one reads, then the row counts feeding those tables. The first layer where the numbers split is where the cause lives. If the split is a definition or filter, neither dashboard is wrong; they answer different questions under the same name.

Can a join make a metric too high?

Yes. When a join matches more than one row on a key that should be unique, every matching row repeats the measure, and the total inflates without any error. DataKitchen's illustrative example is a revenue number 4 percent high because a join fanned out on duplicate keys. A uniqueness test on the join key and a row count check after the join catch it.

How do I stop dashboards from disagreeing?

Put each contested metric's definition in one place that every dashboard reads, record when the definition changes, and test it. DataKitchen recommends fully specifying your three to five most contested metrics first, such as revenue, active users, and churn. Then add an aggregate balance test that compares totals by group against the source on every load.

Try it on your own data

DataOps TestGen is free and open source. Profile a table and generate its tests this afternoon.