← All guides

Operations deep-dive

Cannabis pickup flow — stop babysitting the online-orders queue

The online-orders queue at most cannabis dispensaries is somebody's job — usually a lead's, sometimes a budtender's, occasionally the GM's when no one else can babysit it. The customer drove to the parking lot expecting their order ready; the dispensary forgot to acknowledge the order; the customer waits in the car. Auto-progression fixes the operating model. Here's how it shipped at our two stores.

By CannAgent7 min read

Why babysitting fails

Online order queues fail in predictable patterns: a staffer gets pulled to the floor, the queue waits, the customer arrives, the order isn't ready, the budtender scrambles to pull from shelf while the customer stands in the lobby. The fix isn't 'hire someone to watch the queue' — it's removing the queue-watching from the human's job.

  • **The acknowledge gap** — order placed but no one clicks 'acknowledge.' Customer assumes the order is being prepped; staff assumes the order is still pending review. Both wrong.
  • **The pull gap** — order acknowledged but no one pulls inventory off shelf. Customer arrives; budtender starts the pull from cold.
  • **The ready gap** — order pulled but never marked ready. Customer arrives; budtender doesn't know whose bag is whose.
  • **The handoff gap** — customer at the counter; budtender doesn't realize the bag is the online order. Re-rings the line items, customer paid online, billing chaos.

The 5 transition gates

Auto-progression means the system moves the order through 5 states without human intervention unless something needs human intervention. Each gate has an exit condition — meet it, the order advances; fail it, the system flags the order for human review.

GateFrom → ToAuto-conditionHuman-flag if
1. AcknowledgePlaced → AcknowledgedWithin 60s of placement, system marks acknowledged + sends customer SMSCustomer-side validation fails (age, ID-on-file expired)
2. PullAcknowledged → PulledInventory check passes, staff scan-confirms each item off shelfOut-of-stock OR product flagged for QA hold
3. ReadyPulled → ReadyBag labeled with customer name + order ID, staged in pickup zoneBag staged but customer hasn't arrived 60+ min after order
4. At-counterReady → At-counterCustomer arrives + ID scanned, bag fetched + customer-display shows matchID mismatch OR ID not in file
5. Picked-upAt-counter → Picked-upFinal confirmation — receipt printed, customer signs/walks outRefund initiated OR product return at counter

The trick: each gate has an SMS that fires automatically when the gate clears. Customer gets 'order received', 'order ready', 'see you at the counter' without staff lifting a finger. Staff lifts a finger only when one of the human-flags fires.

SMS templates — short, time-stamped, no buzzwords

The SMS messages at each transition are the customer's only signal that the system is working. They have to read like a text from someone who knows the order, not like an automated marketing blast.

  1. **Acknowledge SMS** (T+60s): 'Got your order, Alex — pulling it now. We'll text when it's ready.' First name only, no order ID (that's noise), no buzzwords.
  2. **Ready SMS** (T+5-15min depending on order size): 'Your order's ready, Alex. Pickup zone open until 9pm — show ID at the counter.' Includes the cutoff time so the customer knows the window.
  3. **Late-arrival nudge** (T+60min from ready, only if customer hasn't arrived): 'Order's still ready, Alex — want us to hold until tomorrow? Reply YES and we'll re-ready it for 10am.' One-tap retention.
  4. **Refund / hold SMS** (only when human-flag fires): manager-initiated, never auto-fired. The system pre-fills the message, the manager reviews + sends.

What NOT to automate

The gates above are automatable. The exceptions are explicitly not. Some lines:

  • **Don't auto-cancel for late arrival.** Customer might be running 3 hours late for a legitimate reason. Surface the late-arrival nudge SMS at T+60min, but cancellation is a manager call.
  • **Don't auto-refund.** Refunds touch tax + audit + WSLCB record-keeping. Auto-refunding is how you create the inevitable 'customer got refunded but inventory wasn't restored' bug at scale. Manager-initiated only.
  • **Don't auto-substitute out-of-stock items.** A budtender substituting Sour D for Sour D is fine; a system substituting Sour D for Blue Dream is a customer-trust violation. Out-of-stock fires a human-flag, manager makes the call.
  • **Don't auto-tag a return.** Returns require chain-of-custody (per WAC 314-55-095) + reason categorization. The system supports the workflow; the human classifies the return.

Cannabis-specific gotchas

  • **Last-order-window** — WSLCB-licensed retailers in WA can't accept new orders within 15 minutes of close. The system enforces this at gate 1 (acknowledge); orders placed too late get human-flagged for manager review.
  • **Age verification at counter (gate 4)** — even though the customer placed the order online, ID still scans at counter. The platform must enforce this; auto-progressing past age-verify is a sale-to-minor risk.
  • **Per-store inventory** — pickup orders draw from one store's inventory. Cross-store pickup ('I'll grab it at Wenatchee but it's a Seattle order') is NOT permitted under WSLCB licensee rules. The system refuses cross-store assignment by default.
  • **Loyalty redemption at pickup** — customer with points may redeem at counter, not at order placement. Gate 4 has to honor the redemption + recompute totals before the receipt prints.
  • **Pickup-zone retention** — WAC 314-55-082 surveillance requires the pickup zone be on camera with retention. The platform should know which physical zone is the pickup spot + ensure surveillance covers it.

What this replaces

Concretely: a lead with a tablet checking the queue every 15 minutes. A budtender breaking off the floor when a customer arrives confused about an unack'd order. A manager debriefing what went wrong on Mondays. The platform takes those routines off the team's plate; the team handles exceptions.

Takeaways

Ready to talk through your migration?

30-minute demo. We end by quoting the cutover from your current setup — fixed scope, no hourly games.