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?

  1. Read the substitution preference on the order.
  2. If "no substitutions" and the product is missing, flag the line as unavailable and move on.
  3. If "contact before substituting," mark the order for outreach and set it aside.
  4. If "same brand only" or "equivalent product allowed," consult the tiered matrix.
  5. Record the substituted SKU, the reason, and the tier used.
  6. Notify the customer before completion when the preference or regulation requires it.
  7. 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.