Sales pricing and discounts in ERP: how SMEs stop giving away margin quietly

· 8 min read · SilverData team

In most Polish SMEs the pricing policy lives on two levels: the official price list sitting in the ERP, and the "real" price list — 40 exceptions inside salespeople's heads, a few discounts someone promised on a handshake, and an Excel with a discount matrix for "regular customers" that nobody remembers when they last updated. As long as things are going well, nobody touches it. When margin starts to slide, it turns out nobody knows how much the company is actually giving away.

This isn't bad faith from the sales team. It's a problem with the system that doesn't support them. Salespeople are paid to sell. If the ERP can't show them the right price in five seconds, they'll quote from memory — and they'll quote low, because "closing the deal" feels safer than risking the customer walks to a competitor. The result: the company sells well but earns less and less on it.

This post is about how to get out of that trap — without switching ERP and without a revolution that turns half the company against you.

Where the mess comes from

In a typical wholesale or manufacturing SME the price list starts drifting away from reality the moment the first "regular customer" appears. Somebody in 2019 promised 12% off everything to a large buyer from Poznań. Somebody else in 2021 agreed with a customer from Katowice that they'd buy at list minus 15%, but only for category A. Meanwhile purchase prices changed, inflation happened, that salesperson left for a competitor — and the discount from 2019 still applies. Nobody notices until someone runs a per-customer margin report.

On top of that: price lists for different sales channels. Retail, small wholesale, large wholesale, e-commerce, chain accounts — each has a different price. In theory the ERP has price lists. In practice someone set them up once and nobody maintains them, because manually updating 400 items across five price lists takes two full days.

Third problem — promotions and seasonal campaigns. They start as "just two weeks", then someone forgets to switch them off, and six months later a salesperson asks "why is this item running at -20%" and it turns out last year's promo is still live in the system.

The common denominator: there's no single place where the company's pricing policy is visible in one piece. There's the ERP, there's Excel, there are salespeople's heads, and there are handshakes with customers nobody re-opens.

What your ERP actually can do (and you don't use)

Every serious Polish ERP — Comarch Optima, enova365, Subiekt Nexo, Microsoft Dynamics 365 Business Central — has had proper price-management tools for years. The problem is they're rarely configured, because "nobody has time". Worth knowing what's on offer.

Note: this is not a wishlist. These are features you already own in your licence. It's a matter of configuration, not buying a new module.

How to tackle the cleanup

A one-off "let's set up all the prices in the ERP" project never works. Too many exceptions, too many customers, too little time. It's smarter to phase it, starting with what brings in the most money fastest.

  1. Freeze "new exceptions" — from today, any non-standard discount needs one sentence in an email to the sales manager. Even if you approve 100% of requests in the first month, the fact they're recorded changes behaviour.
  2. Rank customers by revenue and by margin — 80% of revenue usually comes from 20% of customers. Start there. Check their real prices (not list prices), figure out where the discounts came from and whether they still make sense.
  3. Clean up the base price list — one net price list, current, that you settle everything against internally. Without it, there's no way to reason about discounts, because there's no "from" to discount from.
  4. Introduce 3-5 channel price lists — retail, small wholesale, large wholesale, e-commerce, chain. Not 15, not 25 — as many as you actually need. Anything more is illusory precision that falls apart in operations.
  5. Individual prices only for the top 20 customers — the rest use channel prices. For the top 20 it's worth sitting over a contract and entering specific SKUs with valid-from and valid-to dates.
  6. Turn on minimum-margin control — the salesperson sees the price and sees the margin. Going below the threshold requires a one-click approval from their manager. It's the change that pays back the fastest in hard numbers.
  7. Schedule a review every six months — a price list that hasn't been touched for 12 months stops being a price list and becomes archaeology.

The rule: every price in the company must be visible in one place. An Excel with discounts pinging around by email is not a pricing policy — it's a ticking bomb.

A concrete example

18-person electrical-wholesaler in Małopolska, running Comarch Optima with commercial and warehouse modules, about 3,200 SKUs, 380 active B2B customers. Starting point: one "base price list" in the ERP, two channel price lists nobody had maintained for two years, and an Excel with individual discounts for "important customers" — 47 entries, 12 of which applied to customers who hadn't bought anything for six months. Gross margin was crawling at 22% and nobody could explain why, because "we've priced things right, haven't we".

What we did, in order:

  1. 12-month customer revenue ranking — turned out top 30 customers make up 74% of revenue. The rest is a long tail where discounts are cosmetic anyway.
  2. Per-customer discount analysis — four of the top 30 had discounts set years ago by a salesperson who'd left in 2022. Nobody had revisited them. Two wouldn't have noticed a correction, one had a real contract, one was drifting 8% below where they should be.
  3. Three channel price lists instead of two forgotten ones — retail (rare but needed), standard wholesale, chain wholesale. Items in each list aligned with the base list plus a defined markup. Updated by percentage from the base — not manually per SKU.
  4. Contract prices only for the top 20 — specific SKUs, specific prices, specific end-of-year expiry. Salesperson sees them automatically when issuing a document, doesn't have to remember or check Excel.
  5. Minimum-margin control — 15% on wholesale, 25% on retail. Going below: one-click email to the manager, who approves or denies. Full history logged in the ERP.
  6. Six-month review — a calendar entry in the sales manager's Outlook, a specific date, a specific ERP report as the starting point.

Result after 4 months: gross margin lifted from 22% to 25.5%. On annual revenue around 14 million PLN that's roughly 490,000 PLN a year — with no price increase for most customers, purely by closing "silent discounts" the company wasn't controlling. Salespeople protested at first ("this will slow sales down"); after two months they were on board, because they saw the manager approves reasonable drops quickly and only rejects the ones without any justification.

Project cost: about 22,000 PLN spread over 3 months — pricing audit, Comarch Optima configuration, sales-team and manager training. Payback in the second month.

Traps to watch for

A few things that can capsize the whole project:

What it really costs

For a wholesale SME of 15-40 people, realistic ranges:

Total: 10,000-20,000 PLN. Return: lifting the average margin by 1 percentage point on 5 million PLN of annual revenue means 50,000 PLN. Payback typically 2-4 months.

What next

Sorting out pricing in the ERP is not an IT project. It's a finance project where IT provides the tool. The biggest resistance doesn't come from the system, it comes from people who are comfortable in the chaos. But the first month the margin report shows real numbers, the discussion ends — because you can see how much the company was giving away without knowing it.

If you suspect your situation looks similar — half an hour of conversation is usually enough to at least know where to start. No commitments, no 40-slide deck.

A price list you look at once a year isn't a price list. It's a memorial to people who left long ago and customers who stopped buying long ago.

← Back to blog