A revenue report that counted the same money twice
One dashboard tile reported twenty-two thousand dollars of paid social revenue. The real figure was five million. Both were produced by the same CRM, on the same day, from the same data.
Client anonymised — a home improvement retailer, delivered under another company. Company names, campaign names and record identifiers are withheld or changed. Every figure below is real.
- Paid social revenue found
- $5.07m, against $22,500 reported
- Reports after cleanup
- 52 reports reduced to 46
- Reconciliation
- Closed to the dollar
- Won deals validated
- 12,628 deals across 11 channel buckets
Two numbers, both from the same database
A marketing dashboard is supposed to settle arguments. This one was starting them. A paid social revenue tile showed a figure in the tens of thousands, which did not resemble anything the team believed about the channel, and there was no obvious way to tell whether the dashboard or the belief was wrong.
It was the dashboard. The report was grouping by a campaign field that is populated on deals but had been effectively empty on contacts since around May — roughly half of them null. Grouped that way, almost every deal fell into a single unnamed bucket and the tile reported that bucket's total as though it were the channel.
Reading the same revenue against the field that actually holds campaign names produced five point zero seven million.
The join that inflated the other half
The opposite error was live on the same dashboard. Several reports were built across contacts and deals together, which means a deal associated with two contacts is counted twice.
That is not a subtle effect at scale, and it does not announce itself — the report renders, the number looks like money, and it is wrong in a direction that flatters the channel.
Rebuilding those four reports as single-object reports removed the fan-out. The rebuild was then reconciled against the original rather than simply replacing it: the old report was missing revenue that the contact join had dropped, and carrying revenue the fan-out had duplicated. Netting those two effects against each other closed the gap exactly. An audit that produces a different number is a claim; one that explains the difference to the dollar is a finding.
Every figure checked against a second source
No number went onto the dashboard on the strength of one report. Paid social lead volume was confirmed three ways — the rebuilt report, a separate leads-by-channel breakdown and an independent API query — landing at 4,993, 4,993 and 4,992. A one-record difference from a partitioned query is explainable; a one-thousand-record difference would not have been.
Won deal volume was validated the same way, with 12,628 deals reconciling across all eleven channel buckets against a report the client already trusted and which was deliberately kept rather than replaced.
Retitling rather than faking
Three reports were promising data the CRM did not have. One claimed spend by channel while only one ad platform was actually connected. Another claimed revenue by campaign where campaign names were never captured, only keywords.
Those were retitled to say precisely what they show, rather than being quietly deleted or, worse, filled with a proxy that looks like the real thing. A tile labelled honestly is useful. A tile labelled aspirationally teaches the team to distrust the whole dashboard.
Six replaced or duplicated reports were then removed, taking the portal from fifty-two reports to forty-six — including one duplicate of the client's own pre-existing report that had been created during this work and was not better than the original.
Status
Complete. Four reports rebuilt as single-object, three retitled to match what they actually measure, six removed. Every headline figure cross-checked against an independent second source before publication.
A dashboard that renders is not a dashboard that is right. Reconciling old against new to the dollar is what turns an opinion into a finding.
RevOps Diagnostic Audit