← All guides

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.

By CannAgent6 min read

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.

  1. **Authorize once.** OAuth handshake or API key (operator-controlled). Stored encrypted in the platform’s env vars; rotates per LeafLink’s rotation cadence.
  2. **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.
  3. **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.
  4. **Receiving team confirms.** Shipment arrives, team scans product, marks confirmed. Variances (short-shipped, damaged) flag for buyer review.
  5. **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

Ready to talk through your migration?

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