The day a whole region vanished from the dashboard A few years ago I was asked to look at an executive dashboard that tracked sales pipeline across global regions. One region showed zero pipeline. Not low. Zero. Nobody had noticed, because there was nothing to notice. The nightly job ran on schedule. No alert fired. The charts loaded and the numbers looked tidy. The dashboard was technically perfect and factually wrong. The root cause turned out to be two independent failures working together. An internal reference table that mapped records to regions had gone stale, so a large set of records stopped matching. Separately, a key field used when joining two tables had a data-quality mismatch, so records that should have lined up fell through the join. Either failure alone might have looked like a dip. Together they erased a region. That incident is why I say this: the most dangerous data bug is not a crash. A crash is loud. The dangerous bug is a believable number that nobody questions. And believable wrong numbers almost never come from bad SQL. They come from definitions nobody wrote down. Two systems, two stories Once I started looking, I found that the failures I cared about rarely lived inside a single system. The source data was fine. The transformation code was fine. The breakdown happened at the boundary, where two systems disagreed about how their records related to each other. One system used a region mapping that had not been refreshed. Another recorded the same records with slightly different identifiers. Each looked healthy on its own. The joined result was wrong, and it stayed wrong because every health check was asking the wrong question. Most data teams test whether the pipeline ran. Did the job finish on schedule? Did the row counts stay flat? Those checks matter, but they only prove the machinery worked. They say nothing about whether the output agrees with the world. I now insist on a second kind of check: reconciliation. Does the result make sense against an independent signal? In the region case, the reconciliation was blunt. I compared the dashboard totals against what the operational systems said the regions actually contained. The gap was obvious the moment someone looked. Nobody had looked, because the platform had no habit of looking. When qualified means three different things The same project surfaced a quieter problem. The company tracked a technical evaluation stage in its sales funnel, and the definition of entering that stage depended on a sales representative manually updating a field in the CRM. Representatives are busy people. They often update that field days or weeks after the technical work is already done. Meanwhile, another system recorded the actual technical event automatically. The two signals disagreed for a meaningful share of deals, and the official definition only trusted the manual one. The result was a systematic undercount of real pipeline, invisible in every report, because every report used the same unexamined definition. The fix was not a better dashboard. The fix was a better definition. We rewrote the stage logic to fuse both signals: if the CRM field said the deal was in evaluation, or the telemetry showed the technical milestone was complete, the deal counted. One sentence of business logic, written down, agreed with the business, and implemented once in the platform instead of re-invented in every dashboard. That pattern kept repeating. Different groups held slightly different definitions of basic milestones: when an opportunity officially enters the pipeline, what counts as a qualified stage, how renewals should be treated. None of those disagreements lived in code. They lived in people's heads and in ad-hoc spreadsheet formulas. So I wrote the definitions down, reviewed with the business, stored with the platform. Once the definitions were explicit and centralized, the metric disputes in leadership meetings stopped, because there was one place to check what the number meant. Putting definitions in the platform, not the dashboard With the definitions written, I retired the old reporting system: a single nightly script, about 800 lines, with no version control and no automated tests, edited by hand whenever someone needed a change. I replaced it with 14 small models, each with one job: region mapping, pipeline entry, each funnel stage, cohort metrics, executive aggregates, campaign attribution. Decomposing it did two things. First, it made the business logic visible. When the region mapping was wrong, I could open the region mapping model and see it. When a stage definition changed, the change lived in exactly one place. Second, it made the logic testable. Beyond the usual null-and-duplicate checks, I added tests that encode the business's own rules, so a definition violation trips an alert instead of becoming a dashboard mystery. Every change went through version control, a dev environment, and a review. That is slower than editing a dashboard, and I will not pretend otherwise. But when someone asked months later why a metric changed, I could point at the commit instead of digging through chat history. Governance paid for itself the first time a definition changed and every downstream report updated together. A second case: pricing estimates that disagreed with themselves I saw the same shape of problem in a completely different domain. Business units were producing conflicting pricing estimates for the company's products. Leadership wanted one defensible answer for market sizing, but each team had built its own spreadsheet with its own assumptions. Digging in, I found a contamination bug that had been quietly moving a large slice of revenue between two reporting regions: public sector records mixed into a North America dataset because an industry label was not filtered properly. I also found single-account anomalies that distorted whole pricing grids, because one bad entry read as a real price signal. The remedy followed the same playbook. Replace the hand-edited spreadsheets with one versioned pipeline. Filter the data-entry errors systematically instead of patching cells by hand. Lock the methodology so every team pulls from the same calculation, and label every output with how much data backs it. The conflicting estimates disappeared, not because people were told to agree, but because the calculation only existed in one place. The tradeoff nobody mentions There is an honest cost here. Centralizing definitions makes quick one-off analysis harder. When an analyst needs a special version of a metric for tomorrow's meeting, the governed path is slower than hacking a filter into a dashboard. If your company has one dashboard and three people, this is overkill. But once executives start making forecasts, territory plans, and budget decisions from your numbers, speed without trust is just faster wrongness. A metric everyone disagrees about is more expensive than a slower metric everyone trusts. The meeting where five people argue about whose number is right is the tax you pay for letting definitions live in dashboards. The takeaway Write the definition before you build the model. Put business logic in versioned, tested models instead of dashboard filters. Reconcile against independent signals, and do not stop at job health. Document the reasoning behind the columns. And the next time a dashboard looks perfect, ask one question: what does this number actually mean, and where is that written down? If nobody can answer, you do not have a data platform. You have a collection of guesses that happen to render as charts.
When a Dashboard Looks Perfect but the Data Is Wrong
Full Article
Original Source
Read the full article at Hackernoon →KhanList aggregates and links to publicly available news content. We do not host full articles from third-party sources. Always verify important information with original sources.