A distributor in Jeddah runs three promotions at once in the last month of the quarter: a category discount on ambient beverages, a mix-and-match bundle across the juice and water lines, and an order-level discount that triggers above a cart threshold. A supermarket buyer builds an order that qualifies for all three on overlapping lines. The coordinator taking the order cannot say which of the three apply together and which one excludes the others — the promotions calendar is a document issued at the start of the quarter, and it does not say. The order is placed at one price. Finance invoices it at another. The credit note that follows is not a processing error; it is the absence of a rule for what happens when promotions collide.
Four kinds of promotion, one order line
In B2B distribution, the promotional discount is the fourth layer of the net price calculation — applied after the tier base price, the contract override, and the volume tier break, and before any manual customer override. Net price is the output of that sequence, not a step inside it. Within the promotional layer, four rule types commonly run at the same time.
A time-bound promotion reduces the rate on a SKU or a whole category for a fixed window, between an effective-from date and an expiry. A mix-and-match bundle discounts a defined combination — ten cases of juice and five of water — and applies nothing if the combination in the cart is incomplete. An order-level discount reduces the whole order once the cart passes a configured value or case-volume threshold. A line-item promotion is scoped narrowly, to one SKU, category, or brand. On a twelve-line order from an account enrolled in a seasonal programme, three or four of these can touch the same line at once.
Each rule also carries a status — Active, Scheduled, Expired, or Disabled — and a Scheduled rule goes live at its effective-from moment, not at the moment it was saved. That much a coordinator can follow on a calendar. What the calendar cannot express is what happens when two Active rules both apply to the same line, at the same time, for the same buyer.
The flag that decides whether discounts add up
Every promotional rule carries one attribute that determines the outcome of an overlap: whether it is stackable. A stackable rule accumulates with others — a category promotion and an order-level discount both marked stackable apply in sequence, each reducing the rate the previous one produced. A non-stackable rule does not combine. When two non-stackable rules both qualify for the same line, one of them has to be excluded.
The mechanism that decides which one is the part distributors most often get wrong when they reason it out by hand. The intuitive answer — give the buyer the lower price — is not the rule, and an operation built around it quietly hands pricing control to whoever assembles the largest qualifying cart. Competing non-stackable promotions resolve by highest configured priority. The commercial team assigns each rule a priority when it is created; when two collide, the higher-priority rule applies, the other is excluded, and the outcome is recorded. The discount that wins is the one the commercial team designated as dominant, not the deepest discount the cart can reach.
The rule is not "whichever discount is largest." It is "whichever rule the commercial team ranked higher" — decided once, at configuration, and applied the same way every time.
Three outcomes when promotions overlap
Conflict detection across promotional rules is not itself a pricing layer. It is a check that runs across the whole calculation before an order is allowed to proceed, and it produces one of three outcomes. The distinction between them is operational, not cosmetic.
The first is Precedence. A documented rule — priority order, date range, explicit configuration — decides the collision without anyone being asked. The order proceeds. The decision is logged so it can be reviewed later, but no one is interrupted while it happens.
The second is Warning. The system resolves the overlap and lets the order proceed, but flags it for a human to look at afterward. This is the outcome for a resolution that is defensible but unusual enough that a commercial manager should know it occurred.
The third is Conflict. The system cannot choose — two rules of equal priority both claim the same line, or two scheduled changes to the same rule have overlapping effective windows. The order, or the rule change, is blocked, and a person has to decide. Nothing in this state reaches the warehouse, so no invoice is ever generated from an unresolved pricing conflict. Only one of the three outcomes stops work: Precedence and Warning keep orders moving while preserving a record, and Conflict reserves human attention for the cases that genuinely need it.
A Jeddah beverage distributor, quarter-end
A beverage and ambient-goods distributor in Jeddah supplies around 90 supermarket and grocery accounts. In the final month of the third quarter it runs three overlapping promotional rules. The first is a time-bound category promotion on all juice SKUs, marked non-stackable, priority 10. The second is a mix-and-match bundle — ten cases of juice with five of bottled water discounts the qualifying lines — marked non-stackable, priority 20. The third is an order-level discount on any order above a set case volume, marked stackable.
A buyer for a mid-size grocery chain builds an order: fourteen cases of juice, six of water, comfortably over the volume threshold. All three rules qualify. Resolved by hand at the ordering call, the outcome depends on which document the coordinator checks and in what order. Resolved by a pricing engine at the cart, it is deterministic. The bundle at priority 20 outranks the category promotion at priority 10, so the bundle discount applies to the juice-and-water lines and the category promotion is excluded and logged. The order-level discount is stackable, so it applies on top, to the order total. The buyer sees the resulting net price in the cart before confirming, and the order confirmation records it. When the invoice is raised, the rate is the rate the buyer saw — no promotional rule is re-evaluated between checkout and invoice.
Had the buyer saved the order as a draft and returned to it after the category promotion expired, the cart would re-resolve on open and show the change in an amber flag before checkout, naming the cause, rather than surfacing it on the invoice a week later. A saved draft holds SKU and quantity only; the price resolves fresh against the rules in effect when the draft is reopened.
Six concurrent promotions with priorities and stackable flags produce one deterministic net price for a given cart. The same six, applied from a calendar by a coordinator under time pressure on a call, produce a different price depending on who takes the order.
Where promotion conflicts should be resolved
A promotions calendar distributed at the start of the quarter is a statement of intent. It cannot enforce a priority order, cannot mark a rule non-stackable, and cannot tell a coordinator mid-call that the bundle the buyer just qualified for excludes the category discount they were quoted last week. Every overlap it does not resolve becomes a decision made under time pressure on an ordering call, and then re-made — differently — by whoever processes the invoice.
Moving the resolution to the cart changes what the calendar has to do. The commercial team still designs the promotions: the rates, the windows, the stackable flags, the priorities. But the arithmetic of a specific order against every active rule runs once, deterministically, at submission — in the Emdaad pricing engine, as part of the same calculation that resolves tier, contract, and volume. The buyer places the order against their own catalogue at their own resolved prices. Conflict detection blocks anything genuinely ambiguous before it becomes an order. The OMS receives a priced order with its promotional logic already settled and logged.
The distributors who stop losing time to post-invoice discount disputes are not the ones who write a more detailed promotions calendar. They are the ones who stopped asking a coordinator to apply it from memory.