← All guides

Loss-prevention playbook

Cannabis dispensary shrink — where it actually hides, and the discipline that finds it

Industry-wide cannabis shrink is reported at 2-4% of cost of goods. At Green Life + SCC, ours runs ~0.6%. The delta isn’t mystical operator skill — it’s the discipline of knowing where shrink hides + having the surface-level controls that catch each variant. Six places shrink lives; six controls. Ranked by where the dollars actually leak.

By CannAgent6 min read

The six places shrink hides (ranked by $-impact)

  1. Receiving short-counts (~30-40% of total shrink at most operators). Vendor manifest says 50 units; physical count is 49. Nobody catches it at receiving; you signed off; the variance writes off as ‘found a gram somewhere.’
  2. Manual quantity adjustments without paper trail (~20-25%). Manager ‘corrects’ an inventory count to match what the floor shows; the gap goes into the void. No reason logged; no investigation. Repeat 200x/year.
  3. Employee theft (~10-15%). Direct product theft on shift; manipulated returns; ringing-without-scanning. Real and patterned; less of total shrink than operators assume but emotionally loaded.
  4. Waste under-reporting (~10-15%). Damaged products, sample destruction, unsalable returns — all real waste that needs to be logged per WAC 314-55-079(7). Skipping the log → variance attributed to nothing → state notices at audit.
  5. Customer theft (~5-10%). Lower than retail because cannabis is behind glass + budtender-handed, but exists on grab-and-runs + during distracted busy-period transactions.
  6. Inventory-system bugs / sync errors (~5-10%). POS rang a sale; state system didn’t receive it; physical inventory pulled correctly. Ledger shows the variance; nobody investigates; gap closes by manual adjustment (which goes to bucket #2).

Six controls that catch each one

Shrink sourceSurface-level controlWhat CannAgent does
Receiving short-countsTwo-person count at receiving against manifest line; vendor-claim filed within 48hrReceiving flow requires count entry per line + flags variance > 1% for vendor-claim queue
Manual quantity adjustments without paper trailManager-PIN required + free-text reason mandatory + pattern-detection on the audit logAdjustment requires manager-PIN; reason picker (Recount / Damage / Vendor short / Other-+-explain); auto-flag if same SKU adjusted >2x/week
Employee theftCamera + budtender-vault-access logged + shift-end variance review + random-day cycle countsAudit log links every void/return/discount to actor; per-budtender variance report; cycle-count scheduler with random-shuffle selection
Waste under-reportingSame-day waste log entry; supervisor sign-off on >$X waste; state-required disposal recordsWaste captured at point of action (in void/return/destruction flows); end-of-day waste-log gaps surface on dashboard
Customer theftBehind-glass display; budtender hands product across the counter; cameras at register + doorDisplay-product-vs-vault SKU separation; transaction-level camera-clip linking (where infra supports)
POS-state sync errorsSync-health monitoring + same-day investigationSync status on manager dashboard; red banner if stuck >4hr; investigation queue for stuck records

The shrink investigation sequence (when monthly count surfaces a gap)

  1. Compute the variance per SKU (not aggregate — aggregate hides patterns). Variance > 2% OR > $100 cost-basis = investigate.
  2. Pull the receiving history for that SKU in the variance window. Was every manifest line counted? Were there vendor-claim filings?
  3. Pull the manual-adjustment audit log for that SKU. How many times was it manually adjusted? By whom? With what reason?
  4. Pull the waste log for that SKU. Anything destroyed, sampled, or written off? Was it logged at point-of-action or reconstructed end-of-day?
  5. Cross-reference voids + returns in the variance window. Was the right SKU pulled physically when the system recorded the void/return?
  6. Pull the per-budtender variance report. Does one budtender appear on a disproportionate share of void/return/discount entries for this SKU?
  7. If steps 1-6 don’t resolve it, pull camera footage for the highest-volume shifts in the variance window. (This is the LAST step, not the first; cameras catch high-emotion theft, not the slow-leak issues that dominate shrink.)

Termination-grade evidence (when the investigation surfaces theft)

  • Document the pattern, not the single incident. Single-incident terminations get unemployment claims granted; documented patterns survive review.
  • Audit log + camera footage + variance report bundled. All three correlated to the SAME shifts.
  • Manager-write-up trail. Was the employee given a 30/60/90 review? Were prior small variances flagged + addressed in writing? See /guides/manager-writeups-that-survive-review.
  • Wage-theft-recovery posture set BEFORE termination. Most states have specific limits on wage withholding for theft recovery; consult your employment attorney before you act, not after.
  • WSLCB CCB-employee-ID flagging. When termination is for cause + the cause is theft of state-tracked product, file the appropriate WSLCB notification per WAC 314-55-077.

Takeaways

  • Six shrink sources ranked by $-impact: receiving short-counts (#1 30-40%), manual adjustments without paper trail (#2 20-25%), employee theft (#3 10-15%), waste under-reporting (#4 10-15%), customer theft (#5 5-10%), POS-state sync errors (#6 5-10%)
  • Operator gut overweights employee theft + underweights receiving + adjustment discipline; #1+#2 alone are 50-65% of total shrink
  • Six controls catch each source — most live in receiving + audit-log + waste-flow discipline, not in cameras
  • Investigation sequence: per-SKU variance → receiving history → adjustment log → waste log → voids/returns → per-budtender pattern → cameras LAST (not first)
  • Termination-grade evidence requires pattern documentation + audit-log+camera+variance correlation + prior write-up trail; wage-theft-recovery posture set BEFORE termination via attorney consult

Related guides

Ready to talk through your migration?

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