News 15.07.2026 cart, order

Conditional Order Validation for PrestaShop: 58 Real Rules with Builder UI and JSON

Enterprise class checkout validation for PrestaShop: 58 real condition examples with Field · Operator · Value panels and the exact policy JSON. Nest unlimited AND/OR rules — MOQ, geo, carrier, payment, customer and time — without artificial limits.

Conditional Order Validation for PrestaShop: 52 Real Condition Examples with Builder UI and JSON

Conditional Order Validation is enterprise class software for checkout governance. You design policies in a visual condition builder, nest AND/OR groups without artificial depth limits, attach multilingual Reasons, choose block or warn, then measure everything on the analytics dashboard and defend every decision in the full audit log.

This article is a field guide: 52 practical validation scenarios built only from real condition fields available in the module. Every scenario is a real multi-condition tree (AND/OR, often with nested groups) taken from everyday shop operations — not a single-field demo. You get the dark condition-tree card plus the compact conditions JSON exactly as JSON.stringify stores it in the module’s Edit as JSON panel.

There is no “only three simple rules” ceiling. Enterprise class software means unlimited possibilities when you compose nested groups, priorities and stop-on-first-match policies into a validation system as complex as your business.

Why This Is Enterprise Class

Unlimited nested AND/OR

Groups inside groups, per-sibling joins, drag-and-drop reorder. Build the rule your operations team describes in a sentence — not the rule a plugin template allows.

JSON you can audit

Every policy persists a condition tree. Edit visually or open Edit as JSON. Import, export, duplicate, simulate — the same structure end to end.

Dashboard + audit log

KPI cards, Chart.js trends, evaluation snapshots. Enterprise class means you can explain why checkout was blocked at 14:37 yesterday.

How to read each example: the dark terminal card shows the nested condition tree (cyan fields, operators, amber/emerald values, purple Group / indigo Nested badges). Entity picks are shown as Name #ID (e.g. Poland #14, Furniture #18) — the compact JSON below still stores raw IDs exactly as the module’s JSON.stringify does. Swap sample IDs for your SearchTool picks.

Reminder: a policy matches when its condition tree evaluates to true — then the policy action (block or warn) runs. MOQ fields (*_qty_min, *_qty_max, *_qty_multiple) are special: they match when the constraint is violated. Combine policies with priority and stop-on-first for layered enterprise workflows without limits on how sophisticated you go.

52 Real-World Validation Examples

#1 Guest checkout under minimum order

Block checkout

Most shops waive a strict minimum for logged-in wholesalers but still enforce it for guests: guest AND cart total below the floor.

Policy · Guest checkout under minimum order · condition tree
Group · AND
Guest customer = Yes
AND
Cart total (tax incl.) < 50 EUR
Fields used: Cart value Customer
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"guest","operator":"eq","value":"1"},{"type":"condition","field":"cart_total","operator":"lt","value":"50","join":"AND"}]}

#2 High-value cart from unknown customer

Warn customer

Fraud desk pattern: cart over 2000 EUR AND (guest OR fewer than 1 completed order). Soft-warn so support can call back.

Policy · High-value cart from unknown customer · condition tree
Group · AND
Cart total (tax incl.) > 2000 EUR
AND
Nested · OR
Guest customer = Yes
OR
Customer completed orders < 1
Fields used: Cart value Customer
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"cart_total","operator":"gt","value":"2000"},{"type":"group","operator":"AND","children":[{"type":"condition","field":"guest","operator":"eq","value":"1"},{"type":"condition","field":"customer_orders","operator":"lt","value":"1","join":"OR"}],"join":"AND"}]}

#3 Cash on delivery above limit

Block checkout

Carriers refuse COD on expensive parcels: payment module is COD AND products total is over 300 EUR.

Policy · Cash on delivery above limit · condition tree
Group · AND
Payment module = Cash on delivery #ps_cashondelivery
AND
Products total > 300 EUR
Fields used: Cart value Payment
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"payment_module","operator":"eq","value":"ps_cashondelivery"},{"type":"condition","field":"cart_total_products","operator":"gt","value":"300","join":"AND"}]}

#4 Parcel locker too heavy

Block checkout

Everyday logistics: selected carrier is locker AND cart weight exceeds 25 kg — customer must switch to courier.

Policy · Parcel locker too heavy · condition tree
Group · AND
Selected carrier in Parcel locker #12
AND
Cart weight (kg) > 25 kg
Fields used: Carrier Weight
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"carrier","operator":"in","value":"12"},{"type":"condition","field":"cart_weight","operator":"gt","value":"25","join":"AND"}]}

#5 Same-day delivery cut-off

Block checkout

After 14:00, same-day postcodes are closed: hour >= 14 AND delivery postcode matches the city regex.

Policy · Same-day delivery cut-off · condition tree
Group · AND
Hour of day (0–23) 14
AND
Delivery postcode regex ^(00|01|02|03|04)-
Fields used: Postcode Schedule
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"hour","operator":"gte","value":"14"},{"type":"condition","field":"postcode","operator":"regex","value":"^(00|01|02|03|04)-","join":"AND"}]}

#6 No heavy freight on weekends

Block checkout

Warehouse closed Sat/Sun for pallet work: day is Saturday or Sunday AND weight over 30 kg AND cart requires shipping.

Policy · No heavy freight on weekends · condition tree
Group · AND
Day of week (1–7) in Saturday #6, Sunday #7
AND
Cart weight (kg) > 30 kg
AND
Cart requires shipping = Yes
Fields used: Schedule Shipping Weight
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"day_of_week","operator":"in","value":"6,7"},{"type":"condition","field":"cart_weight","operator":"gt","value":"30","join":"AND"},{"type":"condition","field":"requires_shipping","operator":"eq","value":"1","join":"AND"}]}

#7 Split digital and physical orders

Block checkout

Licensing + warehouse conflict: at least one virtual product AND at least one physical product in the same cart.

Policy · Split digital and physical orders · condition tree
Group · AND
Has at least one virtual product = Yes
AND
Has physical product = Yes
Fields used: Physical Virtual
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"has_virtual_product","operator":"eq","value":"1"},{"type":"condition","field":"has_physical_product","operator":"eq","value":"1","join":"AND"}]}

#8 Personalized product missing engraving

Block checkout

Category Personalization is in the cart AND customization flag is No — stop until the customer fills the form.

Policy · Personalized product missing engraving · condition tree
Group · AND
Category in cart in Personalization #42
AND
Has customized product = No
Fields used: Category Customization
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category","operator":"in","value":"42"},{"type":"condition","field":"has_customization","operator":"eq","value":"0","join":"AND"}]}

#9 Incompatible products in one cart

Block checkout

Warranty conflict: product 12 AND product 34 both present — force two separate orders.

Policy · Incompatible products in one cart · condition tree
Group · AND
Product in cart in Starter pack #12
AND
Product in cart in Warranty extension #34
Fields used: Product
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"product","operator":"in","value":"12"},{"type":"condition","field":"product","operator":"in","value":"34","join":"AND"}]}

#10 Hazardous goods with foodstuffs

Block checkout

Compliance: category Chemicals AND category Food in the same basket — shipping law forbids mixing.

Policy · Hazardous goods with foodstuffs · condition tree
Group · AND
Category in cart in Chemicals #8
AND
Category in cart in Foodstuffs #5
Fields used: Category
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category","operator":"in","value":"8"},{"type":"condition","field":"category","operator":"in","value":"5","join":"AND"}]}

#11 Wholesale brand sold to retail visitors

Block checkout

Manufacturer 7 is B2B-only: brand in cart AND customer is not in wholesale groups 3 or 4.

Policy · Wholesale brand sold to retail visitors · condition tree
Group · AND
Manufacturer in cart in WholesaleOnly Co. #7
AND
Customer group not in Wholesale #3, Retailer #4
Fields used: Customer group Manufacturer
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"manufacturer","operator":"in","value":"7"},{"type":"condition","field":"group","operator":"not_in","value":"3,4","join":"AND"}]}

#12 Dropship supplier requires a logged-in buyer

Block checkout

Supplier 3 ships made-to-order: supplier in cart AND guest checkout — ask them to create an account first.

Policy · Dropship supplier requires a logged-in … · condition tree
Group · AND
Supplier in cart in Dropship Made-to-Order #3
AND
Guest customer = Yes
Fields used: Customer Supplier
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"supplier","operator":"in","value":"3"},{"type":"condition","field":"guest","operator":"eq","value":"1","join":"AND"}]}

#13 Too many vouchers on a discounted cart

Block checkout

Margin guard: cart already has a voucher AND more than 2 cart rules are stacked.

Policy · Too many vouchers on a discounted cart · condition tree
Group · AND
Cart has voucher applied = Yes
AND
Number of cart rules > 2
Fields used: Cart rules Voucher
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"has_discount","operator":"eq","value":"1"},{"type":"condition","field":"cart_rules_count","operator":"gt","value":"2","join":"AND"}]}

#14 Freight required but shipping is zero

Warn customer

Misconfigured carrier symptom: cart requires shipping AND shipping cost equals 0 — warn ops before the order is paid.

Policy · Freight required but shipping is zero · condition tree
Group · AND
Cart requires shipping = Yes
AND
Shipping cost = 0 EUR
Fields used: Shipping
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"requires_shipping","operator":"eq","value":"1"},{"type":"condition","field":"cart_shipping","operator":"eq","value":"0","join":"AND"}]}

#15 Too many SKUs for guest checkout

Block checkout

Packing station limit: unique products over 15 AND customer is guest (logged customers may be B2B with dedicated pickers).

Policy · Too many SKUs for guest checkout · condition tree
Group · AND
Unique products in cart > 15
AND
Guest customer = Yes
Fields used: Customer Quantity
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"unique_product_count","operator":"gt","value":"15"},{"type":"condition","field":"guest","operator":"eq","value":"1","join":"AND"}]}

#16 Wholesale pack under minimum pieces

Block checkout

Sample/wholesale kit: customer group is wholesale AND total product quantity is still under 6.

Policy · Wholesale pack under minimum pieces · condition tree
Group · AND
Customer group in Wholesale #3
AND
Total product quantity < 6
Fields used: Customer group Quantity
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"group","operator":"in","value":"3"},{"type":"condition","field":"product_count","operator":"lt","value":"6","join":"AND"}]}

#17 Starter SKU below minimum on first order

Block checkout

Product 12 MOQ violated AND this is the customer's first order — common when newcomers ignore pack size on the product page.

Policy · Starter SKU below minimum on first order · condition tree
Group · AND
Product minimum quantity min Starter pack #12 · min 2
AND
Customer first order = Yes
Fields used: Customer MOQ
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"product_qty_min","operator":"eq","value":"12:2"},{"type":"condition","field":"customer.is_first_order","operator":"eq","value":"1","join":"AND"}]}

#18 Limited drop over per-order cap

Block checkout

Launch allocation: product 55 quantity exceeds max 5 AND category Limited Drops is in the cart.

Policy · Limited drop over per-order cap · condition tree
Group · AND
Product maximum quantity max Limited drop tee #55 · max 5
AND
Category in cart in Limited drops #15
Fields used: Category MOQ
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"product_qty_max","operator":"eq","value":"55:5"},{"type":"condition","field":"category","operator":"in","value":"15","join":"AND"}]}

#19 Promo category under buy-in quantity

Block checkout

Category 9 must reach 6 units for the deal to be valid — MOQ violated AND a voucher is applied (block empty promo abuse).

Policy · Promo category under buy-in quantity · condition tree
Group · AND
Category minimum quantity min Promo multipack #9 · min 6
AND
Cart has voucher applied = Yes
Fields used: MOQ Voucher
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category_qty_min","operator":"eq","value":"9:6"},{"type":"condition","field":"has_discount","operator":"eq","value":"1","join":"AND"}]}

#20 Flash-sale category over allocation

Block checkout

Category 15 qty over 3 per order AND payment is not bank wire (card/COD buyers often scalp launches).

Policy · Flash-sale category over allocation · condition tree
Group · AND
Category maximum quantity max Limited drops #15 · max 3
AND
Payment module Bank wire #ps_wirepayment
Fields used: MOQ Payment
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category_qty_max","operator":"eq","value":"15:3"},{"type":"condition","field":"payment_module","operator":"neq","value":"ps_wirepayment","join":"AND"}]}

#21 Pack size wrong for export order

Block checkout

SKU 88 must be ordered in multiples of 4 AND delivery country is outside the domestic ID — export cartons only.

Policy · Pack size wrong for export order · condition tree
Group · AND
Product qty must be multiple of multiple of Export carton SKU #88 · multiple of 4
AND
Delivery country not in Poland #14
Fields used: Country Pack size
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"product_qty_multiple","operator":"eq","value":"88:4"},{"type":"condition","field":"country","operator":"not_in","value":"14","join":"AND"}]}

#22 Shelf-ready packs not aligned

Block checkout

Category 5 qty not a multiple of 6 AND customer group is retailer — stores only accept full facings.

Policy · Shelf-ready packs not aligned · condition tree
Group · AND
Category qty must be multiple of multiple of Foodstuffs #5 · multiple of 6
AND
Customer group in Retailer #4
Fields used: Customer group Pack size
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category_qty_multiple","operator":"eq","value":"5:6"},{"type":"condition","field":"group","operator":"in","value":"4","join":"AND"}]}

#23 Brand case pack incomplete

Block checkout

Manufacturer 4 qty not multiple of 6 AND lifetime spend is still under wholesale threshold — nudge them to fill the case.

Policy · Brand case pack incomplete · condition tree
Group · AND
Manufacturer qty must be multiple of multiple of CaseBrand #4 · multiple of 6
AND
Customer lifetime spent < 500 EUR
Fields used: LTV Pack size
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"manufacturer_qty_multiple","operator":"eq","value":"4:6"},{"type":"condition","field":"customer_spent","operator":"lt","value":"500","join":"AND"}]}

#24 Supplier carton step in remote zone

Block checkout

Supplier 2 must be ordered in steps of 10 AND delivery zone is remote — partial cartons are not economical to ship.

Policy · Supplier carton step in remote zone · condition tree
Group · AND
Supplier qty must be multiple of multiple of Carton Logistics #2 · multiple of 10
AND
Delivery zone in Remote / islands #4
Fields used: Pack size Zone
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"supplier_qty_multiple","operator":"eq","value":"2:10"},{"type":"condition","field":"zone","operator":"in","value":"4","join":"AND"}]}

#25 Custom paint below workshop minimum

Block checkout

Product 21 line total under 99 EUR AND category Custom Paint is present — workshop will not schedule the job.

Policy · Custom paint below workshop minimum · condition tree
Group · AND
Product line total < Custom paint kit #21 · 99 EUR
AND
Category in cart in Custom paint #21
Fields used: Category Line total
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"product_line_total","operator":"lt","value":"21:99"},{"type":"condition","field":"category","operator":"in","value":"21","join":"AND"}]}

#26 Wrong currency on domestic shop

Block checkout

Shop #1 only: currency is USD (id 2) AND delivery country is domestic — force EUR checkout.

Policy · Wrong currency on domestic shop · condition tree
Group · AND
Shop ID = Main shop #1
AND
Currency in USD #2
AND
Delivery country in Poland #14
Fields used: Country Currency Shop
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"shop.id","operator":"eq","value":"1"},{"type":"condition","field":"currency","operator":"in","value":"2","join":"AND"},{"type":"condition","field":"country","operator":"in","value":"14","join":"AND"}]}

#27 Embargo country with physical goods

Block checkout

Delivery country is embargoed AND cart has a physical product (digital downloads may still be allowed via another policy).

Policy · Embargo country with physical goods · condition tree
Group · AND
Delivery country in Embargoed country #69
AND
Has physical product = Yes
Fields used: Country Physical
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"country","operator":"in","value":"69"},{"type":"condition","field":"has_physical_product","operator":"eq","value":"1","join":"AND"}]}

#28 Non-EU invoice on EU-priced cart

Warn customer

Invoice country outside the EU sample set AND products total (tax excl.) over 150 — tax team must review.

Policy · Non-EU invoice on EU-priced cart · condition tree
Group · AND
Invoice country not in France #8, Poland #14, Germany #15
AND
Products total (tax excl.) > 150 EUR
Fields used: Cart value Invoice
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"invoice_country","operator":"not_in","value":"8,14,15"},{"type":"condition","field":"cart.total_products_tax_excl","operator":"gt","value":"150","join":"AND"}]}

#29 COD to remote delivery zone

Block checkout

Zone 4 AND cash on delivery — high return risk; require prepayment.

Policy · COD to remote delivery zone · condition tree
Group · AND
Delivery zone in Remote / islands #4
AND
Payment module = Cash on delivery #ps_cashondelivery
Fields used: Payment Zone
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"zone","operator":"in","value":"4"},{"type":"condition","field":"payment_module","operator":"eq","value":"ps_cashondelivery","join":"AND"}]}

#30 State outside 3PL coverage

Block checkout

Delivery state 322 AND weight over 5 kg — regional partner does not cover heavy parcels there.

Policy · State outside 3PL coverage · condition tree
Group · AND
Delivery state / region in Sicily #322
AND
Cart weight (kg) > 5 kg
Fields used: State Weight
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"address.delivery_state","operator":"in","value":"322"},{"type":"condition","field":"cart_weight","operator":"gt","value":"5","join":"AND"}]}

#31 Digital catalog requires login

Block checkout

All lines are virtual AND customer is not logged in — accounts are required for license delivery.

Policy · Digital catalog requires login · condition tree
Group · AND
All products are virtual = Yes
AND
Customer logged in = No
Fields used: Customer Virtual
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"all_virtual","operator":"eq","value":"1"},{"type":"condition","field":"logged","operator":"eq","value":"0","join":"AND"}]}

#32 B2B portal rejects free webmail

Block checkout

Shop #2 B2B storefront: email domain is gmail.com OR customer is guest — only company accounts.

Policy · B2B portal rejects free webmail · condition tree
Group · AND
Shop ID = B2B portal #2
AND
Nested · OR
Customer email domain = gmail.com
OR
Guest customer = Yes
Fields used: Customer Email Shop
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"shop.id","operator":"eq","value":"2"},{"type":"group","operator":"AND","children":[{"type":"condition","field":"customer.email_domain","operator":"eq","value":"gmail.com"},{"type":"condition","field":"guest","operator":"eq","value":"1","join":"OR"}],"join":"AND"}]}

#33 New account buying expensive goods

Block checkout

Account younger than 7 days AND cart over 300 EUR — cooldown against stolen-card testing.

Policy · New account buying expensive goods · condition tree
Group · AND
Customer account age (days) < 7
AND
Cart total (tax incl.) > 300 EUR
Fields used: Cart value Customer
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"customer.account_age_days","operator":"lt","value":"7"},{"type":"condition","field":"cart_total","operator":"gt","value":"300","join":"AND"}]}

#34 First order paid cash on delivery

Warn customer

First order AND COD — soft-warn; many shops switch first orders to prepaid only.

Policy · First order paid cash on delivery · condition tree
Group · AND
Customer first order = Yes
AND
Payment module = Cash on delivery #ps_cashondelivery
Fields used: Customer Payment
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"customer.is_first_order","operator":"eq","value":"1"},{"type":"condition","field":"payment_module","operator":"eq","value":"ps_cashondelivery","join":"AND"}]}

#35 Low LTV customer ordering restricted brand

Block checkout

Manufacturer 7 in cart AND lifetime spend under 500 — brand wants proven buyers only.

Policy · Low LTV customer ordering restricted brand · condition tree
Group · AND
Manufacturer in cart in WholesaleOnly Co. #7
AND
Customer lifetime spent < 500 EUR
Fields used: LTV Manufacturer
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"manufacturer","operator":"in","value":"7"},{"type":"condition","field":"customer_spent","operator":"lt","value":"500","join":"AND"}]}

#36 Christmas Eve freight blackout

Block checkout

Date is 2026-12-24 AND cart requires shipping — only digital can proceed that day.

Policy · Christmas Eve freight blackout · condition tree
Group · AND
Date (YYYY-MM-DD) = 2026-12-24
AND
Cart requires shipping = Yes
Fields used: Schedule Shipping
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"date","operator":"eq","value":"2026-12-24"},{"type":"condition","field":"requires_shipping","operator":"eq","value":"1","join":"AND"}]}

#37 Stocktake freeze window

Block checkout

Date between warehouse stocktake days AND any physical product — pause outbound orders.

Policy · Stocktake freeze window · condition tree
Group · AND
Date (YYYY-MM-DD) between 2026-08-01,2026-08-15
AND
Has physical product = Yes
Fields used: Physical Schedule
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"date","operator":"between","value":"2026-08-01,2026-08-15"},{"type":"condition","field":"has_physical_product","operator":"eq","value":"1","join":"AND"}]}

#38 Brand MOQ not met for retailer group

Block checkout

Manufacturer min qty violated AND customer is in retailer group — case quantity is contractual.

Policy · Brand MOQ not met for retailer group · condition tree
Group · AND
Manufacturer minimum quantity min CaseBrand #4 · min 12
AND
Customer group in Retailer #4
Fields used: Customer group MOQ
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"manufacturer_qty_min","operator":"eq","value":"4:12"},{"type":"condition","field":"group","operator":"in","value":"4","join":"AND"}]}

#39 Supplier allocation exhausted

Block checkout

Supplier max qty exceeded AND country is domestic — export channel has a separate pool.

Policy · Supplier allocation exhausted · condition tree
Group · AND
Supplier maximum quantity max Carton Logistics #2 · max 50
AND
Delivery country in Poland #14
Fields used: Country MOQ
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"supplier_qty_max","operator":"eq","value":"2:50"},{"type":"condition","field":"country","operator":"in","value":"14","join":"AND"}]}

#40 Brand cap with a voucher stacked

Block checkout

Manufacturer max exceeded AND a discount is applied — stop promo-driven overselling of allocated stock.

Policy · Brand cap with a voucher stacked · condition tree
Group · AND
Manufacturer maximum quantity max CaseBrand #4 · max 100
AND
Cart has voucher applied = Yes
Fields used: MOQ Voucher
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"manufacturer_qty_max","operator":"eq","value":"4:100"},{"type":"condition","field":"has_discount","operator":"eq","value":"1","join":"AND"}]}

#41 Supplier carton MOQ missed

Block checkout

Supplier min qty violated AND shipping is required — partial cartons are rejected by the 3PL intake.

Policy · Supplier carton MOQ missed · condition tree
Group · AND
Supplier minimum quantity min Carton Logistics #2 · min 10
AND
Cart requires shipping = Yes
Fields used: MOQ Shipping
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"supplier_qty_min","operator":"eq","value":"2:10"},{"type":"condition","field":"requires_shipping","operator":"eq","value":"1","join":"AND"}]}

#42 B2B category under volume floor

Block checkout

Category qty under 12 AND products total tax excl. under 150 — neither unit nor spend MOQ is met.

Policy · B2B category under volume floor · condition tree
Group · AND
Category quantity (sum) < Foodstuffs #5 · qty 12
AND
Products total (tax excl.) < 150 EUR
Fields used: Cart value Category qty
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category_qty","operator":"lt","value":"5:12"},{"type":"condition","field":"cart.total_products_tax_excl","operator":"lt","value":"150","join":"AND"}]}

#43 Brand volume floor for logged customers

Block checkout

Manufacturer qty under 24 AND customer is logged in (guests never see this brand — separate catalog rule).

Policy · Brand volume floor for logged customers · condition tree
Group · AND
Manufacturer quantity (sum) < CaseBrand #4 · qty 24
AND
Customer logged in = Yes
Fields used: Customer Manufacturer qty
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"manufacturer_qty","operator":"lt","value":"4:24"},{"type":"condition","field":"logged","operator":"eq","value":"1","join":"AND"}]}

#44 Supplier below full carton

Block checkout

Supplier qty under 10 AND carrier is standard pallet service — intake expects full cartons only.

Policy · Supplier below full carton · condition tree
Group · AND
Supplier quantity (sum) < Carton Logistics #2 · qty 10
AND
Selected carrier in Pallet freight #5
Fields used: Carrier Supplier qty
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"supplier_qty","operator":"lt","value":"2:10"},{"type":"condition","field":"carrier","operator":"in","value":"5","join":"AND"}]}

#45 Promo product under required quantity

Block checkout

Product 12 qty under 3 AND a voucher is on the cart — the coupon requires the multi-buy.

Policy · Promo product under required quantity · condition tree
Group · AND
Product quantity < Starter pack #12 · qty 3
AND
Cart has voucher applied = Yes
Fields used: Product qty Voucher
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"product_qty","operator":"lt","value":"12:3"},{"type":"condition","field":"has_discount","operator":"eq","value":"1","join":"AND"}]}

#46 VIP or high spend — never COD

Block checkout

Real finance rule: (VIP group OR (cart >= 500 AND logged-in)) AND payment is cash on delivery. Nested OR inside an AND — classic enterprise tree.

Policy · VIP or high spend — never COD · condition tree
Group · AND
Nested · OR
Customer group in Wholesale #3
OR
Nested · AND
Cart total (tax incl.) 500 EUR
AND
Customer logged in = Yes
AND
Payment module = Cash on delivery #ps_cashondelivery
Fields used: Cart value Customer Customer group Payment
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"group","operator":"AND","children":[{"type":"condition","field":"group","operator":"in","value":"3"},{"type":"group","operator":"AND","children":[{"type":"condition","field":"cart_total","operator":"gte","value":"500"},{"type":"condition","field":"logged","operator":"eq","value":"1","join":"AND"}],"join":"OR"}]},{"type":"condition","field":"payment_module","operator":"eq","value":"ps_cashondelivery","join":"AND"}]}

#47 Oversized furniture on the wrong carrier

Block checkout

Furniture/oversized category AND weight over 30 kg AND carrier is locker — must use furniture courier instead.

Policy · Oversized furniture on the wrong carrier · condition tree
Group · AND
Category in cart in Furniture #18, Oversized #19
AND
Cart weight (kg) > 30 kg
AND
Selected carrier in Parcel locker #12
Fields used: Carrier Category Weight
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"category","operator":"in","value":"18,19"},{"type":"condition","field":"cart_weight","operator":"gt","value":"30","join":"AND"},{"type":"condition","field":"carrier","operator":"in","value":"12","join":"AND"}]}

#48 Guest buying downloads from remote postcode

Warn customer

Guest AND virtual product present AND postcode starts with 9 — often a fraud pattern on gift-card style SKUs; warn before payment.

Policy · Guest buying downloads from remote post… · condition tree
Group · AND
Guest customer = Yes
AND
Has at least one virtual product = Yes
AND
Delivery postcode regex ^9
Fields used: Customer Postcode Virtual
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"guest","operator":"eq","value":"1"},{"type":"condition","field":"has_virtual_product","operator":"eq","value":"1","join":"AND"},{"type":"condition","field":"postcode","operator":"regex","value":"^9","join":"AND"}]}

#49 Overnight cart with too many lines

Block checkout

Hour >= 22 AND unique products over 10 AND shipping required — night shift cannot pick complex orders.

Policy · Overnight cart with too many lines · condition tree
Group · AND
Hour of day (0–23) 22
AND
Unique products in cart > 10
AND
Cart requires shipping = Yes
Fields used: Quantity Schedule Shipping
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"hour","operator":"gte","value":"22"},{"type":"condition","field":"unique_product_count","operator":"gt","value":"10","join":"AND"},{"type":"condition","field":"requires_shipping","operator":"eq","value":"1","join":"AND"}]}

#50 Non-corporate email without LTV exception

Block checkout

Email domain is not company.com AND lifetime spend under 1000 — B2B portal allows consumer domains only after proven spend.

Policy · Non-corporate email without LTV exception · condition tree
Group · AND
Customer email domain company.com
AND
Customer lifetime spent < 1000 EUR
Fields used: Email LTV
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"customer.email_domain","operator":"neq","value":"company.com"},{"type":"condition","field":"customer_spent","operator":"lt","value":"1000","join":"AND"}]}

#51 Heavy export on locker carrier

Block checkout

Export country AND weight over 20 kg AND locker carrier — impossible service combination shops hit every week.

Policy · Heavy export on locker carrier · condition tree
Group · AND
Delivery country in France #8
AND
Cart weight (kg) > 20 kg
AND
Selected carrier in Parcel locker #12
Fields used: Carrier Country Weight
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"country","operator":"in","value":"8"},{"type":"condition","field":"cart_weight","operator":"gt","value":"20","join":"AND"},{"type":"condition","field":"carrier","operator":"in","value":"12","join":"AND"}]}

#52 Wholesale MOQ: units or net spend

Block checkout

Wholesale group AND (product count under 12 OR net products total under 200) — either units or spend must clear the contract.

Policy · Wholesale MOQ: units or net spend · condition tree
Group · AND
Customer group in Wholesale #3
AND
Nested · OR
Total product quantity < 12
OR
Products total (tax excl.) < 200 EUR
Fields used: Cart value Customer group Quantity
JSON
JSON.stringify — same as Edit as JSON in the module
{"type":"group","operator":"AND","children":[{"type":"condition","field":"group","operator":"in","value":"3"},{"type":"group","operator":"AND","children":[{"type":"condition","field":"product_count","operator":"lt","value":"12"},{"type":"condition","field":"cart.total_products_tax_excl","operator":"lt","value":"200","join":"OR"}],"join":"AND"}]}

What You Can Build Next

These 52 trees are starting points, not a ceiling. Because Conditional Order Validation is enterprise class software, you can nest groups inside groups, mix catalog MOQs with geo, payment module names, customer LTV and calendar windows, assign priorities, stop on first match, simulate carts before go-live, then watch blocks and warnings on the dashboard while every evaluation lands in the audit log.

Unlimited possibilities. No artificial limits on condition complexity. If your operations team can describe the rule in plain language, the visual builder — and the JSON behind it — can express it.

Ready to govern checkout properly?

Install Conditional Order Validation, load a preset or paste one of the JSON trees above into Edit as JSON, attach a multilingual Reason, and simulate. Enterprise DNA for PrestaShop 9 / 8 / 1.7.

Conditional Order Validation
Zdjęcie autora: Milosz Myszczuk

Article written byMilosz Myszczuk, PrestaShop expert. CEO and founder of the VEKIA interactive agency. Learn more.

If you like this article, support our work!

Comments