This FAQ defines a technical substitution policy for cannabis ecommerce orders, including customer preference capture, equivalency rules, compliance checks, and inventory logging.
Why does substitution need a policy?
Cannabis products are not interchangeable by price alone. Whether a swap is acceptable depends on things like form factor, dose, potency, cannabinoid profile, strain, terpene profile, package size, purchase limits, and program rules. Without a written policy, every out-of-stock item turns into an untracked judgment call.
What preferences should checkout capture?
Every order should store one substitution preference in a structured field:
- No substitutions. If the exact product is unavailable, cancel and notify. Do not swap anything.
- Contact before substituting. Hold the order and request approval before fulfillment continues.
- Same brand only. Substitute only within the same brand. If the brand has no equivalent, cancel the item.
- Equivalent product allowed. Use the tiered substitution rules below. The customer accepts the risk of a swap.
substitution_preference = no_substitutions | contact_before_substitution | same_brand_only | equivalent_allowed
What is the substitution matrix?
For orders marked equivalent_allowed, use a tiered matrix that narrows the decision path:
Tier 1: Same product, different size (if legal and available)
Tier 2: Same brand, same format, same potency band
Tier 3: Same category, same dose/weight equivalency
Tier 4: No substitution. Cancel the line item.
How should potency bands be defined?
Configure potency bands per category and have compliance and operations sign off on them. A reasonable starting point is a percentage band around the original product's labeled THC or CBD value. Tighten the band for medical use cases and dose-sensitive form factors.
min_allowed_potency = original_potency * (1 - allowed_variance)
max_allowed_potency = original_potency * (1 + allowed_variance)
Which checks must run before approval?
Before the order completes, run the same checks you would run on the original line:
- availability
- purchase limit
- age or program eligibility
- fulfillment location
- price adjustment and tax
- inventory mapping
If the substitute creates a compliance, POS, or traceability mismatch, don't pick it.
What fields should be logged?
Log enough to keep the order auditable so the inventory exception doesn't later read as a sync failure.
order_id
original_product_id
original_package_uid
substitute_product_id
substitute_package_uid
substitution_preference
substitution_tier
reason_code
approved_by
customer_notified_at
completed_at
What should the picking SOP include?
- Read the substitution preference on the order.
- If "no substitutions" and the product is missing, flag the line as unavailable and move on.
- If "contact before substituting," mark the order for outreach and set it aside.
- If "same brand only" or "equivalent product allowed," consult the tiered matrix.
- Record the substituted SKU, the reason, and the tier used.
- Notify the customer before completion when the preference or regulation requires it.
- Update the order, the POS, and any compliance record immediately, not later.
Which metrics should be monitored?
The ones we watch:
- substitution rate and rejection rate
- cancellation rate for unavailable items
- average substitution approval time
- substitutions broken out by category and by picker
- reconciliation exceptions caused by substitution logging gaps
What is the implementation rule?
Don't pick a substitute unless the order carries a stored preference, the swap matches the configured matrix, and the required checks pass. Log the final product movement against the correct order and package IDs when it happens.