How promotions show on the storefront
A promotion the buyer cannot see does not change behaviour, and one shown the wrong way tells a customer how much they negotiated. This article covers where promotions surface, and where they must not.
Product tiles and detail pages
A promotion that depends only on the product can be shown before the cart exists: a badge on the tile, and the reduced price on the detail page.
A promotion that depends on the cart — "−5 % above €2,500 net" — cannot be shown as a price, because at that point there is no cart to evaluate. It is shown as a statement of the offer: "From €2,500 net order value: 5 % discount". That is not a lesser presentation. For a professional buyer, the condition is the message, because it tells them what to do.
| Promotion depends on | Show on the tile | Show on the detail page |
|---|---|---|
| The product alone | Badge and reduced price | Reduced price with the reason named |
| Cart value or quantity | Badge with the condition | The condition, and the tier ladder where one exists |
| Free goods | "12 + 1" badge | The rule, stated in full |
| A coupon code | Nothing | Nothing. A code is not a public offer |
| Customer segment | Only to buyers in the segment | Only to buyers in the segment |
The last row matters. A badge visible to everyone for a discount only some customers receive generates support calls from precisely the customers you did not target.
Strike-through, or the buyer's price
The single most consequential presentation decision in B2B, and it depends on the buyer:
- A buyer on an open or default price list sees a strike-through: your list price crossed out, the promotion price beside it. The saving is the message.
- A buyer on a contract price list should see their price, without a strike-through against your list price. Their negotiated price is not something to advertise on their screen, where a colleague, a visitor, or a screenshot in a group email can read exactly how much that account gets off.
- Where a promotion genuinely applies on top of a contract price, show both: their price, then the campaign reduction as a separate, named amount.
Never display a "was" price the buyer never paid. In Germany this is also a Preisangaben question, and a reference price you cannot substantiate is a legal risk, not just a credibility one.
The cart
The cart is where promotions become real, and it must be readable line by line.
For each affected line:
- The resolved unit price — the buyer's price.
- The discount, as its own amount, with the promotion named.
- The line total after it.
For the cart:
- Cart-level discounts as their own rows, named.
- Free-goods lines shown with their quantity and their value, with the reduction stated — never at €0.00.
- The next threshold, where one is close: "€180 more for 5 % off". This single element does more for order value than any badge on a tile.
Order confirmation and invoice
Whatever the cart showed must survive into the documents, in the same shape:
- The confirmation repeats the lines, the discounts and the promotion names.
- The invoice carries the discount per line, because VAT is per line and a partial return has to know what one unit was worth.
- A cart-level discount is distributed across the lines on the invoice, even though it was presented as one row in the cart.
If your reporting shows a discount that the invoice does not, the discount is not real to your accounting and you will find out at month end.
Punchout: where promotions must not appear
A punchout session hands your catalogue into the customer's procurement system — SAP Ariba, Coupa, JAGGAER. The buyer builds a basket in your shop, returns it to their system, and their system raises a purchase order from the prices your catalogue transmitted.
Everything after that is machine-to-machine. Their goods receipt matches the PO; their accounts payable matches your invoice against both. A promotion that applies at your checkout but was never in the transmitted price produces an invoice that does not match the purchase order — and it is blocked automatically, without a human reading it, sometimes for weeks. Your money sits still and somebody eventually phones about a payment run.
The rules:
- Exclude punchout channels from promotion scope. Every promotion, by default.
- Where a punchout customer must get a lower price, put it in their price list, not in a promotion. It is then part of the transmitted catalogue and their purchase order carries it.
- Cart-level and free-goods effects are worst of all here: the OCI and cXML basket formats carry line prices, and a cart-level discount has nowhere to go.
See Punchout explained, Set up punchout and Serve punchout customers.
What to check
- As an anonymous visitor, a logged-in open-list buyer, and a contract customer: the same product page, three correct presentations.
- A cart just below a threshold shows the next-threshold hint.
- The invoice PDF carries every discount the cart showed, per line.
- A punchout session shows no promotional price anywhere, and the basket transmitted back matches what the buyer saw.
Next
- Test a promotion before it goes live — the method behind those checks.
- Edit pages and blocks — the campaign landing page.