← Back to all posts B2B & wholesale

Promo discounts and annual agreements: why your retail margin belongs at the top of the P&L

Supplying large retailers comes with two margin eaters: promo discounts and annual contributions. Most companies book them under marketing costs - and so never see their real margin per product. This is why they belong against your revenue, and how to set that up in Odoo.

Also in: Nederlands Deutsch

You sell your product to a supermarket chain for 2 euros, your cost price is 1.20, so your margin is 40 percent. Except it is not. A leaflet week ran over it, an invoice arrived afterwards for the promo difference, and at year end there is a contribution of a few percent of your revenue on the bill. Supplying large retailers hands you two margin eaters - promo discounts and annual agreements - and most companies book them away under marketing costs. That is exactly where you never see them again. This is why they belong at the top of your P&L.

The two things that eat your margin

The moment you do business with a large retailer, you get two items you do not have with an ordinary customer.

The first are promo discounts. Your product goes on promotion - a two-for-one, a leaflet week, a shelf position - and that costs money. In practice you see two forms. Sometimes it runs up front, through a temporary price list: for the duration of the promotion the retailer simply pays a lower purchase price. Tidy, because the discount then sits correctly in your sales order from the start. But often it runs afterwards: the retailer sends you an invoice for the difference, after the promotion has run and your revenue was booked long ago. That is the variant that surprises.

The second are annual agreements. Contributions you pay yearly, usually as a percentage of your revenue with that retailer, sometimes as a fixed amount. They sit in your trading terms and they are not optional.

Both have the same effect: of every euro you turn over with that customer, you keep less than your selling price suggests. And both get booked to the wrong place by default.

Why “under marketing” is an expensive habit

Follow how it goes. The retailer’s invoice for that promotion looks like a purchase invoice. It arrives at accounts payable, somebody has to pick a ledger account, and “promotion costs” or “marketing” is the most obvious bucket. Done. The same reflex applies to the annual contribution.

Administratively understandable. Commercially fatal. Because what you have just done is this: you moved the cost of selling to that retailer into a cost line nobody looks at when judging margin. Your gross margin looks beautiful - you did sell for 2 euros after all - and somewhere at the bottom, between your ad budget and your trade-show stand, sits the money that actually ate your margin.

The consequence is a steering error, not a bookkeeping error. You start steering on a margin that does not exist. You compare products on a percentage that is right for one and wrong for another, because one went on promotion and the other did not. You negotiate purchase prices to win half a percent while three percent disappears into a line you never open. And at the retailer where you grow fastest - and therefore run the most promotions and pay the highest contribution percentage - the gap between the paper margin and the real one is widest.

Where it does belong

The honest place is at the top, deducted from your revenue. Because that is what it is: you sold the same product for less money. A promo discount is not a spend, it is forgone proceeds. An annual contribution running as a percentage of your revenue is not a marketing campaign, it is the price of the shelf.

Put those two against revenue and something useful happens: your P&L starts with gross revenue, deducts promo discounts and annual agreements, and lands on a net revenue that is genuinely what the customer earned you. Only below that comes your cost price, and only then a margin you can steer on. You see per retailer what it really yields, and per product whether that item is profitable at all without a promotion.

That insight is not academic. It is the difference between knowing you are growing and knowing whether your growth makes money.

How to set this up in Odoo

The technology is not the hard part, the choice up front is. Concretely it is three things.

Separate ledger accounts. Promo discounts and annual agreements get their own revenue accounts, in the revenue section, not the cost section. An invoice from the retailer for a promo difference is booked not to promotion costs but to the promo discounts account, where it reduces your revenue.

Report structure. Your P&L layout in Odoo determines how those accounts roll up. Set it so gross revenue, discounts and net revenue appear as distinct lines at the top, and your income statement reads like the story above instead of a heap of ledger accounts.

Analytic accounting. This attaches every entry to a customer and a product group. That is what lets you answer “what do I earn on this retailer” and “what do I earn on this product” separately, including the discounts weighing on them.

None of the three is custom work. It is configuration. But it is configuration you do at the start, because this is the classic example of something that gets expensive afterwards: if you want insight later, you have to book to the right accounts today. Redistributing past entries across accounts you did not have then is manual labour nobody enjoys.

The honest nuance

This is a choice, not a law. There are accountants who prefer promo discounts as costs, and there are situations where a contribution genuinely is a marketing service you buy - an advert in the leaflet you could also have bought separately, for instance. That one does belong under marketing.

The point is not that there is one right answer. The point is that most companies never make this choice consciously. The item lands wherever accounts payable can file it fastest, and after that the whole company steers for years on a margin that is a few percent too high. Make the choice consciously, record why, and make sure your reporting shows what you want to know.

In short

Selling to large retailers costs you promo discounts and annual agreements. Book them under marketing costs and they vanish from view, leaving you steering on a gross margin that does not exist - hardest at the customer where you grow fastest. They belong at the top, deducted from revenue, because you sold the same product for less money. In Odoo you handle that with separate revenue accounts, a deliberate P&L structure and analytic accounting per customer and product. No custom work, but a choice you make at the start.


Supplying retail and unsure whether your margin adds up? Schedule a no-obligation Quickscan and we will look together at your P&L structure, your discount flows and what Odoo can show you.


Read more: EDI with a large retailer · Selling without your own warehouse · PIM, EDI and customer portal for wholesale · From Excel to Odoo · What does an Odoo implementation cost?

Frequently asked questions

What are promo discounts in retail?

Discounts you give when your product goes on promotion: a two-for-one, a shelf discount, a leaflet week. They come in two forms. Up front, through a temporary price list where the retailer pays a lower purchase price for the promo period. Or afterwards, through an invoice the retailer sends you for the difference. That second form surprises suppliers most, because your revenue is already booked by then.

What are annual agreements in retail?

Agreements about contributions you pay the retailer yearly, usually as a percentage of your revenue with that retailer or as a fixed amount. Think of contributions for shelf position, growth or promotion. They are part of the trading terms and they directly reduce what you keep from the revenue you make with that customer.

Where should you book promo discounts?

Against revenue, not under costs. A promo discount is not a marketing spend but a reduction of your proceeds: you sold the same product for less money. Book it under marketing costs and your gross margin looks higher than it is, so you steer on a number that does not exist. At the top of the P&L, deducted from revenue, it shows reality.

Can you see margin per product and per customer in Odoo?

Yes, provided you set it up beforehand. With separate ledger accounts for promo discounts and annual agreements, and analytic accounting per customer and per product group, you can follow net revenue and true margin per product and per retailer. The technology is not the problem; the configuration choice is. If you want insight later, you have to book to the right accounts today.

Why do so many companies book this under marketing?

Because it is administratively easier. An invoice from the retailer looks like a purchase invoice, so it lands with the costs. And a promotion feels like marketing. The result is that the cost of selling to that retailer hides among your advertising budget, exactly where nobody looks when judging margin per product.

Recognize this from your own setup?

A 30-min scan turns hunches into a concrete view, what stays standard Odoo, what becomes custom, what doesn’t need code at all.

Get in touch ← Back to blog