Understand B2B promotions

Promotions vs. contract prices

Two mechanisms that both lower a price. Confusing them costs margin on your largest accounts.

A contract price is what a customer negotiated. A promotion is a temporary incentive. Both make a number smaller, they run at different points, and the place where they meet is the most reliable margin leak in B2B commerce.

They are not the same kind of thing

Contract pricePromotion
IsThe buyer's priceA reduction applied to whatever their price is
Lives inA price list bound to the accountA rule in the promotion engine
RunsDuring price resolutionAfter it
Applies toOne customer, by designEveryone matching the conditions
LastsThe term of the agreementThe campaign
NegotiatedYes, with that customerNo
Ends byValid until on the listThe validity window on the rule

The row that matters is the third. Resolution finishes with a number; the promotion engine then acts on that number. There is no contest between them, which is exactly the problem: the promotion does not know it is discounting a price that was already discounted.

The leak, with numbers

Ball valve 4711-A:

  • List price: €19.90
  • Müller Industriebedarf, framework agreement: €16.20 — already 18.6 % down, negotiated in exchange for a committed volume.
  • Spring campaign: −10 % on the valve range, no exclusions.

Müller's buyer adds 200 pieces. The chain resolves €16.20 because a price list bound to their organization outranks everything else. The promotion then takes 10 % off it: €14.58.

You have now given 26.7 % off list to the one customer who already paid for a discount with a volume commitment — and you gave it to them for nothing, because the campaign was designed to attract customers who buy at list. The campaign cost you most on the account it was never aimed at.

Scale it: run four such campaigns a year across a customer base where two-thirds of revenue sits on contract prices, and the leak is not a rounding error. It is the thing the phrase keine Margenleckage durch manuelles Override is usually pointing at — except nobody overrode anything. A rule did it, quietly, every night.

The fix: scope promotions by price list

The mechanism is a condition on the promotion that tests which price list the buyer resolved on.

SettingBehaviour
Open and default lists onlyThe promotion applies only to buyers who are paying an unnegotiated price. This should be your default
Named listsThe promotion applies to buyers resolving on the lists you list. Use it for a campaign aimed at one segment's contract customers
All listsApplies to everyone, contract customers included. Deliberate, and rare

Set it on every promotion. Not as a review step later — as part of creating one, because the promotion that was never scoped is the one that runs for eight weeks before anybody looks at the numbers.

"All lists" is a decision with a name on it. There are legitimate reasons to let a promotion reach contract customers — a genuine assortment expansion into a range their agreement does not cover, a new-product launch you want in every account. Those are commercial decisions someone should make on purpose. The default must never make them by accident.

The other direction: a promotion that undercuts a commitment

The subtler version. A customer commits to 12,000 metres of hose at €4.80 in exchange for the volume. Two months later, a public campaign puts the same hose at €4.65 for everyone.

Nothing in the system is wrong. Every price is the price it should be. But your framework customer now pays more than a walk-up buyer for the article they committed to, they will find out, and the conversation that follows costs you more than the campaign earned. It also poisons the next framework negotiation with every customer that one talks to.

Two habits prevent it:

  • Check your contract floor before pricing a campaign. If the campaign price approaches the lowest negotiated price in force, you have a problem regardless of who the campaign is aimed at.
  • Give the commitment a guarantee. "Your agreement price or the campaign price, whichever is lower" is a clean promise, easy to state in the agreement, and it converts a credibility problem into a small, bounded cost.

What the buyer sees

Three presentations, and the choice is commercial, not cosmetic:

PresentationShowsRight when
Your price onlyOne numberThe buyer is on a contract price. Their price is the point; a strike-through against your list price advertises how much they negotiated, to anyone standing behind them
Strike-throughList price crossed out, promotion price beside itThe buyer pays list normally. The saving is the message
Your price plus the savingTheir price, then the campaign reduction as a separate lineThe honest option where a promotion genuinely applies on top of a negotiated price

The default in a logged-in B2B storefront should be the first. Anonymous visitors and unnegotiated customers get the second. See Logged in vs. not and How promotions show on the storefront.

When you actually wanted a price, not a promotion

Half the promotions that cause trouble were the wrong tool from the start. Ask one question: is this a change to what someone pays, or an incentive to behave differently?

You wantUse
This article is cheaper for six weeks, for everyoneA time-limited price — an entry with a validity window
This customer pays this from now onA contract price
Everyone pays less above 500 unitsA scale price
Order more than usual and get something extraA promotion
Buy the pair and the total dropsA promotion, or a bundle
A rep can hand a customer a one-off incentiveA promotion with a coupon

The first three change the resolved price and are therefore visible everywhere a price is visible — in punchout catalogues, in BMEcat exports, in quotes drafted tomorrow. The last three are cart mechanics and stay in the cart. That difference decides which of your integrations sees them at all.

Next