Skip to Content
Business and growth

You don't know your real margin, and month-end takes days

dooPartners· 16 May 2026 · 11 min read
You don't know your real margin, and month-end takes days

You see your real margin when sales, purchasing, stock and accounting live in one system: the cost price updates itself from real movements, every discount and freight cost lands on the order, and margin becomes a live number instead of a month-end reconstruction.

A customer asks for ten percent off a big order and your sales rep says yes, because the order is large and the customer is important. Nobody in the room actually knows whether that order still makes money after the discount, the shipping, and the supplier price that crept up last quarter. The deal closes. Six weeks later the books are finally done for the month, and it turns out half your best customers are your worst margin. By then the next quarter is already running on the same blind guesses.

This is two problems that share one root. First, you cannot see your real margin while it still matters, per product, per customer, per order. Second, closing the month takes days of someone exporting, matching and stitching numbers across systems before anyone gets an answer. The cost is not just the late nights at month-end. It is every pricing decision, every discount and every customer you keep that you would have priced differently if you had known the number on the day. Both problems disappear when sales, purchasing, stock and accounting sit in one system that calculates margin as the work happens.

Why you cannot see your real margin

Real margin is revenue minus the true cost to deliver. The true cost is rarely one number sitting in one place. It is the purchase price you actually paid (not the list price), the freight in, the discount your rep gave, the returns, and sometimes the labour. When those pieces live in different systems, or in spreadsheets that someone updates by hand, the margin you see is either an estimate or a number that only exists after the month is closed.

Three things usually break it.

Cost lives in one system and revenue in another. Sales sits in a CRM or a webshop, purchasing in a separate tool, stock in a third, and accounting in a fourth. Each one is right about its own piece and none of them knows the whole. To get margin you export from all of them and reconcile by hand, which is exactly why it only happens at month-end.

The cost price is wrong or stale. Margin is only as good as the cost behind it. If the cost price on a product is the price from two years ago, or an average that nobody recalculates, every margin built on it is fiction. When stock movements and purchase prices do not feed the cost automatically, the cost drifts and nobody notices until the year-end accountant does.

Discounts and extras never reach the margin. A rep gives ten percent in the field, shipping is billed separately, a return comes back next month. If those do not land on the same order line as the revenue and the cost, the margin report shows the gross number and hides the real one. The order looked profitable. It was not.

Diagram comparing four separate systems reconciled by hand against one connected system that shows margin in real time
Separate systems give margin only at month-end; one connected system shows it live.

The close takes days for the same reason

Month-end is slow for the same reason margin is invisible: the data is scattered. Closing the books means making sure every sale is invoiced, every purchase is booked, the bank is reconciled, stock is valued, and nothing is double-counted or missing. When sales, purchasing and stock live outside accounting, someone has to pull each one out, match it line by line, find the gaps, chase the missing invoice, and only then can they report. Each of those steps is manual, each is a place an error hides, and each one waits on the previous one. Days, not hours.

The slow close and the missing margin are the same illness with two symptoms. Fix the cause and both get better at once.

How one connected system fixes both

The fix is not a better spreadsheet or a faster accountant. It is removing the gaps between the systems so the numbers are already together. In one connected system, the events that determine margin and the close happen once and flow everywhere they are needed.

1

Put sales, purchasing, stock and accounting in one system.

When a sale, a purchase and a stock move all live in the same place, the cost and the revenue meet on the same record automatically. There is nothing to export and reconcile, because there were never separate islands to begin with. This is the step that makes everything below it possible.

2

Let the cost price update itself from real movements.

Set stock valuation so that every receipt at the price you actually paid updates the product cost (Odoo does this with automated valuation and an average or FIFO cost method). Now the cost behind every margin is the real, current cost, not a number someone forgot to update.

3

Capture discounts, freight and returns on the order, not on the side.

Book the discount on the sales line, the inbound freight into the landed cost, the return as a credit against the original order. Then the margin Odoo shows per order is the margin you actually made, because every euro that moved is on the same record.

4

Read margin live, not at month-end.

With the data together, the margin reports update as the work happens. Odoo's sales analysis and the margin field on the order let you see margin per product, per customer, per order, today, while you can still act on it. The discount conversation changes when the rep can see the floor before they give the number away.

5

Make the close a review, not a reconstruction.

When sales are invoiced from their orders, purchases are booked against their bills, the bank feed reconciles against them, and stock is valued automatically, month-end stops being a rebuild. The books are mostly closed already because the work closed them as it went. The accountant reviews and confirms instead of stitching, and days become hours.

The part that trips people up

A few things catch almost everyone

Garbage cost prices in, garbage margin out. Turning on margin reporting does not create correct costs. If your products were loaded with a zero cost, a guessed cost, or a one-time figure that never updates, every margin is wrong with full confidence. The cost method (standard, average, FIFO) and the opening costs have to be set deliberately, and changing the method later revalues your stock, which hits your books.

Margin needs the analytic and valuation setup in place first. Real-time margin and a fast close depend on the right accounting configuration: automated stock valuation, the cost method, the chart of accounts mapped correctly, and analytic accounting if you want margin by project or department. Get this wrong and the reports look fine but reconcile to nothing.

One missing connection brings the gaps back. If the webshop or the POS or the supplier portal is not connected and someone keys those numbers in by hand, you have rebuilt the island you were trying to remove. The benefit only holds when the connections are complete and stay connected through upgrades.

Quick checklist

  • Can you see margin per order, per customer and per product today, without waiting for the close?
  • Does your product cost update automatically from real purchase prices and stock moves?
  • Do discounts, freight and returns land on the same order as the revenue?
  • Are sales, purchasing, stock and accounting in one system, or stitched together by hand?
  • At month-end, does the accountant review numbers that are already together, or rebuild them from exports?
  • Is your stock valuation method set on purpose, with correct opening costs?

FAQ

Why can't I see my real margin in Odoo?

Usually because the cost price behind your products is wrong, stale, or zero, or because discounts, freight and returns are not booked on the same order as the revenue. Odoo can show margin per order, per customer and per product in real time, but only when stock valuation feeds the cost automatically and every cost lands on the order line. Fix the cost setup first, then the margin reports become trustworthy.

Why does closing the month in Odoo take so long?

The close is slow when sales, purchasing and stock live outside accounting and someone reconciles them by hand at month-end. When sales are invoiced from their orders, purchases booked against their bills, the bank feed reconciled, and stock valued automatically, the books are largely closed as the work happens. The accountant then reviews instead of rebuilding, and the close drops from days to hours.

How does Odoo calculate margin?

Margin on an Odoo sales order is the sale price minus the product cost, line by line, summed for the order. The accuracy depends entirely on the cost price. With automated stock valuation and an average or FIFO cost method, the cost reflects what you actually paid, so the margin reflects what you actually made. With a manual or stale cost, the margin is a guess.

Do I need accounting in Odoo to get real-time margin?

Not strictly for the margin on a sales order, which uses the product cost. But to get margin you trust and a fast close together, you want sales, purchasing, stock and accounting in the same system with automated valuation. That is the configuration that removes the manual reconciliation and makes both the margin and the close reliable at the same time.

Will real-time margin be accurate straight away?

Only if the cost prices and the valuation setup are correct first. Switching on margin reporting on top of wrong costs gives you confident, wrong numbers. Set the cost method on purpose, load correct opening costs, connect the channels that are still separate, and check that the reports reconcile to the books before you trust them.

Read next Every new order means more admin: how to grow without growing headcount

Open knowledge. Are you an Odoo partner who solves these problems too? Contribute your own solutions and grow toward Gold with the network.

For partners
When to get a partner

Some problems need a pair of hands, not a how-to.

dooPartners is a worldwide network of independent, Odoo-certified partners. Local where you are, with the network behind them when a project grows beyond one agency. You keep one point of contact, and you choose who you work with.

Find a partner near you