Measure and troubleshoot

Common promotion problems

Not applying, applying twice, applying to the wrong customer.

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

SymptomLikely causeDo this
Promotion never applies for anyoneStatus inactive, or outside its validity windowCheck status and the Valid from time, not just the date
Applies for you but not for a customerPrice-list scope excludes their list, or a segment condition does not match themCheck which list the buyer resolves on — Check which price a buyer sees
Applies to some lines onlyThe product condition matches fewer articles than you assumed — a category that does not contain what you expectOpen the condition and list the matching SKUs before blaming the engine
Threshold never reachedThe threshold counts net and the buyer sees gross, or it counts only matching lines and not the cartConfirm which basis the condition uses — Currencies and tax
Discount is bigger than intendedTwo promotions stacked, or a compound discount baseCheck the cart's discount rows; each names its promotion
Discount is smaller than intendedThe maximum discount amount clamped it, or the floor didBoth are logged on the order
Contract customers received itPrice-list scope left at all listsFix the scope, then read Knowing what a promotion cost you
Punchout customer's invoice was rejectedA promotion applied at checkout that the transmitted catalogue did not containExclude punchout channels; move the price into their price list
Coupon says invalidExpired, limit reached, or bound to a different organizationThe redemption log on the coupon says which
Free unit shows €0.00 on the invoiceThe free-goods effect is configured to zero the line rather than discount itFix it before the next order — Free goods and gifts
Cart shows the discount, invoice does notThe effect is applied at cart level and was never distributed across linesSet a distribution method
Redemption counter higher than the order countCounting per line rather than per orderRead 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.
Do not fix stacking by lowering the percentages. It hides the problem while leaving the combination unbounded — the next promotion someone adds re-opens it. Fix the rules about how promotions combine, not the numbers inside them.

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:

  1. 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.
  2. Which segment are they in? Segment membership is computed from rules and can include accounts nobody expected — Segments.
  3. Which channel did they arrive through? A promotion left open to all channels reaches punchout, marketplaces and any other storefront.
  4. 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