How promotions work
A promotion is a rule: when this is true about the cart, do this to the price. This article covers both halves. It also covers the more important question of where the rule runs, because a promotion never replaces the buyer's price. It runs after it.
Pricing answers "how much". Promotions answer "and then what"
Everything in How pricing works resolves one number per line: the unit price for this buyer, in this currency, at this quantity, today. Currency, then validity, then market, then authentication, then specificity (contact before organization before channel before open before default), then priority, then the quantity rung.
That chain finishes with an answer. Müller Industriebedarf gets €16.20 for
4711-A, because a price list bound to their organization says so.
A promotion starts there. It takes the resolved price as its input and applies an effect to it. Two consequences follow, and they are the two things people most often get wrong:
- A promotion is not a price list. It cannot be "more specific" than a contract price, because it is not competing with one. It runs afterwards.
- A promotion applied to a contract price discounts an already-discounted number. That is the margin leak, and it has its own article, Promotions vs. contract prices.
The rule: conditions × effects
Conditions
A condition is a test against the cart and the buyer. All conditions on a promotion must hold, or any of them if the promotion is set to match that way.
| Family | Examples | Typical use |
|---|---|---|
| Cart | Net value ≥ €2,500 · total quantity ≥ 500 · at least 4 distinct articles | Volume and basket incentives |
| Customer | Organization · segment · contact role · the price list the buyer resolves on | Targeting, and excluding contract customers |
| Product | SKU · category · family · brand · an attribute value such as thread_size = G1/2 | Assortment and clearance actions |
| Time | Validity window · weekday · time of day | Campaign periods |
| Scope | Market · channel · storefront | Keeping a promotion off punchout |
| Code | A coupon code is present in the cart | Rep coupons, targeted mailings |
Conditions on the customer side test the same objects pricing uses: the organization, the contact and the segment. Those objects exist today. See Segments; a promotion aimed at "customers who have not ordered from the fastener range in six months" is a segment plus a condition rather than a promotion feature.
Effects
An effect is what happens when the conditions hold.
| Effect | Does | Watch out for |
|---|---|---|
| Percentage off line | −5 % on matching lines | Compounds badly on contract prices |
| Fixed amount off line | −€2.00 per piece | Becomes a large percentage on a cheap article |
| Fixed amount off cart | −€100 on the order | Must be distributed across lines for the invoice and for returns |
| Set price | This article is €4.80 in this campaign | Behaves like a price list and is usually the wrong tool. Use a time-limited price, which exists today |
| Free goods | 12 + 1 | The free unit is not free on the invoice. See Free goods and gifts |
| Tiered effect | −3 % from 100, −5 % from 250, −8 % from 500 | Overlaps with scale pricing; decide which owns the volume logic |
| Free shipping | Waives the shipping calculation above a threshold | Check it against quoted freight. See Shipping |
Order of operations
The planned engine evaluates every cart in this order:
- Resolve prices. One unit price per line, through the pricing chain. Nothing promotional happens here.
- Collect eligible promotions. Active, inside their validity window, matching the market, the channel and the buyer, and, where a code is required, the code is present.
- Sort by priority. Higher priority first. This is your control over which promotion gets to act on the undiscounted price.
- Evaluate in order. For each promotion: test its conditions, apply its effect, record the discount on the affected lines.
- Stop where told to. An exclusive promotion, or one flagged stop processing, ends the loop.
- Apply the floor. Any line whose total discount breaches the configured floor is clamped, and the event is logged.
- Total. Lines, discounts, freight, tax.
Step 6 is the guard rail. It is what stands between a badly scoped rule and selling below cost at three in the morning.
Stacking, exclusivity and priority
Three settings on each promotion, and they interact:
- Priority, an integer. Higher runs first. Equal priorities are ordered by code, so the result is at least reproducible.
- Exclusive: when this promotion applies, no other promotion may. Use it for anything large.
- Stackable with: an explicit list of other promotions this one may combine with. Start with an empty list and add the combinations you have tested.
And one that decides the arithmetic:
- Discount base: does a percentage effect apply to the resolved price (additive) or to the price after previous promotions (compound)?
Additive is the safer default and the easier one to explain: two 5 % promotions take 10 % off, where compound would take 9.75 %. Compound looks generous and is harder to reason about when three rules meet. Whichever you choose, choose it once, tenant-wide, and do not let individual promotions override it.
Why B2B promotions are about volume and assortment
The B2C promotion mechanic is urgency: a countdown, a limited quantity, a flash sale. It works because the buyer is spending their own money and can decide now.
Your buyer is not doing that. They are ordering against a requirement, often against an approval, sometimes against a budget that resets in December. Urgency does not move them, and it damages your credibility with a professional who recognises the tactic. What does move them is arithmetic they can defend internally: order the full pallet and the unit price drops, take the machine with the consumable kit and the total is lower, try the range next door at a first-order price.
That is the difference this whole area turns on, and it is set out with examples in Promotion types that work in B2B.
How this will work in the Revenue Cloud
The Promotions app is planned and not yet on your tenant. The planned grid lists each promotion with its code, effect, priority, exclusivity flag, validity window, channels and redemption count: the same fields the engine reads, so the grid is your rule set. A promotion's detail is meant to hold the condition builder, the effect, the scope and the redemption log, with coupons as their own objects hanging off the promotion.
What you can use today is the substrate the engine will resolve against.
Price lists under
Order Management › Price lists carry a currency, a priority, a binding to a
contact, an organization or a channel, and a Valid from / Valid until
window; a campaign price for everyone, for six weeks, is a
time-limited price and needs no
promotion engine. Segments under
CRM › Segments define the audiences a condition will test.
Channels under
Configuration › Channels define where a promotion will and will not run, and
the punchout channel type already exists there.
Next
- Promotions vs. contract prices — the margin leak, in detail.
- Create a promotion — building one.