Common promotion problems
Nearly every promotion problem is one of four things: a condition that does not match what you think it matches, a scope you did not set, stacking you did not test, or a clock in the wrong time zone.
Symptom to cause
| Symptom | Likely cause | Do this |
|---|---|---|
| Promotion never applies for anyone | Status inactive, or outside its validity window | Check status and the Valid from time, not just the date |
| Applies for you but not for a customer | Price-list scope excludes their list, or a segment condition does not match them | Check which list the buyer resolves on — Check which price a buyer sees |
| Applies to some lines only | The product condition matches fewer articles than you assumed — a category that does not contain what you expect | Open the condition and list the matching SKUs before blaming the engine |
| Threshold never reached | The threshold counts net and the buyer sees gross, or it counts only matching lines and not the cart | Confirm which basis the condition uses — Currencies and tax |
| Discount is bigger than intended | Two promotions stacked, or a compound discount base | Check the cart's discount rows; each names its promotion |
| Discount is smaller than intended | The maximum discount amount clamped it, or the floor did | Both are logged on the order |
| Contract customers received it | Price-list scope left at all lists | Fix the scope, then read Knowing what a promotion cost you |
| Punchout customer's invoice was rejected | A promotion applied at checkout that the transmitted catalogue did not contain | Exclude punchout channels; move the price into their price list |
| Coupon says invalid | Expired, limit reached, or bound to a different organization | The redemption log on the coupon says which |
| Free unit shows €0.00 on the invoice | The free-goods effect is configured to zero the line rather than discount it | Fix it before the next order — Free goods and gifts |
| Cart shows the discount, invoice does not | The effect is applied at cart level and was never distributed across lines | Set a distribution method |
| Redemption counter higher than the order count | Counting per line rather than per order | Read the counter's basis before reporting on it |
Stacking surprises
The commonest expensive failure, and it never looks like one setting.
Reproduce it: build the cart that produced the surprise as a test buyer, and read the discount rows in order. Each names its promotion. The rows appear in the order the engine applied them — priority first — so the row that acted on the undiscounted price is at the top.
Then decide which of three things you actually wanted:
- Only one of them should ever apply. Set the larger one to exclusive.
- Both, but additively. Confirm the discount base is the resolved price, not the price after the previous promotion.
- Both, but capped. Set a maximum total discount per line, and let the floor clamp the rest.
Time-zone boundaries
A promotion's validity is a timestamp; the interface shows a date.
Valid until 30.04.means 23:59:59 on 30 April in the tenant's time zone. For a German tenant in summer, that is 21:59:59 UTC.- A campaign entered as a bare date frequently starts at 00:00 on the day after the marketing team expected, or ends at 00:00 on the last day — which cuts a full day off the campaign.
- Buyers in other markets read the dates in their own local time. A campaign that ends at midnight in Frankfurt ended at 15:00 in Chicago.
If a promotion appeared or disappeared at a time nobody expected, read the stored timestamp rather than the rendered date. The same applies to price list validity and quote expiry — see Common quote problems.
Expired codes still circulating
Codes outlive campaigns by months. Printed on a trade-fair flyer, forwarded in a buying group, saved in a purchasing department's notes.
- Keep expired coupons rather than deleting them. A deleted code returns "unknown", and the buyer assumes your shop is broken.
- Make the message say expired, with the date. A buyer who reads "expired on 30 April" stops. One who reads "invalid" phones.
- Watch redemption attempts on expired codes. Repeated attempts on one code months later means it is printed somewhere you have forgotten about.
The promotion that reached the wrong customer
Work it in this order:
- Which price list did the buyer resolve on? If it is a contract list, the promotion's price-list scope is the cause. Nothing else needs checking.
- Which segment are they in? Segment membership is computed from rules and can include accounts nobody expected — Segments.
- Which channel did they arrive through? A promotion left open to all channels reaches punchout, marketplaces and any other storefront.
- Was it a code? A shared code has almost certainly been passed on. Convert it to per-customer or assigned — Coupons and codes.
When you cannot reproduce it
The buyer says they saw a discount; you cannot make it appear. Three usual causes:
- They were in a different market or currency, and the promotion's scope differs there.
- The cart still holds a redeemed code from before an expiry. Carts are evaluated at checkout, so an old cart can show an old state until it is repriced.
- It was a quote, not a cart. A sent quote holds frozen prices and does not re-evaluate promotions at all — see The quote lifecycle.
Next
- Test a promotion before it goes live — the discipline that prevents most of this page.
- Knowing what a promotion cost you — the numbers behind the symptoms.