Metrc for dispensaries
Metrc reconciliation for dispensaries: the daily, weekly and 30-day procedure
A vendor-neutral SOP for reconciling POS inventory and sales to Metrc — what to count, what to match, what to do with every discrepancy, and the state deadlines that make the clock real.
By BudAlly
Published Reviewed by Regulatory counsel (advisory)Rule pack MI v9 · CA v14 · NY v9
Who this is for. Dispensary GMs, inventory leads and controllers who close the month against Metrc. It is written to work with any POS — Dutchie, Treez, Flowhub, Cova, BLAZE — and it is not legal advice; the state deadlines quoted are checked against the rule text on the review date above.
The short version
Reconcile three things, on three clocks:
- Sales to receipts — daily. Every POS ticket should have a Metrc sales receipt, and the two should agree on packages, quantities and totals.
- Packages to shelf — weekly, by cycle. Rotate through rooms so every package tag is physically counted against its Metrc quantity at least once a month.
- Everything — at the 30-day count. The full reconciliation most states require, with discrepancies classified, adjusted with reason codes, and reported where the rule says so.
If you do the first two, the third is a report, not a weekend.
Why the monthly count is "a race against the clock"
Metrc is the state's ledger, not yours. Your POS holds what you sold; Metrc holds what the state believes you have. They drift for ordinary reasons — a split package received as one, a return rung as a void, a sample pulled without a tag adjustment, a sync that failed on a Saturday — and every day you don't match them, the drift compounds.
By day 28 you are not reconciling; you are investigating. Operators describe hours spent "manually relabeling, counting and verifying", with each discrepancy meaning time "searching for errors" (Metrc, 2026). In California, an unexplained variance found at inspection "becomes an enforcement case" (Baghoomian Law). The fix is cadence, not heroics.
Step 1 — Daily: sales-to-receipt matching
What to match. For each business day, per licence:
| POS side | Metrc side | Match on |
|---|---|---|
| Ticket / transaction ID | Sales receipt | POS receipt number ↔ Metrc ExternalReceiptNumber (your POS sends it), or the Metrc receipt ID if your POS stores it |
| Line items | Receipt transactions | Package tag (PackageLabel), quantity, unit of measure |
| Ticket total, tax lines | Receipt total, five Metrc tax fields | Totals within rounding; excise / state / city / county / municipal split per state |
| Voids and returns | Receipt status / return transactions | Voided POS tickets must not have a live Metrc receipt |
How, by POS. Dutchie exposes register transactions with package IDs through its API; Metrc receipt IDs are stored but not always exposed, so join through Metrc's external-receipt endpoint. Treez tickets carry a seven-state workflow — only completed tickets should have receipts. Cova separates orders from completed orders and refunds; match completed orders only. Flowhub and BLAZE expose sales by transaction; verify the package tag is on the line (BLAZE: confirm with your rep). If your POS has no API, a nightly CSV of tickets with package tags is enough.
Daily output. A one-screen list: unmatched POS tickets, unmatched Metrc receipts, mismatched quantities, mismatched totals. Target: zero by 10 a.m. the next day. Anything older than 24 hours gets a name assigned.
Common causes and fixes
- POS ticket, no Metrc receipt. Sync failure or a sale from a package not in Metrc's "sellable" state. Fix in the POS (re-push) — never create a receipt by hand unless the POS cannot.
- Metrc receipt, no POS ticket. Someone rang a sale directly in Metrc, or the POS voided after pushing. Void the Metrc receipt with a reason, or reinstate the ticket.
- Quantity mismatch on one tag. Usually a unit-of-measure problem (eaches vs grams; 5-packs vs singles). Fix the item mapping, not the receipt.
- Total mismatch. Tax-line mapping. Each state wants its own split; one combined "tax" field from the POS will never match.
Step 2 — Weekly: cycle counts by room
Divide your rooms (vault, sales floor, delivery staging, quarantine, returns) into a rotation so each is counted once a week and every package once a month.
Procedure per room
- Freeze movements into and out of the room for the count window (30–60 minutes; do it before opening or after close).
- Export the room's Metrc packages (tag, item, quantity, unit) — from Metrc directly, not from the POS.
- Scan or count every tag. Record the physical quantity next to the Metrc quantity.
- Classify each difference before anyone adjusts anything:
| Class | Example | Action |
|---|---|---|
| Documentation | Package split in Metrc, not relabelled on shelf | Relabel; no adjustment |
| Timing | Sale rung this morning, receipt not yet synced | Wait for sync; re-check daily list |
| Process | Sample pulled without a Metrc adjustment | Adjust with reason code; fix the sample SOP |
| Loss | Tag missing, no paper trail | Investigate before adjusting; this is what the state's theft/loss notification is for |
- Adjust in Metrc only after classification, with the reason code the state pack requires and the counter's name on the adjustment.
- Log the count: room, date, counter, packages counted, discrepancies by class, adjustments made. Keep the log for the retention period your state sets (New Mexico: sales records 12 months; check your state).
Inbound receiving is where most "shelf" discrepancies start. Receive against the manifest, tag by tag, and record the accepted quantity. If the invoice says 30 and you accepted 28, the invoice quantity must become 28 — a credit memo, not a shrug. If an invoice carries a tag that is not on the manifest, hold the line and ask the sender for a corrected invoice. Do not "fix" the tag.
Step 3 — The 30-day reconciliation
This is the one the rule names. Build it from the daily and weekly work rather than starting from scratch.
Inputs
- Daily match logs for the period (should be clean).
- All cycle-count logs (every package counted at least once).
- Metrc inventory as of close of the last day of the period.
- POS on-hand as of the same timestamp.
- Transfers in and out (manifests, accepted quantities).
- Adjustments, destructions, samples, returns — with reason codes.
Procedure
- Pull Metrc packages (all rooms) and POS on-hand at the same cut-off. Match by tag.
- For each tag with a difference, trace it: receiving → sales → adjustments → transfers. The daily and weekly logs make this a lookup.
- Classify (same four classes). Anything in Loss triggers your state's theft / diversion / loss notification clock — in New Mexico that is "notify CCD"; in California it is a notification within the window set in the DCC rules. Check the pack.
- Make the remaining adjustments, with reason codes and names.
- Produce the reconciliation report: period, licence, packages reconciled, discrepancies by class, adjustments, net variance by value, open items with owners.
- Sign-off by someone other than the person who made the adjustments (maker ≠ checker).
- File it where your state requires, or keep it for inspection.
Tolerance is not a target. Some regulators tolerate small variances before enforcement; operators quote a 3%-of-sales figure for California (Chameleon Collective; confirm against the current DCC text before relying on it). Treat any tolerance as the line you never approach, not a budget.
State cadence (as of the review date)
| State | System | Reconciliation cadence | Notes |
|---|---|---|---|
| California | Metrc | At least every 30 days (4 CCR §15051) | Loss/theft notification windows in DCC rules; excise separated on retail |
| Michigan | Metrc | Per CRA rule and licence conditions [verify cadence] | 24% wholesale tax lands in purchase cost, never as a retail tax line |
| New York | Metrc + Retail ID (Feb 2026) | Per OCM rule [verify cadence] | Second identifier per unit; 7-day credit reporting clock is separate |
| New Mexico | NMS2S since Sep 4, 2026 (not Metrc) | At least monthly (16.8.2.40 NMAC) | NMS2S retail API covers sales/voids; an expanded API (Sept 30, 2026) adds inventory reads, splits and adjustments for validated integrators; room moves and transfers stay manual — see the NMS2S guide |
What to automate, and what never to automate
Automate: the daily match, the exception list, the cycle-count schedule, the report assembly, the tax-line mapping per state, the inbound invoice-to-manifest tag check.
Never automate: Metrc adjustments, receipt voids, tag "corrections", theft/loss notifications. Each is a regulated action that needs a person, a reason and a timestamp. Software should propose; a named person approves. If your software has an "approve all" button for Metrc adjustments, ask why.
Checklist
Daily (10 minutes) — unmatched tickets: 0 · unmatched receipts: 0 · quantity mismatches: 0 · total mismatches: 0 · exceptions older than 24 h assigned.
Weekly (per room, 30–60 minutes) — movements frozen · Metrc export pulled · every tag counted · differences classified · adjustments with reason + name · log filed.
30-day (half a day if the above is done) — same cut-off for Metrc and POS · every tag traced · losses notified on time · adjustments made · report produced · signed off by a second person · filed.
Download the one-page version above. BudAlly runs the daily match and the exception list for any POS and drafts the 30-day report; a person still approves every adjustment — see how.
Downloads
Sources
- Metrc — How Metrc Retail ID saves time and money: a retailer's guide · 2026
- Metrc — Sales receipts API (external receipt number lookup) · 2026
- Chameleon Collective — Inventory optimization with Metrc · 2026
- Baghoomian Law — California cannabis inventory audits and Metrc discrepancies · 2026
- California DCC regulations, 4 CCR §15051 (inventory reconciliation) · 2026
- New Mexico 16.8.2.40 NMAC (retailer requirements) · 2026