Your three reports disagree about one number. Each of them is computing it correctly.
That is what makes it so hard to settle. Nothing has failed, nothing is throwing an error, every test passes and every refresh succeeded — and the finance export, the warehouse and the dashboard still show three different figures for the same word. Each system stores its answer. None of them stores the question it was answering.
Nothing on this page has looked at your numbers, and I am not going to pretend otherwise. There is no free checker here that finds this, and there could not be — every component involved is behaving correctly, so there is nothing for any scanner anywhere to fail on. What follows is the argument, the causes, and both of the things a real reconciliation hands back, so you can judge it before speaking to anyone.
What you can already get for nothing, said first
Every one of these is good, and most of them are better than anything hand-written. None of them stands between two systems and does the arithmetic.
- A language model
- Reads three SQL statements and explains the difference between them, in seconds, and it will name most of the causes below without being prompted. Free, fast, and genuinely good at this.
- A semantic layer — dbt, Cube, LookML, Power BI models
- Define the metric once and serve it everywhere. Free or included with what you already pay for, and well documented. It is the right thing to build.
- dbt tests, Great Expectations, Soda
- Assert that a number sits inside a range, or that two tables agree on a key. Open source, and yours to install this afternoon.
- Clicking a total in your BI tool
- Click a total and see the rows behind it — in that tool, under that tool’s definition.
- Two extracts and a spreadsheet
- An afternoon with a lookup will tell you the two numbers differ. You almost certainly already know that part.
None of them tells you where the difference is, or what each piece of it is worth. They either define the metric going forward, or show you one system at a time. The gap between two figures is not stored anywhere, in any of them, because it is not a property of either system — it only exists once somebody computes it.
A reported number is an answer with its question thrown away
Every figure on every screen is the output of a definition. The figure is stored. The
definition is not — it is implicit in a WHERE clause, a measure inside a BI
tool, a filter somebody saved onto a view, and a convention nobody wrote down.
And nothing is broken, so nothing reports. Every system passes its own checks. There is no error, no failed test, no alert and no red row anywhere. The only symptom is a disagreement between two screens that nobody looks at side by side — which is why this gets noticed in a meeting rather than by a machine, usually at the worst possible moment.
So the arithmetic has never been done, and that is the whole thing. Everybody in the room already knows the numbers differ. What nobody knows is that the difference is made of one piece here, another piece there, and a remainder nothing accounts for — and that last figure is the one that changes the conversation, because a stated remainder is either small enough to live with or big enough to chase. An unstated one is neither.
The vendors document this in their own products
Not a competitor comparison and not a criticism — these are good tools behaving as designed, and each is straightforward about it. Quoted rather than paraphrased, with the page that carries each sentence linked so you can check it in one click.
-
Google — its own reports against its own BigQuery export
A discrepancy of 2-5% between the total event count in Analytics and BigQuery is expected.
The condition travels with it, and it is the sentence immediately before: the comparison is the total number of event rows exported to BigQuery on a single day against the total in the reports on the same date. This is one company’s two own surfaces, fed by one collection, and it tells you in advance they will not match. Read it -
Google — on the mechanism, and on turning it off
Data thresholds are system defined. You can’t adjust them.
Under When data thresholds are applied. The purpose is good and stated plainly elsewhere on the same page — thresholds exist so that nobody viewing a report can infer the identity of individual users. But read the second sentence: this is not a default you can change. One surface withholds data the other does not, by design, permanently. Read it -
Fivetran — on what happens to a row you deleted
Connectors without this feature are still in soft delete mode by default, but deleted rows will not be marked
Soft delete is the default sync mode and is available for what the documentation calls the vast majority of connectors: a row deleted in your source is marked in the warehouse rather than removed. That is the right default. But where a connector cannot capture deletes, the row stays with no marker on it at all — so a_fivetran_deleted = TRUE.COUNT(*)in the warehouse and the same count in the source are answering different questions, silently, out of the box. Read it -
Microsoft — on the report somebody is looking at right now
For example, if you open a report in the browser, then the scheduled refresh performs a data refresh of the imported tables, the report visuals in the open browser won’t update until a refresh of report visuals is initiated.
That sentence is a table cell rather than running prose — the Keep in mind row of the Refresh of report visuals column, under Power BI refresh types — and it is worth reading in place. The screen and the model behind it are two different things, and how far apart they can drift depends on your capacity: the same page documents a ceiling of eight scheduled refreshes a day on shared capacity against up to 48 on the paid capacities. Read it -
dbt — and this one is a sales pitch, not a confession
Moving metric definitions out of the BI layer and into the modeling layer allows data teams to feel confident that different business units are working from the same metric definitions, regardless of their tool of choice.
Marked differently because it is different. The four above are companies documenting a limit inside their own product. This is a company selling the fix — and it describes the problem in almost the same words this page does: different business units, different tools, different definitions. Worth quoting for who is saying it, not as an admission it is not. Read it
No vendor can ship the missing feature, and that is the point rather than a complaint. The feature would require one company’s product to know what another company’s product means by the same word — and then what your business means by it, which is not written down in either.
Six reasons two correct systems disagree
Not bugs. Every one of these is either a documented default or an ordinary decision somebody made sensibly, once, without telling the other side.
- Deleted rows that only one side dropped
- A record is deleted in the source system. The ingestion tool marks it in the warehouse rather than removing it — which is the documented default, and the right default, because throwing away history silently would be worse. Then one query filters those rows out and the other does not. Neither query is wrong. They are counting different things.
- Two definitions of the same word
- Gross against net. Booked against recognised. Whether an internal account, a test order or a cancelled subscription is in or out. Every one of these is a legitimate business decision that somebody made once, in one place, without writing it down — and the other surface made a different one, equally reasonably.
- A definition that lives in a screen
- A measure built by clicking, a filter saved onto a view, a spreadsheet column with a formula in it. It cannot be read, reviewed, diffed or searched, and often the person who set it has left. This is usually the surface that turns out to be the odd one, and it is always the slowest to establish.
- The clock, in three different senses
- Event time against load time. One timezone against another. And month boundaries that fall in different places because of either. A transaction at 23:40 on the last day of the month lands in different months on different surfaces, forever, and the size of that effect is not stable enough for anybody to learn to ignore it.
- Reading them at different moments
- One report was refreshed this morning and the other was run last night. Late data landed in between. Nothing is wrong with either number and they will never match — which is why the whole comparison has to be pinned to one agreed moment before it means anything at all.
- A surface that cannot say when it is from
- Some things only ever show now. A file that overwrites itself, a view with no snapshot, a report with no refresh timestamp on it. This is not an obstacle to the reconciliation — it is one of the answers. A surface that cannot state its own as-of will disagree with everything, permanently, and nobody had ever written that down.
Two artifacts, and here is what both of them look like
Rendered rather than described, because a service page that describes its own output is asking you to take the interesting part on trust. These are an example of the shape rather than anybody’s real system — the figures are illustrative, but the columns are the real columns. A real bridge contains a client’s actual revenue, so there will never be one of those on this website.
The bridge
One metric, two surfaces, one agreed moment. Every unit of the gap assigned to a named cause, working down from the figure one team quotes to the figure the other one does.
| Line | Effect on the gap | Why it is there |
|---|---|---|
| Warehouse — net revenue, one month | 1,284,306 | The figure on the dashboard the commercial team reads. It is not wrong. It is the answer to one particular question. |
| Rows the source system no longer has | −18,442 | Deleted upstream, retained downstream, and never filtered out. The ingestion tool is doing exactly what it documents — a soft delete marks the row rather than removing it, and one query excludes those rows while the other does not. |
| Refunds and reversals | −31,900 | One surface reports gross and the other nets them off. Both are legitimate definitions of revenue and neither team had ever been told which one the other was using. |
| Currency | −2,118 | Converted at the month-end rate in one place and at the transaction-date rate in the other. A small line most months, and an alarming one in a month the rate moves. |
| Arrived after the earlier extract | +4,015 | The two surfaces were read hours apart. This is the line that turns into a recurring argument, because it is different every time somebody checks and it makes the whole comparison look unreliable. |
| Unexplained | +611 | Stated, not absorbed into the line above it. Six hundred and eleven that nothing above accounts for. It is either small enough to accept or large enough to chase, and you cannot make that call about a number nobody wrote down. |
| Finance export — net revenue, same month | 1,236,472 | The figure in the board pack. Also not wrong, and also the answer to one particular question. |
The highlighted line is the one that matters and it is the one you will not get anywhere else. Every reconciliation anyone has ever been handed quietly folds the leftover into the line above so the two ends tie exactly. This one puts it on its own row with its own number. A bridge that always ties perfectly is a bridge somebody forced, and you cannot judge whether a remainder is acceptable if nobody will tell you how big it is.
The definition sheet
One row per surface. This is the half that needs somebody to have actually looked, and it is what stops the same argument restarting three months later.
| Surface | Where the definition lives | Who can change it | What it counts | Grain and clock | Last reconciled |
|---|---|---|---|---|---|
| Warehouse model | A version-controlled model file | Data team, through review | Gross. Excludes internal accounts, includes refunded orders at full value. | Event time, UTC, per calendar month | Nothing |
| BI report | A measure built in the tool’s interface | Anyone with edit rights, and no trace when they do | Nets refunds. Inherits a filter set on the saved view that nobody currently working here added. | Load time, local timezone, as of the last refresh | Nothing |
| Finance export | A spreadsheet built from a scheduled extract | Finance, by hand | Nets refunds and converts currency at the month-end rate. | Whenever it was last run — the file overwrites itself and keeps no timestamp | Nothing |
Look at the last column. Before anybody does this work, every row of it says the same thing, and that is true at almost every company of every size. The sheet is not impressive. It is just the thing nobody has, and having it is what makes the next disagreement a five-minute conversation instead of a fortnight.
What is free here, and what is not
Once, in one place, rather than a locked row beside every paragraph.
Free, always, with no account and no email address
- Everything on this page, including both tables above and every column in them.
- The full argument — why correct systems disagree, why nothing stores the definition, and the vendor pages that document it, linked so you can read them yourself.
- All six causes, described specifically enough to go and check your own surfaces for them this afternoon. Several people find their answer in that list and never need anybody.
- The list of what to ask before buying this from anyone, me included: which metric, at what grain, on which surfaces, and can all three be read as of one moment.
What you would be paying for
- The bridge itself, computed from your figures — every unit of your gap assigned to a named cause, with the remainder stated.
- The definition sheet for your surfaces, which is the part that needs somebody to have gone and looked rather than to have thought about it.
- The three definitions turned into one written definition a named person signs off, and the surfaces changed to compute it.
- The bridge re-run afterwards, so the agreement is proved rather than asserted.
Nothing here is gated, blurred or held back behind an email address. There is no checker on this page and therefore no result to withhold — the free column is not a sample of the paid one, it is genuinely everything that can be given away without seeing your figures. What costs money is the arithmetic on your numbers, which nobody can do from a web page.
And if the figures cannot be produced as of a common moment, that is a measurement that did not happen — not a tier you failed to buy. If one of your surfaces cannot say when its number is from, or a definition genuinely cannot be read by anyone still here, you get told that on the day and before anything is committed to. Dressing an incomplete answer as a paid upgrade is the one thing that would make this page dishonest.
This one does not ask to touch your systems. It asks to see your figures.
Every other piece of work on this site asks the same question in different words: may I do something risky to your infrastructure, carefully, and measure it. This is a different ask, and it deserves a different answer rather than the same paragraph reworded.
The reconciliation is computed on aggregates, not on rows. Getting from one figure to another needs the two totals and the size of each explaining category. It does not need to know who your customers are, and it does not need a copy of your data.
Nothing is written, anywhere, at any tier. No table, no view, no scheduled job, no export, nothing materialised. Every query is a read. This is the only engagement I offer that changes nothing at all, and it is worth saying plainly rather than leaving you to work it out.
- Row level only where an aggregate cannot settle a line, and then keys only. An id list — not names, not email addresses, not amounts attached to a person.
- The queries run in your environment. What leaves is the bridge. No extract lands on my machine unless you deliberately put it there, and if you do, it is on your terms and deleted on a date agreed before it moves.
- You decide what is masked, before anything runs. And where a figure is masked, the bridge line says so rather than quietly disappearing — an unmeasured thing is reported as unmeasured.
- Read-only credentials, or none at all. You run every query and I do the arithmetic, if you would rather. On this particular work that route is genuinely equivalent, because the work is queries rather than changes, and it would be a sales tactic to imply otherwise.
- The bridge is yours. It has your real numbers in it, so it goes to you and is never reused, anonymised, excerpted or shown to anybody. That is why the example above is a shape rather than a client’s.
One moment, not a window. All three surfaces are read as of one agreed point in time, because surfaces read hours apart differ for reasons that have nothing to do with their definitions. That is three read-only queries against an agreed timestamp — nothing is scheduled, nobody stands by, nothing needs undoing if it goes wrong, and you run it again.
It looks like the pipeline rerun review, and it is not one
Both are about numbers being wrong in a data platform. If you have read that page the resemblance is worth putting side by side rather than glossing over, because the two answer genuinely different questions.
| Pipeline rerun review | This page | |
|---|---|---|
| What disagrees | One system with itself, between two runs | Three systems with each other, about the same word on the same day |
| Whether anything is at fault | Yes — a real defect, and it has a repair | Often nothing. Each surface is correctly computing a different question |
| What is done to find out | A load is run a second time on purpose, against a clone | Nothing is run. Three figures that already exist are read and explained |
| What is written | Rows, to a clone | Nothing, anywhere, at any tier |
| The measurement | Rows, expected delta against actual, per stage | The gap, assigned line by line, with the remainder stated |
| What is asked of you | May I run your load again? | May I see your figures? |
| Where a cause lands | Owns every pipeline-side cause, including a column that never arrived | Names it, prices it, and hands it over. The fix is theirs |
The second row is the honest one and it cuts against this page rather than for it. A perfectly real outcome here is that all three of your numbers are correct, they answer three different questions, and nothing needs repairing — in which case you have bought an explanation rather than a fix. The boundary between the two pages is in the subject matter and not in any shared code, and there is no finding on either side of it because neither page has one at all. If a cause turns out to live in your pipeline, this work names it and tells you what it is worth; repairing it is that page, and I will say so rather than quietly widening the job.
It is also not monitoring, and that boundary is closer than it looks
Hosted monitoring puts business numbers on a screen next to your infrastructure, deliberately — orders per hour, failed payments, signups. That page puts a number on a screen. This one asks whether the number on that screen is the same number as the one on the other screen. There is no shared code and no overlap in what is delivered: that one ends in something you log into, and this one ends in a document. If what you want is the number visible, go there instead.
Bulk document data extraction creates a dataset out of documents, and the deployment and rollback review is about releases rather than figures. Neither overlaps with this.
Four ways to take this
Every tier starts from the same measurement. The review fee is credited against whatever you take next, so nobody pays for the same work twice.
Metric Reconciliation
Everyone starts here. It also scopes everything else.
- One metric across up to three surfaces, read as of one agreed moment
- The bridge — every unit of the gap assigned to a named cause, and the unexplained remainder stated rather than absorbed
- The definition sheet — where each definition lives, who can change it, what it counts, its grain and its clock
- What already agrees, not only what does not. A pair of surfaces that ties is written down as tying
- Nothing is written anywhere, and nothing leaves your environment but the bridge
- Or you run every query and I do the arithmetic — same bridge, no access needed
Reconciliation + Agreement
Not a starting point. Follows the reconciliation.
The tier where three numbers actually become one.
- One written definition, signed off by a named person — the person, not the department, because a definition owned by a committee is owned by nobody
- The surfaces changed to compute it, wherever the change is yours to make
- The bridge re-run afterwards, so the agreement is proved rather than asserted. Included, not quoted separately — this is the only tier that measures itself twice
- Causes that turn out to live in the pipeline are named and evidenced, then handed over rather than quietly absorbed into this job
Review fee credited — you pay the difference, not both.
Definition Baseline
Not a starting point. Follows the reconciliation.
The wider job, and a different one.
- Everything in the agreement
- The rest of the metric family brought onto written definitions — the siblings that will disagree next quarter for exactly the same reasons
- The definition sheet extended across the family and put somewhere findable
- A procedure for adding a surface without forking a definition, and handover so the next reconciliation happens without me
Review fee credited — you pay the difference, not both.
Monthly Reconciliation
Monthly. Because a definition agreed once is a definition nobody has edited yet.
- The same bridge run each month against the current figures
- Diffed against last month, so a remainder getting bigger is visible before a quarter closes on it
- New surfaces caught as they appear — the definition sheet re-walked, not assumed
- A one-page written record each month. A document, not something you log into — if you want the numbers visible instead, that is a different service and I would rather point you at it than half-build it here
- Monthly in advance, cancel anytime, never auto-renewing
Four things about the packages, before you ask
- The cap is one metric, one agreed moment, and up to three surfaces. One metric means one number with one unit and one grain — net revenue, per calendar month, in reporting currency. Revenue on its own is not a metric, it is a family. If two grains are in scope that is two metrics, and I will say so before quoting rather than after.
- Three surfaces because it is arithmetic, not a sales limit. Comparing three things is two comparisons; a fourth surface is a third one, and it is quoted as such. Nobody is served by “and any other reports you have” on a page that then reprices halfway through.
- Reconciliation + Agreement is the marked tier, and it is where most of this ends up. Not because it is the biggest — the reconciliation on its own hands you an explanation, and the agreement is what turns the explanation into one number everybody uses. It is also the only tier that measures itself twice.
- The biggest thing that changes the size of a job is where the definitions live. A rule in a file can be read in minutes. A measure built by clicking, in a tool, by somebody who has left, cannot be read at all until we sit and look at it together — and that is a different shape of work.
What this does not do
Stated before the tiers matter rather than after, because a limit found afterwards is an excuse.
- It does not tell you which number is right. It tells you what each one counts and what the difference is made of. Often none of them is wrong, and the answer is that three different questions were being asked by three different teams.
- The remainder is stated, not eliminated. Some part of the gap normally stays unexplained. Naming it is the deliverable; promising it will be zero would be a lie, and you should be suspicious of anybody who does promise that.
- A reconciliation is as of a moment, and the moment passes. Where the cause was a definition it keeps holding, which is most of the time. Where it was timing, it will move again tomorrow.
- An agreed definition is not an enforced one. The agreement changes the surfaces that are yours to change and writes down the rest. Nothing stops somebody building a new report next month with a fourth definition in it.
- Where a cause lives in your pipeline, this names it and does not repair it. You get the evidence and what it is worth. The repair is separate work.
- This is not data quality testing, not monitoring, and not report building. It is one question answered with arithmetic.
- It is not an audit and it is not assurance. A comparison between a warehouse figure and a finance figure can look like accounting work and it is not — I am not an auditor, this is not an opinion on your financial statements, and nothing here should be handed to anybody as though it were.
What I need before anything can be quoted
Most of this you can answer in the contact form in a couple of minutes, and the answers change the size of the job more than anything I could guess at.
- Which single metric, stated with its unit and its grain.
- Which surfaces — up to three — and where each definition physically lives. A file, a view, a measure in a tool, a spreadsheet. If the answer to any of them is “nobody is sure”, say so; that is useful rather than embarrassing.
- Whether all three can be read as of one moment, or the honest answer that one of them cannot. That is not a problem — it is one of the answers.
- The three current numbers, in writing, before anything is looked at. The gap between what people believe the figures are and what they actually are is part of the finding, and it evaporates if it is collected afterwards.
- What each surface is believed to include and exclude, in your own words. This is regularly the moment two people discover they disagree, which is worth the ten minutes on its own.
- A decision on masking, made before anything runs.
- Whether any surface is reported externally — filed, audited, or sent to an investor, a lender or a customer. It does not make the arithmetic harder, but it raises the standard of evidence on every line.
Things this is not, and where they live instead
- Building reports or dashboards. Report development is a different conversation, and putting numbers on a screen is hosted monitoring.
- Building or modelling the semantic layer. The products are good and they are yours to adopt. This is what makes that decision possible, not a replacement for it.
- Data quality testing — dbt tests, Great Expectations, Soda. Free, better than hand-written, and yours to install.
- Repairing the pipeline — that is the pipeline rerun review, and the difference is in the table above.
- Turning documents into a dataset — bulk document data extraction.
- Warehouse cost reduction, query tuning, and migrating between warehouses. Real work, not this page.
What I can show you rather than tell you: travel-etl-pipeline is a public repository — a serverless ETL pipeline for NYC travel data on GCP, ending in a Tableau reporting layer. Ingest, transform, warehouse, report. Read the code rather than taking my word for anything.
Tell me which number nobody can agree on.
There is no free checker to run first on this one, and I would rather say that than invent one. So the useful first step is the disagreement itself: which metric, which reports, and what each of them currently says. If it turns out the difference is one refund rule that somebody can point at in five minutes, you have saved a fee and I would rather tell you that than take it.
Prefer to talk? Book a free call ↗ · Or hire me on Upwork ↗ · Typical reply within one business day.