Operations deep-dive
Cash discipline at a cannabis dispensary: variance, escalation, audit
Cannabis dispensaries run cash-heavy by design — federal banking is a long story. That means cash variance happens daily, and the only thing standing between $5 over the threshold and $500 walking out the back door is the system that catches the first one cleanly. Here is how we run it across two stores.
Why this matters more in cannabis than other retail
A grocery store with $20 short on a $40K-revenue day has slack — the math hides in the noise. A cannabis dispensary running cash-only doesn't have that slack: every dollar is accounted for, every variance shows up the next morning, and a WSLCB inspection (or the equivalent state regulator) can ask for the till-count log going back 36 months. The system has to be tight from day one.
The variance threshold — set it, code it, escalate it
Every shop sets a variance threshold. Below the threshold, the variance gets logged but nobody loses sleep. Above the threshold, it triggers escalation. The threshold is not a one-size-fits-all number — it scales with shop size and reasonable counting error.
- Under $250K/yr per store: $5/day is the right floor
- $250K-$1M/yr per store: $10/day works — counting error scales with volume
- $1M+/yr per store: $25/day or 0.5% of daily gross, whichever is smaller
The three-step escalation ladder
When variance crosses the threshold, the right response is not 'manager investigates.' That's a single point of failure. The right response is a defined ladder where each step has a name, a timing window, and an exit condition.
- Step 1 — Bookkeeper SMS within 1 hour. Niki gets a text with the variance amount, the till session ID, and the budtender name. She reviews the count log + footage timestamp, decides if it's reconcilable (recount or known-cause) or needs escalation.
- Step 2 — Manager review within 24 hours. If Niki couldn't reconcile, the manager-on-duty for that shift gets a notification. They check footage at the timestamps the till-count flagged, talk to the budtender, write a reconciliation note in the audit log.
- Step 3 — Owner alert within 48 hours. Anything not closed at step 2 surfaces to the owner. By the time it lands at this step, it has the full chain: count log, footage timestamps, manager interview, written reconciliation attempt. The owner makes the call: write-off, write-up, or further investigation.
The audit row — what to log, how long to keep it
Every till close writes an audit row. Variance or no variance. The row is what your system-of-record stands on; without it, the WSLCB / MED / DCC inspection asks 'how do you know?' and the answer has to be a SQL query, not a memory.
| Field | What it captures |
|---|---|
| till_session_id | Foreign key to the till open + close pair |
| closed_at | ISO timestamp, store-local timezone |
| closed_by_user_id | Budtender / lead who counted |
| expected_cash_cents | What the system says should be there (open + sales - drops + change) |
| counted_cash_cents | What the human actually counted |
| variance_cents | counted - expected (signed) |
| threshold_breached | boolean — at-or-above the configured threshold |
| escalation_step | 0 (under threshold) | 1 (bookkeeper) | 2 (manager) | 3 (owner) |
| resolution_status | open | reconciled | written_off | written_up |
| resolution_notes | Free-text from whoever closed the variance |
| resolved_at | ISO timestamp when resolution_status moved off 'open' |
Retention: 36 months minimum (matches WAC 314-55-095). Industry-standard practice is 60 months — at the volume cost of cheap Postgres rows, it's the right call.
The morning reconciliation — what the bookkeeper sees
The day starts with a single email digest. Yesterday's till closes, all variances over threshold, link to the count log + footage timestamp for each. The bookkeeper either resolves them on the spot or escalates to step 2. The whole pass takes 15-25 minutes for a 2-store operation if the system is doing its job.
- Email at 7am store-local, before the bookkeeper's first coffee
- One section per store, sorted by variance magnitude
- Each line: register #, budtender, expected, counted, variance, link to footage timestamp
- Reconcile-on-the-spot button (signs an audit row + closes the variance)
- Escalate-to-manager button (kicks step 2, notifies manager-on-duty)
Common patterns + what they mean
Variance is a signal, not random noise. After running this for ~24 months across two stores we see four recurring patterns. Knowing the pattern is half the resolution.
- Single budtender, repeat $5-15 short → coaching opportunity, not theft. Counting error compounds without a feedback loop. A 10-minute till-count refresher solves it 80% of the time.
- All registers, single shift, $30+ short → bank deposit was light or change order math wrong. Trace it backward through the till-open log.
- Single register, $50+ over (yes, over) → comp ring or change-order recorded twice. Audit the change-fund movements that day.
- Steady drift on one register over multiple days → register hardware miscounting, OR a process issue (e.g. tip share posted to till). Always check hardware first; software second; people last.
What to NOT automate
There's a temptation to fully-automate the resolution. Don't. The threshold + ladder + audit row + morning digest are the right level of automation. The actual reconciliation step has to involve a human looking at footage and talking to the budtender.
- Don't auto-write-off below a higher threshold. Variances ARE the signal — automating them away is automating away the signal.
- Don't auto-classify the cause. Classification needs context the system doesn't have.
- Don't auto-escalate without the bookkeeper review step. That's how you train the owner to ignore step 3.
- Do automate the audit-row write, the digest assembly, and the timestamp linkage to footage.
Takeaways
- Threshold scales with revenue: $5/day under $250K, $10/day at $250K-$1M, $25/day or 0.5% above $1M
- Three-step ladder (bookkeeper → manager → owner) filters recoverable cases before they reach the owner
- Audit row on every close — 36-month minimum retention, 60 is the industry-standard call
- Morning email digest is the one always-exists paper trail. Reconcile-on-the-spot + Escalate buttons drive the day's pass in 15-25 minutes
- Variance is signal, not noise. Single-budtender / single-register / hardware-drift patterns each resolve differently — knowing the pattern is half the work
Ready to talk through your migration?
30-minute demo. We end by quoting the cutover from your current setup — fixed scope, no hourly games.