Data x-ray · 2 weeks
Three or four figures traced end to end, with about six hours of your people's time spread over the two weeks. On delivery, any figure in scope is recalculated from source in front of you and gives the same number.
Sample · Data x-ray
This is the sample deliverable of the data x-ray: what you get, in full, for an invented company. Four figures of the kind every company has — monthly sales, margin by product, inventory at cost and overdue receivables — traced from the field where they are born to the report where somebody reads them.
With the uncomfortable part left in: where a figure breaks, where two reports for the same month disagree, and why. A sample where everything works proves nothing.
Distribuidora Aguaclara does not exist. The company, its figures, its files and its people are invented, as everywhere else on this site. No data comes from a client, disguised or otherwise.
Distribuidora Aguaclara imports and distributes industrial hardware and tools. Eight years on Odoo, three warehouses, fourteen people. A distribution business was chosen because that is where the paperwork of the trade — imports, returns, a logistics operator — splits the data across several places without anyone ever deciding it should.
Nobody starts this by asking for data engineering. They start because the monthly sales report closes on one number and the profit and loss on another, the gap changes every month, and the question “which of the two is the good one?” comes up at every close. Nobody is lying; nobody can explain it.
Three heights over the same ground. The first says which systems touch the data and who reads it. The second, how many hands it passes through between being born and being decided with. The third goes down to the field each figure hangs from, which is what lets you answer in ten seconds what breaks if somebody touches it.
Level 2 has one box marked in red, and it is not the ERP: it is the day-2 export. That is where someone exports, pastes and adjusts, and where the record of what changed runs out. The fragile piece in a mid-sized company is rarely a system; it is usually the step between two of them.
Each figure is drawn in lanes: the row says who holds the data at that moment, the box says what happens to it. A box with a green border leaves a trace in a field of the system, and the field is named at its foot. A box with a dashed orange border and a warning mark is a stop where the figure can break.
Eight stops, two of them outside Odoo, and two reports at the end that do not agree.
Where it comes from. From the customer invoice line: each line's subtotal, with its quantity, price and discount already applied. It is the same data for both reports; what differs is what each path does with it afterwards.
How many hands it passes through. Eight. The rep confirms the order, the system issues the invoice, the line stores the amount, and from there it forks: on one side somebody exports on day 2 and pastes into the monthly sheet, the sheet adds by invoice date, and out comes the sales report; on the other the profit and loss adds the revenue account without ever leaving the system. Two of the eight stops happen outside the ERP.
Where it gets copied by hand. At a single stop, and it is the one that decides everything: the day-2 export. Nobody records what was adjusted while pasting, so next month the number cannot be reproduced.
What breaks it. That the sheet adds by invoice date and never subtracts the credit notes issued after the cut-off, while accounting does subtract them. Each report is right on its own terms; what nobody ever wrote down is which one measures what.
The figure behind which product gets pushed and which customer can be given a discount. It is also the easiest one to believe, because the system works it out on its own and reports it to two decimal places.
Six stops, three of them marked: the cost is typed in by hand, the margin is worked out against the cost on the day, and the sheet crosses it again against today's cost.
Where it comes from. From the margin field on the invoice line, which subtracts from the subtotal the cost the product carried on the day of the sale. Half the figure comes from a recorded fact and the other half from a field somebody maintains by hand.
How many hands it passes through. Six. Purchasing records the import, whose freight and duty arrive on separate invoices; somebody updates the product cost twice a year; the sale stores price and discount; the system computes the margin; a spreadsheet crosses it again against the current cost; and the ranking reaches whoever decides.
Where it gets copied by hand. Twice a year in the cost, and every month in the sheet that redoes the calculation. The second copy does not just repeat the work: it produces a different number from the one the system already had.
What breaks it. That freight and duty on imports stay outside the product cost, so the margin on imported goods reads higher than it is. And that the sheet crosses against today's cost: last year's margin changes value every time somebody updates a cost, and nobody is comparing what they think they are.
No spreadsheets anywhere in this one, and the figure breaks all the same. This is the example worth reading slowly, because it disproves the idea that the problem is always outside the system.
Seven stops, every one of them inside Odoo, and two different totals for the same day, thirty-one thousand dollars apart.
Where it comes from. From the valuation layers: every stock move leaves one, with its quantity and its value. The stock report adds them all up.
How many hands it passes through. Seven, and not one of them is a person copying anything: the warehouse receives and confirms, the move leaves its layer, the product category decides which account that layer posts to, and out of that come two totals, the one on the stock report and the one on the account balance.
Where it gets copied by hand. Nowhere. This figure never passes through a spreadsheet, and it still does not reconcile: the problem is configuration, not copying.
What breaks it. That six product categories created after go-live were left without a valuation account. Their layers exist and the stock report counts them; accounting never saw them. That is 212 references and USD 31,470 that show up on one report and not the other, every month, for the past two years.
The figure behind who keeps getting shipped to. It looks like a fact — either it is overdue or it is not — and it rests on three decisions nobody remembers taking.
Six stops, three of them marked, and three different figures circulating in the company as though they were one.
Where it comes from. From the invoice due date, which the system works out from the customer's payment term at the moment of confirming. It is not a fact about the customer: it is a snapshot of the term they had that day.
How many hands it passes through. Six: the invoice is confirmed with its term, in one out of five somebody changes that term by hand before confirming, part payments are applied by default to the oldest invoice, the ageing report groups by contact, and whoever collects works by economic group, something the report has no idea about.
Where it gets copied by hand. Nowhere, again. What is done by hand is changing the term, which is not copying a piece of data but changing the rule it is computed with.
What breaks it. Three things at once. A term touched by hand means two invoices for the same customer fall due under different rules. A part payment applied to the oldest invoice means “the oldest unpaid invoice” is not the one you think. And the group's four branches are four contacts, so the group's exposure never appears in one place: management reads USD 96,310, sales reads USD 71,400 because it filters for over thirty days only, and collections keeps its own tally in a notebook.
With the lineage in hand the gap stops being a mystery and becomes a subtraction. These are the 22,560 dollars between the sales report and the profit and loss for August, one by one.
The credit notes, USD 18,240. They are issued in the first days of the following month, against invoices from the month just closed. Accounting subtracts them in the month they are issued; the sales sheet never does, because its cut-off has already passed. It is the larger half of the gap and it costs nothing to fix: agree one cut-off and write it down.
The returns that arrive late, USD 6,510. The logistics operator sends its file somewhere between day 5 and day 12. When it lands after the close, its returns fall into the next month and the closed month stays inflated. This is the one that breaks in silence: it changes size every month, so nobody can learn to allow for it by eye.
The last-day invoices, USD 2,190. They get keyed in on the afternoon of day 2, after somebody has already exported that morning. The system has them with the right date; the sheet never saw them.
And what the subtraction does not settle. That both numbers can be explained does not make them equivalent. One measures what was billed under one criterion and the other under a different one; what was missing was never a calculation but the written sentence saying which one is used for what, and who signs it. The company decides that, not me.
This is the part of the finding that gets used afterwards, once the work has been delivered. Nine changes of the kind that really happen in a company that is still alive, with what each one takes down with it.
The one that surprises people. Installing landed costs is an improvement: the product cost starts including freight and duty, which is correct. And in the same move the margin before and the margin after stop being comparable, with no report saying a word. An improvement that breaks the historical series is still a break.
The one that happens most. The supplier file that arrives different: another separator, a new column at the start, a day late. The load lands half empty or shifted, the number still shows up, and it is already wrong. This is what separates an automated load from a watched one: that it stops and says so instead of writing halfway.
Why knowing it in advance pays. With this table, the question “what happens if we rename this field?” is answered in ten seconds and by name, instead of being discovered three closes later. It is worth exactly what a set of building plans is worth before you cut into a wall.
The finding ends in an ordered list, not a wish list. The order is not by severity: it is by how much of the gap each step removes for how little work, because doing the cheap thing first buys permission to do the expensive one later.
What counts as a month's sales, what date it cuts on and what gets subtracted. It costs nothing, takes a two-hour meeting and removes USD 18,240 of the 22,560. The company decides it and signs it; I write it down and make it reproducible.
It is the stop that breaks the month in silence and the only one whose gap changes size without warning. While it is there no definition holds: which month is the right one depends on whether the file arrived before or after the close.
A configuration fix plus a rebuild of the affected layers, and it closes the USD 31,470 on inventory by itself. It goes third and not first because it touches two years of accounting and needs whoever closes the month available.
And stop touching the payment term on the invoice: if a customer needs different terms, change the customer's terms. With that, the three receivables figures become one.
Once it is written down what is being calculated, a scheduled load with its quality checks and its alert when it fails has something to hold up. Automating before that is freezing the mess and making it faster.
None of the first four steps requires buying anything or hiring me to carry it out. That is the point of the finding being sold on its own: the document says what to fix and in what order, and your own team can do it, or you can ask anyone you like for a quote with this in hand.
What is on this page, with your figures, your systems and your people: the figures you choose, the lineage of each one drawn out, the map of what breaks, and the ordered list of fixes. The document is written to be read by whoever decides, not only by whoever codes.
Three or four figures traced end to end, with about six hours of your people's time spread over the two weeks. On delivery, any figure in scope is recalculated from source in front of you and gives the same number.
The diagrams on this page are drawn by a script from a single description of the company, which is the same discipline the real work is delivered under: if the lineage changes, it is regenerated rather than touched up by hand. If what you want to see is the same method at the height of the process rather than the data, those are process mapping and the architecture map.