Inventory playbook
LeafLink + cannabis vendor invoices — kill manual entry
If you order through LeafLink and your POS doesn’t mirror those orders into a draft PO automatically, somebody is retyping every invoice line by hand. Hours a week. Errors compound. Cost-basis drifts. The fix is structural — read LeafLink’s API + match the SKUs + write a draft PO ready for receiving-team confirmation.
What manual entry actually costs
The retyping pattern looks small per-invoice (15-30 minutes for an average 20-line cannabis order) but compounds. A multi-vendor week is 4-6 invoices; a typical dispensary running 20 vendors hits 60-100 invoices/month. At 20 minutes per invoice = 20-33 hours/month of typing that nobody enjoys + nobody verifies because verification is also manual.
- **Time** — at $25/hr loaded, 25 hrs/month = $7,500/yr in pure-overhead labor.
- **Errors** — typos drift cost-basis. A SKU with cost typed as $12.50 instead of $1.25 mis-prices margin reports for weeks until someone notices.
- **Latency** — the time between vendor-ships-it and POS-knows-it-arrived determines when reorder math triggers. If invoices land Tuesday but get typed Thursday, your reorder algorithm is operating with 2-day-stale data.
- **Reconciliation** — bookkeeper has to match invoice → PO → received → AP. Each disconnect is a question the bookkeeper asks the buyer.
What ‘LeafLink mirror’ means concretely
LeafLink offers an order-mirror API for licensed retailers. The mechanic: you authorize the integration, the platform receives a webhook (or polls) on order confirmation, and a draft PO appears in your POS that’s already line-matched to your product catalog. The receiving team scans incoming product, confirms quantities, and posts. No retyping.
- **Authorize once.** OAuth handshake or API key (operator-controlled). Stored encrypted in the platform’s env vars; rotates per LeafLink’s rotation cadence.
- **Catalog match runs nightly.** Your product catalog gets matched to LeafLink’s SKUs by EAN + brand-alias + name fuzzy-match. New unmatched products surface in an admin queue for one-click approval.
- **Order confirms → draft PO appears.** Within ~5 minutes of you confirming an order in LeafLink, the corresponding draft PO is in your POS, line-matched, with vendor name + delivery date + cost-basis pre-filled.
- **Receiving team confirms.** Shipment arrives, team scans product, marks confirmed. Variances (short-shipped, damaged) flag for buyer review.
- **Posted PO flows to inventory + cost-basis.** No re-entry. The cost-basis update propagates to per-product cost in real-time.
Brand alias matching — the gotcha that breaks integrations
Cannabis vendors are frequently spelled multiple ways across LeafLink, your catalog, and supplier emails. Northwest Cannabis Solutions / NWCS / NW Cannabis. Without an alias map, the matcher fails to dedup and your buyer sees 'NWCS' as 3 different vendors. Then the auto-PO splits across them. Then everything breaks.
- Maintain an aliases column on the vendors table — every accepted spelling for that vendor.
- Match runs LOWER + TRIM on both sides — ‘NWCS ’ matches ‘nwcs’ matches ‘NWCS’.
- When a new spelling appears, surface it for admin approval — don’t auto-match (false positives are painful).
- Refresh aliases quarterly — vendors rebrand, merge, change DBAs. Stale aliases break matching silently.
What NOT to mirror
LeafLink’s data is rich. Some of it shouldn’t auto-flow into your POS without human review.
- **Don’t auto-receive.** The PO appears as a draft. The receiving team has to scan + confirm. Auto-receive would let an unrelated shipment update your inventory.
- **Don’t auto-update sale price.** Cost-basis flows through; sale price is a margin-decision the operator makes. The product catalog should retain the existing retail price until someone updates it.
- **Don’t auto-create new products.** A new SKU on LeafLink is a buying decision. Surface it for the buyer to confirm + categorize before it lands in the catalog.
- **Don’t auto-pay.** Invoice→AP→bank-payment is the bookkeeper’s job. Auto-paying invoices is how you get the inevitable double-pay or wrong-vendor-pay error.
Cannabis-specific wrinkles
- **WSLCB lab-test 5% passthrough (WAC 314-55-079)** — the cost-basis update has to handle the lab-test surcharge correctly. LeafLink’s line price may or may not include the test fee depending on the producer; the matcher needs to know which side computes it.
- **METRC tag chain-of-custody** — LeafLink integrations sometimes carry the METRC package id; sometimes don’t. If the tag isn’t in the LeafLink payload, receiving still has to scan the manifest tag separately. The mirror doesn’t replace the manifest workflow — it co-exists with it.
- **Allocation-period skew** — during recreational allocation cycles, LeafLink prices can shift hour-to-hour. The draft PO should snapshot the price at order-confirm time, not poll for live updates after.
- **Vendor terms (Net-X) on the AP side** — payment terms (Net-30, Net-60) live in the vendor master, not the LeafLink payload. The bookkeeper’s aging report has to know — and only the vendor master tells it.
Takeaways
- Manual invoice entry: ~25 hrs/month + cost-basis drift + reorder latency + bookkeeper reconciliation friction. ~$7,500/yr in overhead.
- LeafLink mirror: authorize once, catalog match runs nightly, draft POs land 5 min after order-confirm, receiving team confirms — no retyping.
- Dogfood result across two stores: ~6 hrs/wk to ~0 once the mirror landed. Cost-basis errors dropped to ~0.
- Brand alias matching is the make-or-break gotcha — maintain aliases column, refresh quarterly, never auto-match new spellings.
- Don’t auto-receive / auto-update sale price / auto-create products / auto-pay. Preserve human-judgment moments; remove drudgery.
Ready to talk through your migration?
30-minute demo. We end by quoting the cutover from your current setup — fixed scope, no hourly games.