Skip to content

Sample · Data x-ray

Four figures traced back to the field they come from.

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.

01

The company in the example

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.

4figures traced end to end, one for each decision they hold up
27stops counted across the four, from the field to the report
10of those stops where the figure can break with nobody noticing
3places outside the ERP where the data spends part of its life
22,560dollars between the two sales reports for the very same month

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.

02

The map: where the data lives

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 1 · The four systems the data lives in Reads the report Closes the month Gives thefigures Sends the file Pasted by hand Monthlystatement Sales Reads the monthly report andsets the targets Accounting Closes the month and answersfor the result Management Decides with the four figureson this page The company ERP [Odoo 19] Orders, invoices, stock andreceivables The logistics operator Sends a file with the month'sreturns The price list spreadsheet Lives in a shared folder,outside the ERP The bank Hands over the statementcollections are reconciledagainst
Who asks the ERP for figures, and which other systems talk to it.
Level 2 · How many hands it passes through From where it is born to whoever reads it · four figures Records Pasted by hand Exported on day2 Gets pasted Gets read Whoever records it [14 people] Sales reps, warehouse,purchasing and accounting The operator's file [one CSV a month] The returns that never gothrough the ERP Odoo 19 [the company database] Orders, invoices, valuationlayers and due dates The day-2 export [by hand, every month] Someone exports, pastes andadjusts: the trail ends here The three spreadsheets [shared folder] Monthly sales, margin andprice list The four reports [what gets decided] Sales, profit and loss, stockand receivables
The hands it passes through. The one in red is where the trail ends.
Level 3 · Which field each figure hangs from Inside Odoo Outside Odoo Monthly sales [account.move.line · price_subtotal] Posted invoices, by invoicedate Margin by product [account.move.line · margin] Price minus the cost on theday of the sale Inventory at cost [stock.valuation.layer · value] Every move leaves its ownvalue layer Overdue receivables [account.move · invoice_date_due] Grouped by contact, not bygroup The month-end cut [invoice_date · date] Three reports, three differentcuts The operator's file [devoluciones-202608.csv] The month's returns, pasted byhand The monthly sales spreadsheet [venta_mes.xlsx] Exported on day 2 and adjustedby hand The price list spreadsheet [precios_lista.xlsx] No history: only today's pricecounts
The field each figure hangs from, and what lives outside the ERP.

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.

03

Monthly sales

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.

Monthly sales · from the invoice to the two reports Who recordsit Odoo The monthlysheet The salesreport The profitand loss The rep confirms theorder sale.order The invoice is issuedand cleared account.move Each line storesquantity, price anddiscount price_subtotal On day 2 someoneexports and pastes intothe sheet ! Adds by date and neversubtracts credit notes ! Sales report · USD412,860 The profit and lossadds the revenueaccount account.report Profit and loss · USD390,300 The other path
The same data leaves the system down two paths. One goes through a spreadsheet and ends in the sales report; the other never leaves and ends in the profit and loss.

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.

04

Margin by product

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.

Margin by product · where the cost slips away Who feeds it Odoo The marginsheet Who decides The import arrives withfreight and duty apart ! The product cost iskeyed in twice a year standard_price ! The sales invoicestores price anddiscount price_subtotal Margin subtracts thecost on the day of thesale margin Crossed against today'scost, not that day's ! Margin ranking byproduct
The price is a recorded fact; the cost is an opinion typed in twice a year. Margin inherits the fragility of the cost, not that of the price.

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.

05

Inventory at cost

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.

Inventory at cost · two totals for the same day Warehouse Odoo Who reads it Accounting Goods are received andconfirmed stock.picking The move leaves itsvalue layer valuation.layer The category says whichaccount it goes to product.category ! The stock report addsevery layer Six categories neverreached the account ! Inventory at cost · USD268,940 Stock account · USD237,470
The stock report adds every valuation layer. Accounting only ever sees the ones that reached an account. Six product categories created after go-live never had one set.

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.

06

Overdue receivables

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.

Overdue receivables · three figures that think they are one Who createsit Odoo Who collects Who reads it The invoice isconfirmed with itsterms invoice_date_due In one out of five theterm is changed by hand payment_term ! A part payment goes tothe oldest invoice partial.reconcile ! Ageing groups bycontact aged_receivable The group's fourbranches are fourcontacts ! Overdue receivables ·USD 96,310
Ageing hangs off the due date, and the due date hangs off the payment term somebody left on the invoice when confirming it.

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.

07

Why the two sales reports disagree

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 22,560 dollars between the two sales reports USD 412,860 The month's sales report − USD 18,240 Credit notes issued after thecut-off ! − USD 6,510 Operator returns that arrivedlate ! + USD 2,190 Last-day invoices keyed in onday 2 ! USD 390,300 The profit and loss
From one report to the other, adding and subtracting what each path does differently. It closes exactly, and that is the whole proof: until the gap can be broken down like this, every explanation is a hypothesis.

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.

08

What breaks when someone changes a field or installs a module

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.

What breaks when something changes A field thatchanges The product channel is renamed The margin sheet lumps everythingunder “no channel” ! The product cost is edited The margin of what was already soldchanges ! The customer's payment terms arechanged The ageing of the book isrecalculated backwards ! A module thatgetsinstalled Landed costs Imports start including freight andstop being comparable ! A second price list The discount travels on the line,not on the list ! Analytic accounting by warehouse Revenue gets split and the reportstill adds the total ! A file thatarrivesdifferent The operator changes theseparator The load lands half empty and nobodynotices ! The file arrives a day late The returns fall into the next month ! A new column appears at thestart Quantities get read from the pricecolumn !
The row says what kind of change it is and the box says which figure stops being true. None of the nine is anybody's mistake: they are reasonable things somebody will do next month.

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.

09

The order to fix it in

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.

First: write the definition and agree one cut-off

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.

Second: remove the hand copy of the operator's file

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.

Third: give the six orphan categories an account

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.

Fourth: group receivables by economic group

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.

And only then: automate

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.

10

This is what you get

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.

USD 1,200

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.

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.

WhatsApp