Real margin at the point of sale: what your Odoo POS doesn't tell you

Maxime VanderhaeghePublished 6 min read

In short, The till records sales, it doesn't compute real margin. Four leaks erode what each product actually earns without showing up in the till report: discounts given, shrinkage, stockouts on high-margin items, and product mix. Real margin is rebuilt by crossing ticket lines, product costs and inventory adjustments. The top 10 by real margin set against the top 10 by volume reveals the best-sellers that contribute little. Doable by hand, unsustainable every week.

The product that sells the most becomes the store's star: highlighted, restocked first, defended in meetings. That's a healthy reflex. The problem is that almost nobody checks what that best-seller actually earns, once discounts, shrinkage and stockouts are taken into account. We steer by volume because volume is the only number the till displays without effort.

This article's thesis is simple: the till records sales, but real margin has to be rebuilt. Odoo's point of sale is an excellent checkout tool, fast and reliable, and that's not the issue. The issue is that a till's job is not to analyse product profitability. Here is where margin leaks, why you don't see it, and how to compute it in Odoo.

The 4 invisible margin leaks at the till#

Four mechanisms eat into real margin without ever showing up as such in a standard till report.

Margin at the till · 4 leaks

  1. 01

    Discounts given

    Manual discounts, goodwill gestures, rounding. Trivial one by one, significant once added up.

    Invisible · The product’s theoretical margin stays on screen, it’s the collected margin that erodes.

  2. 02

    Shrinkage

    Breakage, theft, expiry, inventory errors.

    Invisible · Recorded globally at best, never reattributed to the profitability of the product involved.

  3. 03

    Stockouts on high-margin items

    A stockout on a high-margin product shifts the sale to a less profitable substitute, or makes it vanish.

    Invisible · The sales report shows what sold, never what failed to sell.

  4. 04

    Product mix

    The average basket rises while the average margin falls, if growth comes from the least profitable products.

    Invisible · Revenue hides the structure of what makes it up.

None of these four leaks shows up in the standard till report, because none of them reads off a single number.

Discounts given at the till. Manual discounts, goodwill gestures to close a sale, "let's round it down" pricing. Each is trivial, the accumulation is not. The product keeps displaying its theoretical margin, the catalogue one, while the margin actually collected erodes ticket after ticket. Nobody decides to sell cheap, and yet the margin drops.

Shrinkage. Breakage, theft, expiry, inventory errors. When it is recorded, it's globally at best, in one block, never reattributed to the product that suffered it. As a result, a product losing 8 % of its volume to shrinkage looks as profitable as a product with no loss, when it isn't.

Stockouts on high-margin items. A stockout on a high-margin product is invisible: either the sale shifts to a less profitable substitute, or it disappears. The sales report faithfully shows what sold, never what should have sold. It's the quietest leak, because it's made of absences.

Product mix. Your average basket can rise while your average margin falls, if growth comes from the least profitable products. Revenue is up, everyone's happy, and the margin structure quietly degrades. Revenue hides the mix.

None of these leaks can be quantified by guesswork. But keep the order of magnitude in mind: on retail margins, discounts and shrinkage combined often cost several points, and double-digit gaps between displayed margin and collected margin are not rare.

Why your till doesn't show it to you#

This isn't a flaw in Odoo, it's a question of role. A point of sale is built to check out fast and accurately: scan, take payment, give change, print the ticket. It does that very well. Analysing product profitability simply isn't its mission.

Yet the data all exists, in your Odoo. But it's scattered: sales and discounts in the point of sale, costs in the product records, shrinkage in inventory adjustments, stockouts in stock moves. Real margin is not a report you forgot to open, it's a cross of four sources nobody has time to run every week.

Add to that a reading habit that works against you. The point of sale dashboard highlights revenue and ticket count, because those are the indicators of a good day at the till. They answer the question "did we sell well?", not the question "did we earn well?". The two don't always give the same answer, and it's precisely when they diverge that steering becomes useful. As long as you watch the right number for the wrong question, the store can run at full tilt while earning less than the previous quarter.

Computing real margin per product in Odoo: the method#

Here is a concrete method, applicable in standard Odoo, with no specific module.

  1. Start from the collected sale lines. Point of Sale, Reporting, detailed Sales, or directly the pos.order.line model over a given period. What you care about per line: the quantity and the price actually collected, that is after discount, not the catalogue price.
  2. Pull the product cost. The standard_price of each product record. A word of caution: the reliability of the calculation depends on your valuation method (standard, FIFO or AVCO). A product cost never updated since a supplier price increase distorts the whole margin, for better or worse.
  3. Compute the real collected margin. For each product, sum (collected price minus cost) multiplied by quantity. Compare it to the theoretical margin (catalogue price minus cost): the gap between the two is exactly the weight of your discounts, product by product.
  4. Reattribute shrinkage. Take the negative inventory adjustments of the period, value them at cost, and subtract them from the margin of the product involved. It's the step almost nobody takes, and it's often the one that reshuffles the ranking.
  5. Identify stockouts. Spot the high-unit-margin products whose stock dropped to zero during the period (cross on-hand quantities and sales). You won't be able to quantify the lost sales precisely, list it as a qualitative signal: "high margin, out of stock X days".
  6. Set two rankings against each other. Produce the top 10 by real margin and the top 10 by volume, side by side. It's the clash between these two lists that speaks: products in the second but absent from the first are your low-contribution best-sellers, the ones you defend out of habit without them truly feeding the bottom line.

All of this is doable by hand: an export, a spreadsheet, two hours of focus. The difficulty isn't the calculation, it's doing it again every week. A cross run once is a curiosity, run every Monday it's a steering tool. It's the same shift we described about the choice between showing the data and recommending the action: a report shows, steering recommends.

The weekly routine that changes how you steer#

A retail leader doesn't need forty indicators, they need four numbers read every Monday:

  • The real margin of the top 10, to know what truly feeds the bottom line.
  • The gap between real margin and theoretical margin, that is the weight of your discounts over the week.
  • The week's shrinkage, valued at cost.
  • The stockouts on high-margin products, your hidden lost sales.

Four numbers, not forty. Read at the start of the week, when you can still act: adjust a display, rein in a discount policy, trigger a restock on a high-margin product. Read on Friday, they only serve to take note.

Conclusion#

The till records, it doesn't steer. That's the fundamental distinction between assistance and steering: one executes the transaction, the other turns data into a decision. Real margin per product isn't a report hidden in Odoo, it's a cross to keep alive over time. An UpBoard agent dedicated to the point of sale, plugged into Odoo POS, is coming soon to run that cross continuously. In the meantime, the UpBoard scan already analyses your sales and margins in 8 minutes, read-only: enough to see, today, the gap between what your products display and what they earn.

See what your Odoo data has to tell you

A 30-minute demo on your own data, leave with your first quantified opportunities.