← Back to knowledge base

Inventory KPIs

Inventory KPIs

Summary

This reference is the consultant-grade playbook for inventory-side KPIs in a licensed cannabis dispensary — 7 KPIs covering the 5 metrics in REQUIREMENTS.md KPI-02 (inventory turns by category, days on hand, sell-through rate, shrinkage %, dead stock thresholds) plus 2 cannabis-specific KPIs that fundamentally live in the inventory domain: menu velocity by category (how fast SKUs move off the menu — an inventory question even though it touches merchandising) and compliance adherence rate (Metrc reconciliation pass rate — owned by inventory ops, not the sales floor). Every KPI is segmented by the 5 cannabis categories (Flower, Pre-rolls, Vape, Edibles, Concentrates) × the 4 market-maturity tiers, with an explicit cross-industry analog (grocery / perishable for turns; QSR for menu velocity; pharmacy for compliance adherence) and 2-3 concrete improvement levers each.

Source: practitioner benchmarks, Treez operator network (~300 orgs across 24 legal states), as of 2025-2026. All numbers are ranges — cannabis inventory economics vary too widely by state, store-format, and season for single-point precision.

For market maturity tier definitions (Saturated / Mature / Emerging / New-Medical-only) and the saturation → discount-pressure → compressed-turns relationship, see pricing.md. For store-format definitions (single-store independent, small chain, MSO/large chain, delivery-only) see retail-strategy.md. For inventory-buying frameworks (par levels, reorder points, demand forecasting) that the improvement levers reference, see inventory-planning.md. For Metrc audit cadence, the 4 manifest types, and state-specific cannabis expiration rules (CA / CO / MI / IL / FL / NY), see compliance-metrc.md. The canonical Business Stage Ladder lives in sales-kpis.md — cross-referenced in the next section, not restated here.


Quick Reference: KPI Index

| KPI | Stage | Cadence | Anchor | |-----|-------|---------|--------| | Sell-Through Rate | Launch | weekly (launch), monthly (steady state) | #sell-through-rate | | Compliance Adherence Rate | Launch | weekly (rolling 30d) | #compliance-adherence-rate | | Inventory Turns by Category | Growth | weekly (flower), monthly (other) | #inventory-turns-by-category | | Days on Hand | Growth | weekly (per buyer) | #days-on-hand | | Dead Stock Thresholds | Growth | weekly (aging report) | #dead-stock-thresholds | | Shrinkage % | Growth | weekly per category; monthly aggregated | #shrinkage- | | Menu Velocity by Category | Mature | monthly menu review | #menu-velocity-by-category |


Business Stage Ladder Cross-Reference

The canonical Business Stage Ladder lives in sales-kpis.md — a cross-domain tiering of KPIs by operational maturity. This section is NOT a restatement; it is the inventory-side slice of that ladder, extracted for quick reference. For the full multi-domain ladder (which also weaves in sales, financial, and customer KPIs stage-by-stage) see sales-kpis.md under the Business Stage Ladder section.

Inventory-side slice of the Business Stage Ladder:

  • Launch (0–6 months): Sell-through rate, Compliance adherence rate. In the first six months, you cannot yet tell what "good turns" look like for your store — you don't have stable demand patterns. But you CAN measure how fast what you bought is selling (sell-through) and whether Metrc reconciliation is clean (compliance). These two KPIs protect the downside while the buying muscle develops.
  • Growth (6–18 months): Inventory turns by category, Days on hand, Dead stock thresholds. Demand patterns have stabilized; the buyer now has a real baseline. This is the stage where turns discipline compounds — each percentage-point improvement in flower turns over a year reclaims meaningful working capital.
  • Mature (18+ months): Shrinkage %, Menu velocity by category. Once core inventory discipline is in place, the next tier of optimization is tightening shrink (which takes sustained process work — weight-tare training, cycle-count cadence) and engineering the menu itself (Pareto-tightening the assortment).

Return to sales-kpis.md for the full cross-domain ladder including sales-floor, financial, and customer KPIs at each stage.


Sell-Through Rate

Definition: Percent of received units sold within a defined window (typically the first 6 weeks after a lot hits the sales floor). Anchored by lot / receipt date for flower, by SKU for non-flower.

Formula: Units Sold (window) / Units Received (window) × 100 (over a 6-week trailing window per SKU or lot)

Benchmark by category × maturity (Treez operator network, 2025-2026):

| Category | Saturated | Mature | Emerging | New/Medical-Only | |----------|-----------|--------|----------|-------------------| | Flower | 70–88% | 65–85% | 55–75% | 45–65% | | Pre-rolls | 75–90% | 70–88% | 60–80% | 50–70% | | Vape | 75–90% | 70–85% | 60–78% | 50–68% | | Edibles | 60–78% | 55–75% | 50–70% | 40–60% | | Concentrates | 55–72% | 50–68% | 45–65% | 40–60% |

(Cross-reference pricing.md for maturity tier definitions and the saturation → discount → sell-through dynamic. Saturated markets show elevated sell-through because aggressive markdowns clear product faster — the number looks healthier while margin quietly erodes.)

What good looks like: The 6-week sell-through curve is steep early — 35–50% sold in weeks 1–2 for flower. A flat early curve means the product isn't resonating (wrong price, wrong shelf, wrong strain name) and a week-2 markdown / shelf-move intervention is already warranted.

What bad looks like: Sell-through is "fine" at 6 weeks (say 70%) but the curve was flat for the first 3 weeks and only steepened when week-4 markdowns kicked in. You haven't proven product demand — you've proven you can discount your way out. The repeat-purchase data will be weak.

Closest analog industry: Specialty retail — the apparel sell-through model (first 6 weeks tells you everything about a season's buy). Cannabis is the same model compressed by perishability for flower: instead of a 12-week fashion season, flower has a 6-week "freshness window" where consumer preference for recent harvests makes early velocity decisive.

Cross-industry comparison: Apparel benchmarks 60–80% 8-week sell-through at full price for healthy SKUs; cannabis flower should hit 65–85% in 6 weeks — compressed window, similar threshold. The cannabis-specific wrinkle: sell-through isn't just a demand signal, it's a freshness signal. A lot sitting at week-6 has already lost measurable terpene presence.

Improvement levers:

  1. Tighter receiving cadence — replace one monthly 80-unit drop with four weekly 20-unit drops so each lot gets a clean 6-week window to measure. Prevents mixing harvest dates on shelf.
  2. Week-2 markdown trigger — if a flower SKU is below 25% sell-through at week 2, mark down 10–15% rather than waiting for week-4 panic. The earlier markdown recovers more margin than the late one.
  3. Anchor-vs-niche tiering — don't apply the same 6-week threshold to a limited-release craft flower drop (expect 90%+ sell-through in 2 weeks) and a daily-driver vape SKU (steady 70% over the window). Set category-tier-specific thresholds.

Review cadence: Weekly during the first 6 months (buyer + category manager); monthly steady-state for mature stores.

90-day realistic target: If flower 6-week sell-through is at 55%, target 60–65% — not 80%. Fast-moving it to 80% requires markdown depth that erodes margin faster than it reclaims working capital.

📊 Treez data: sales_monthly.units_sold per category gives the numerator for a brand × category monthly proxy; the true denominator (units received in-window per lot) requires a PMS inventory-receipt query — see QUERY_PATTERNS.md §Treez Inventory Patterns.


Compliance Adherence Rate

Definition: Percent of Metrc reconciliation events (manifest receipts, transfers, adjustments, closes) completed within the state-mandated window without a variance flag or late-close penalty. Measures the operational health of the compliance function — the inventory-side cost center where compliance work actually happens.

Formula: Compliant Events / Total Events × 100 (rolling 30-day window)

Benchmark by store-format × maturity (Treez operator network, 2025-2026):

| Store Format | Saturated | Mature | Emerging | New/Medical-Only | |--------------|-----------|--------|----------|-------------------| | Single-store independent | 90–96% | 92–97% | 88–94% | 85–92% | | Small chain | 92–97% | 94–98% | 90–95% | 88–94% | | MSO / large chain | 95–98% | 95–99% | 93–97% | 90–95% | | Delivery-only | 94–98% | 95–99% | 93–97% | 90–96% |

(Cross-reference pricing.md for maturity tier definitions. New/medical-only markets read lower not because operators are less careful — because Metrc rollout is newer, variance noise is higher, and regulator tolerance for process drift hasn't stabilized yet.)

What good looks like: 95%+ adherence with clean variance-trend data (month-over-month flat or improving). End-of-day Metrc close is a bundled checklist item, not a standalone chore. The compliance lead can tell you without looking: which manifest type drives the most variance, which shift has the cleanest tare discipline, and what the last 3 months of external-audit readiness looks like.

What bad looks like: 98% reported adherence but the measurement window cherry-picks clean weeks. The monthly Metrc reconciliation regularly takes 2–3 days past end-of-month. Weight-variance events are closed with "adjustment" manifests without root-cause tagging. The compliance lead is a single-point-of-failure whose vacation triggers a visible drop.

Closest analog industry: Pharmacy / controlled-substance retail — DEA Schedule II audit pass rates run at 98–99.5%. Cannabis is structurally lower because bulk flower introduces a weight-variance reconciliation challenge pharmacy doesn't face (pills come in discrete pre-counted units; flower is weighed at deli). The Metrc package model reduces but doesn't eliminate this — any deli-prep operation still creates tare error.

Cross-industry comparison: Pharmacy's 99%+ benchmark is achievable because the product is discrete. Cannabis benchmark of 95%+ reflects the reality that ±2% weight variance on bulk-flower deli is structural. Getting below that requires either packaging-only operations (no deli) or best-in-class tare training.

Improvement levers:

  1. End-of-day Metrc close bundled into close-of-business checklist — compliance is not its own standalone workflow; it's the final step of close-of-business. Single biggest variance reduction is making "Metrc close" item #7 on the 10-item close checklist — see compliance-metrc.md for the monthly audit cadence that consumes this daily output.
  2. Weight-tare protocol training — the #1 source of cannabis-specific variance is bud-tender-error at deli-prep weighing. Quarterly 30-minute tare refreshers drop variance by 30–50% in Treez operator data.
  3. Monthly Metrc audit dry-run with manager — before the monthly reconciliation, the manager runs a 30-SKU spot check. Catches drift early; builds audit-literacy in operational staff. Cross-link to compliance-metrc.md for the 4 manifest types this exercise covers (incoming / outgoing / transfers / adjustments).

Review cadence: Weekly review of rolling 30-day adherence rate; monthly formal reconciliation (see compliance-metrc.md for cadence).

90-day realistic target: If at 92%, target 95% — not 99%. Structural tare-error variance keeps the last 3 percentage points expensive; chasing them before basic process discipline is in place burns labor without moving the number.

📊 Treez data: Not derivable from sales_monthly; requires a Metrc API feed + PMS reconciliation query. See compliance-metrc.md for the audit cadence and QUERY_PATTERNS.md §Treez Compliance Patterns for the query shape.


Inventory Turns by Category

Definition: The number of times average inventory sold through, annualized, computed per cannabis category. The canonical inventory-health KPI — but only meaningful at the category level because flower, vape, and edibles have structurally different turn profiles.

Formula: (Units Sold × Avg Cost) / Avg Inventory Value × (12 / period months) — annualized turns per category.

Benchmark by category × maturity (Treez operator network, 2025-2026):

| Category | Saturated | Mature | Emerging | New/Medical-Only | |----------|-----------|--------|----------|-------------------| | Flower | 8–14x | 12–18x | 10–16x | 7–12x | | Pre-rolls | 14–22x | 18–26x | 15–22x | 10–16x | | Vape | 8–14x | 10–16x | 9–14x | 7–11x | | Edibles | 6–10x | 8–12x | 7–11x | 5–9x | | Concentrates | 4–8x | 6–10x | 5–9x | 4–7x |

(Cross-reference pricing.md for maturity tier definitions and the explicit saturation → discounting → turns-compression relationship: saturated markets compress absolute prices and push more inventory through at thin margin, producing somewhat lower turns with much thinner per-unit contribution. Do NOT read "saturated flower turns 10x" as healthier than "mature flower turns 14x" — the margin denominator differs.)

What good looks like: Flower turns land in the upper-mature band (14–18x), the buyer knows per-SKU turns not just category turns, and the SKUs that turn slowest are either niche-curated (deliberately low-velocity, high-margin anchors) or already in a markdown queue. The variance between top-turn and bottom-turn SKU within a category tells the buyer where attention is needed.

What bad looks like: Category turns at 9x flower, but 40% of flower SKU count sits below 6x and no markdown queue is running. Working capital is locked in aging flower that will need a write-down; the buyer is "doing the turns" by over-ordering the fast SKUs to pull up the denominator.

Closest analog industry: Grocery / perishable retail. Produce turns 30–50x/yr because perishability is severe and per-unit price is low. Cannabis flower sits at 12–18x in mature markets — lower because per-unit margin is much higher (a 7g flower jar at $40 absorbs more holding cost than a $4 head of lettuce) and per-unit price is 10x higher. Same perishability pressure, different economics.

Cross-industry comparison: Apparel (2–6x/yr) is far too low; supermarket non-perishables (8–12x) are closer but still underestimate flower velocity; perishable produce (30–50x) is the right pattern but cannabis is compressed by price and legal constraints (no back-of-house ripening tricks, no sister-store re-shipment without a manifest).

Improvement levers:

  1. Tighter per-SKU par levels — instead of buying to category targets, buy to per-SKU par bands. Cross-link to inventory-planning.md for the par-level framework.
  2. Faster received-to-floor cadence — every day a lot sits in back-room aging instead of on the sales floor is one day of measured age, zero days of sell-through opportunity. A same-day-receipt-to-floor standard improves flower turns 10–20% in Treez operator data.
  3. B2B / wholesale relief valve for slow movers — outbound transfer to another licensed dispensary or distributor takes slow flower off the shelf at cost-recovery or small-loss rather than eating markdown depth to clear it. Requires an outgoing manifest — see compliance-metrc.md for the manifest mechanics. This is a stand-alone lever; do not treat it as a last resort.

Review cadence: Weekly for flower (perishable); monthly for non-flower (vape, edibles, concentrates).

90-day realistic target: If flower turns 9x/yr, target 11–13x/yr — not 18x. Jumping to the upper-mature band requires buying discipline, demand-pattern data, and B2B-exit plumbing that takes 2–3 quarters to build.

📊 Treez data: sales_monthly.units_sold × avg_price × (1 - margin) approximates monthly COGS per brand × category. Annualize × 12, divide by average inventory value. True average inventory value requires a PMS inventory-snapshot query — see QUERY_PATTERNS.md §Treez Inventory Patterns.


Days on Hand

Definition: The number of days of forward-looking sales the current on-hand inventory will cover at trailing velocity, computed per category. Operationally more useful than turns for day-to-day buyer decisions because it's expressed in the buyer's native unit (days until re-order).

Formula: Current On-Hand Units / Avg Daily Units Sold (trailing 30d) — per category or per SKU.

Benchmark by category × maturity (Treez operator network, 2025-2026):

| Category | Saturated | Mature | Emerging | New/Medical-Only | |----------|-----------|--------|----------|-------------------| | Flower | 28–50 days | 21–35 days | 25–40 days | 32–55 days | | Pre-rolls | 18–32 days | 14–25 days | 18–30 days | 25–40 days | | Vape | 32–50 days | 28–45 days | 30–48 days | 38–60 days | | Edibles | 40–60 days | 35–55 days | 38–58 days | 45–70 days | | Concentrates | 50–80 days | 45–70 days | 48–75 days | 55–90 days |

(Cross-reference pricing.md for the saturation-induced pricing-pressure dynamic that shows up here as slightly elevated days-on-hand even with aggressive markdowns — the markdown clears some but seeds shopper expectations of future markdowns.)

What good looks like: Flower days-on-hand under 35 in mature markets, with a buyer-owned weekly reorder rhythm. Per-SKU days-on-hand on the buyer's dashboard, not just category aggregate.

What bad looks like: Flower days-on-hand at 45 in a mature market and the buyer is ordering on a fixed calendar (weekly-Tuesday drops) rather than a demand-signal trigger. Stockouts on top-selling SKUs co-exist with 60-day aging on bottom-decile SKUs.

Closest analog industry: Grocery / perishable — same perishability-driven ceiling logic as inventory turns. The mathematical inverse of turns (365 / days-on-hand ≈ annualized turns for perishable-cycle categories), so benchmarks read consistent.

Cross-industry comparison: Produce days-on-hand runs 3–10 days; cannabis flower 21–35 days because unit price is 10x higher and the regulatory overhead (Metrc tags per package) discourages sub-weekly receiving. The 21–35 day band is the cannabis-specific sweet spot — below 21 days flirts with stockout cost, above 35 flirts with freshness cost.

Improvement levers:

  1. Per-SKU buyer dashboard — category days-on-hand hides the SKUs in trouble. A per-SKU view with a yellow/orange/red threshold (see Dead Stock Thresholds below for flower-specific thresholds) is the single most impactful buyer tool.
  2. Reorder-trigger based buying (not calendar-based) — re-order when a SKU crosses a days-on-hand floor (e.g., 14 days) rather than on a fixed weekly schedule. Cross-link to inventory-planning.md for reorder-point mechanics.
  3. B2B / wholesale relief valve at the upper threshold — same as for turns; at 60+ days on flower, trigger a B2B exit to recover cost rather than deepen markdown. Outgoing manifest per compliance-metrc.md.

Review cadence: Weekly per buyer; daily during launch.

90-day realistic target: If flower days-on-hand is 45, target 32–35 — not 21. Getting to 21 requires demand-signal tooling (reorder triggers, velocity forecasting) that takes a full quarter to build and train staff on.

📊 Treez data: sales_monthly.units_sold / 30 approximates daily velocity per brand × category; on-hand snapshot requires a PMS inventory-table query — see QUERY_PATTERNS.md §Treez Inventory Patterns.


Dead Stock Thresholds

Definition: Practitioner-defined aging thresholds at which a SKU triggers a review / markdown / B2B-out / destroy decision, anchored by days-since-receipt (per lot for flower, per SKU for non-flower). These are NOT regulatory expiration limits — regulatory limits where they exist are a ceiling on top of these practitioner thresholds.

Formula: Days Since Receipt (per lot for flower; per SKU for non-flower) — compare to tiered thresholds below.

Benchmark thresholds — Treez operator network, 2025-2026 (practitioner, NOT regulatory):

| Category | Yellow (review) | Orange (markdown / B2B) | Red (destroy / loss-out) | |----------|-----------------|--------------------------|---------------------------| | Flower | 90 days | 120 days | 180 days | | Pre-rolls | 60 days | 90 days | 120 days | | Vape | 270 days | 365 days | 540 days | | Edibles | read label | 60 days before stamped expiration | at stamped expiration | | Concentrates | 365 days | 540 days (720 in good packaging) | 720 days |

These are PRACTITIONER thresholds based on cannabinoid and terpene degradation curves, NOT regulatory limits. State-specific cannabis expiration rules — where they exist — override these. See compliance-metrc.md for the 6-state regulator survey (CA / CO / MI / IL / FL / NY) covering stamped-expiration, package-life, and extract-shelf rules. When a state rule conflicts with a practitioner threshold, the state rule wins.

(Cross-reference pricing.md for maturity-tier context: saturated markets compress the practitioner thresholds in practice because competitive discounting pulls product off the shelf before the 90-day yellow triggers.)

What good looks like: Receiving-date stickers are on every flower deli jar, buyer reviews a weekly aging report, and the yellow threshold actually triggers a pricing review (not a "we'll watch it" pass). Flower-over-120-days-on-hand sits below 5% of total flower inventory value.

What bad looks like: Flower stacked by strain name with no visible receive date, the buyer learns about 150-day flower only when a bud-tender complains about dryness, and the response is a 40% markdown that fails to move it because terpenes are already gone. The buyer does not know at a glance what portion of inventory value sits past the orange threshold.

Closest analog industry: Inline perishable-rotation pattern — cannabis flower has a cannabinoid degradation curve (THC –10–15% over 12 months in good packaging, faster in bad) and a terpene degradation curve (volatiles –30–50% over 6 months even in good packaging). The 90 / 120 / 180 day timer is internal to the product chemistry, not borrowed from generic apparel markdown logic. Applying generic retail "obsolete after 12 months" thinking here destroys inventory value.

Cross-industry comparison: Apparel "obsolete after 12 months" vastly under-prices cannabis flower perishability; dairy "sell-by" tags over-price it (dairy goes bad at a hard timestamp, flower degrades along a curve). The right analog is inline perishable-rotation (produce rotation, deli-prep product) — continuous-quality-decline with no hard cliff, requiring aging-report discipline.

Improvement levers:

  1. Receiving-date stickering on every flower jar at the deli — visual aging signal for staff AND shoppers; cheapest intervention with highest compounding ROI.
  2. Weekly buyer-owned aging report — not a monthly exercise. Weekly cadence catches yellow-threshold SKUs before they hit orange, where markdown depth gets expensive.
  3. Pre-emptive markdown at yellow, B2B exit at orange — don't wait for red. At yellow (day 90 flower), a 10–15% markdown with featured shelf placement clears most of the lot without terpene damage showing. At orange (day 120), B2B loss-out to another licensed retailer recovers more cost than a 40% in-store markdown — outgoing manifest per compliance-metrc.md.

Review cadence: Weekly aging report, by category.

90-day realistic target: Get flower-over-120-days-on-hand below 5% of total flower inventory value; not zero. Some aging is structural — niche-curated SKUs, seasonal strains, sister-store transfers in flight.

📊 Treez data: sales_monthly.discount_frequency rising in a category signals dead-stock pressure (markdowns absorbing slow movers). On-hand-by-receipt-date requires a PMS lot-level query — see QUERY_PATTERNS.md §Treez Inventory Patterns, and cross-link to compliance-metrc.md (Metrc tracks package creation date by definition, so lot-age data is first-class in the compliance feed).


Shrinkage %

Definition: Percent of inventory value lost to theft, breakage, weight variance, or unaccounted disappearance, computed against period inventory value. Measures the gap between expected on-hand (from POS-plus-receipts math) and actual on-hand (from physical count).

Formula: (Expected On-Hand - Actual On-Hand) × Avg Cost / Period Inventory Value × 100

Benchmark by store-format × maturity (Treez operator network, 2025-2026):

| Store Format | Saturated | Mature | Emerging | New/Medical-Only | |--------------|-----------|--------|----------|-------------------| | Single-store independent | 1.2–2.5% | 1.0–2.0% | 1.2–2.2% | 1.4–2.5% | | Small chain | 1.0–2.0% | 0.9–1.8% | 1.0–2.0% | 1.2–2.2% | | MSO / large chain | 0.9–1.8% | 0.8–1.5% | 0.9–1.7% | 1.1–2.0% | | Delivery-only | 0.5–1.2% | 0.4–1.0% | 0.5–1.2% | 0.6–1.4% |

(Cross-reference pricing.md for maturity-tier definitions. Saturated-market shrink reads slightly higher partly because discount-heavy environments create markdown-vs-shrink classification ambiguity in POS data.)

What good looks like: Sub-1.5% shrink on flower in a mature market, weekly cycle counts covering 10% of SKUs (so full coverage in ~10 weeks), and a root-cause trail for every variance event (not "process issue — will investigate"). Weight-tare training is quarterly and documented.

What bad looks like: Shrink "always hovers around 2.5%" but the store only does a full physical count annually, there's no cycle-count program, and variance events get closed with generic "adjustment" manifest entries. The compliance lead can't tell you whether the 2.5% is theft, breakage, or tare-error.

Closest analog industry: Specialty retail / regulated CPG — alcohol retail shrink runs 1–2%, tobacco 1–3%. Cannabis sits in the same band with a cannabis-unique driver layered on: bulk-flower deli weight-variance creates a structural floor that packaged-alcohol stores don't face. Delivery-only operators beat the retail store benchmark because there's no walk-in shrink, though they face driver-handoff variance.

Cross-industry comparison: Apparel shrink 1.5–2.0%; grocery 1–2%; jewelry 1.5–3%. Cannabis is squarely in that band for packaged products (vape, edibles) and slightly elevated for flower because of tare variance. The cannabis-unique add: Metrc-reconciliation losses (weight drift that shows up against Metrc package weights) are their own bucket, and separating them from classical theft/breakage is the mark of a sophisticated shrink program.

Improvement levers:

  1. Weight-tare protocol training (#1 cannabis-specific driver) — 30-minute quarterly refresh of deli-prep weighing technique; single biggest shrink reduction Treez operators report, typically 20–40% over two quarters.
  2. Camera coverage at the flower-deli station — not for theft-deterrence; for post-hoc review of variance events. When a weight event flags, the buyer can actually see what happened.
  3. Weekly cycle-count cadence (vs monthly or annual full counts) — 10% of SKUs weekly catches variance early and builds count-literacy in the inventory team. Cumulative coverage equals full count every ~10 weeks without the operational disruption of a full-store close.

Review cadence: Weekly per category; monthly aggregated for finance / leadership.

90-day realistic target: If at 2.0%, target 1.5% — not 0.5%. Getting below 1% requires a full-stack process intervention (tare, camera, cycle count, root-cause tagging) that compounds over 3–4 quarters.

📊 Treez data: Not derivable from sales_monthly; requires PMS inventory-reconciliation queries (Treez expected-vs-actual snapshots). See QUERY_PATTERNS.md §Treez Inventory Patterns for the reconciliation-query shape. Metrc-reconciliation-loss isolation requires the Metrc API feed cross-referenced per compliance-metrc.md.


Menu Velocity by Category

Definition: The rate at which menu SKUs are introduced, sold-through, and cycled off the menu — operationalized as the share of menu SKUs (per category, trailing 90 days) that drive the top 80% of category revenue. Lower share = healthier Pareto concentration; higher share = bloated assortment with too many small movers.

Formula: SKUs in Top 80% Revenue (category, 90d) / Total SKUs Listed (category, 90d) × 100

Benchmark by category × maturity (Treez operator network, 2025-2026):

| Category | Saturated | Mature | Emerging | New/Medical-Only | |----------|-----------|--------|----------|-------------------| | Flower | 22–32% | 20–28% | 25–35% | 30–42% | | Pre-rolls | 20–30% | 18–26% | 22–32% | 28–40% | | Vape | 25–35% | 22–30% | 25–35% | 30–42% | | Edibles | 25–35% | 22–32% | 26–36% | 32–45% | | Concentrates | 28–40% | 25–35% | 30–42% | 35–50% |

(Healthy-menu heuristic: top 20–30% of SKUs drive 80% of revenue — classic Pareto. If 50%+ of SKUs are needed to hit 80% of revenue, the menu is bloated. Saturated markets slightly elevate the share because discount-driven cross-shopping spreads revenue across more SKUs.)

What good looks like: 22% of flower SKUs drive 80% of flower revenue, the monthly menu review culls bottom-decile consistently, and new SKUs get a defined "drop window" (e.g., 60 days) to prove velocity before they're added to the evergreen keep-list.

What bad looks like: Flower SKU count has crept to 120 SKUs with no culling rhythm, 55% of SKUs are needed to hit 80% of revenue, and the buyer can't tell you without a spreadsheet which 10 SKUs to cut first. Holding cost of the long tail quietly eats flower turns.

Closest analog industry: QSR / fast-casual menu engineering — Chipotle's menu has ~14 SKUs driving 95% of orders (extreme concentration). Cannabis dispensaries run 200–1000 SKUs and can't compress that far because shoppers expect strain choice, but the Pareto principle still governs — see cross-retail/menu-engineering.md for the assortment-tiering (anchor vs niche) framework that the improvement levers below consume.

Cross-industry comparison: QSR 80/20 ratio ~10% (extreme concentration); grocery specialty ~25% (broad assortment, still Pareto); department store apparel ~35% (very broad); cannabis flower 20–28% in mature markets places it closer to grocery specialty than to QSR. The cannabis-specific wrinkle: strain variety is a legitimate shopper-value driver (persona-driven choice architecture) so compressing the tail too aggressively trades basket-size breadth for inventory-health metrics.

Improvement levers:

  1. Monthly menu review with category manager — drop bottom-decile SKUs, feature emerging movers. Single biggest lever for menu-velocity concentration.
  2. Drop-window cadence for new SKUs — every new SKU gets 60 days of shelf time to prove velocity; fail-to-prove auto-queues for cut at next menu review. Prevents passive-add-only menu growth.
  3. Anchor-vs-niche tiering — anchors (top quartile by velocity) get permanent menu slots; niche rotates on a 90-day cycle. See cross-retail/menu-engineering.md for the full tiering framework.

Review cadence: Monthly menu review, per category.

90-day realistic target: If 50% of flower SKUs are needed to hit 80% of revenue (120-SKU menu), target 30–35% (cut to ~85 SKUs) — not 20% in one quarter. Aggressive cuts without a drop-window process trigger shopper complaints about missing favorites.

📊 Treez data: sales_monthly aggregates by brand_name × category × month, which is brand-level — not SKU-level. Menu-velocity calculation requires SKU-level data: sum revenue per SKU, rank, cumulate to 80%, count SKUs in the top band. See QUERY_PATTERNS.md §Treez Sales Patterns for the SKU-level aggregation shape.


KPI Interaction Effects

Within-inventory-domain tradeoffs. Pushing one KPI typically moves an adjacent one — sometimes helpfully, sometimes counter-productively. Operators optimizing one KPI in isolation frequently tank another.

| Push This Up | This Tends To Drop / Rise | Why | What To Do | |--------------|----------------------------|-----|------------| | Inventory turns ↑ | Days on hand ↓ | Mathematical inverses — 365/days-on-hand ≈ annualized turns for perishable cycles | Pick one as the primary per-category KPI; don't measure both or you'll argue math | | Sell-through rate ↑ (early) | Dead-stock risk ↓ | Early sell-through identification lets markdowns fire at yellow (day 90) instead of red (day 180) | Weekly aging + week-2 sell-through review, not monthly | | Menu velocity ↑ (cull slow SKUs) | Assortment breadth ↓ | Fewer SKUs = less choice for shoppers; can hurt basket-size and new-customer conversion | Anchor-vs-niche tiering: keep breadth in niche rotation, concentrate velocity in anchors | | Shrinkage ↓ | Labor hours ↑ | Cycle counts, tare training, camera review all cost time | Bundle cycle counts into existing shift schedules (30 min/shift vs full-store close) | | Compliance adherence ↑ | Labor hours ↑ (no inventory-side trade) | Pure cost center; cannot sacrifice compliance for inventory velocity | Bundle Metrc close into end-of-day checklist — see compliance-metrc.md | | Sell-through ↑ (aggressive markdowns) | Margin ↓ | Fast markdowns clear product but compress per-unit contribution | See pricing.md for the saturation → discount → margin dynamic | | Inventory turns ↑ (faster reorder) | Stockout risk ↑ | Tighter pars mean less buffer for demand spikes | Couple par tightening with reorder-trigger buying, not calendar-buying |

Primary interaction effect for new operators: the sell-through ↑ ↔ margin ↓ trade. Saturated markets compress this tradeoff because pricing is already pressured — cross-reference pricing.md for the full saturation dynamic.


Dead Stock Aging Thresholds (detailed callout)

New operators routinely apply generic-retail "obsolete after 12 months" thinking to perishable flower and lose 30%+ of inventory value to expiry. The 90 / 120 / 180 day flower thresholds are NOT arbitrary — they trace the cannabinoid and terpene degradation curves observed in Treez operator network testing data (2025-2026).

Thresholds (flower baseline; see table under Dead Stock Thresholds KPI above for non-flower):

  • Day 90 — yellow — pricing / promotion review. Terpenes have degraded ~25%; THC is still close to label. This is the first-ping intervention point.
  • Day 120 — orange — markdown (10–20%) or B2B loss-out. Terpenes approaching 40–50% loss; noticeable quality perception decline in taste tests. The margin-preserving action here is B2B loss-out, not a deeper in-store markdown.
  • Day 180 — red — destroy or wholesale-loss-out. Terpenes at or below 50% of harvest; THC starting to measurably drop. Selling at this aging level risks repeat-customer-trust damage that exceeds the cost recovery.

These are PRACTITIONER thresholds based on degradation curves, not regulatory limits. State-specific expiration rules (where they exist) override these — see compliance-metrc.md for the 6-state regulator survey (CA / CO / MI / IL / FL / NY) covering stamped-expiration, package-life, and extract-shelf requirements.

For non-flower (vapes, edibles, concentrates), shelf life is longer but state-specific expiration rules are more often codified (especially edibles). Cross-link to compliance-metrc.md for state expiration tables; do not restate here.


Cross-References

  • pricing.md — Market maturity tier definitions (Saturated / Mature / Emerging / New-Medical-only) per D-12; saturation → discount-pressure → compressed-turns relationship; margin-vs-sell-through tradeoff dynamics.
  • retail-strategy.md — Store-format definitions (single-store independent, small chain, MSO / large chain, delivery-only) per D-12; used as segmentation axis in Shrinkage % and Compliance Adherence Rate benchmarks.
  • sales-kpis.md — Canonical Business Stage Ladder (D-16); inventory-side slice extracted in the "Business Stage Ladder Cross-Reference" section above but NOT restated here.
  • financial-kpis.md — KPI-03 financial metrics; note especially the margin × inventory-turns interaction (high turns at low margin vs low turns at high margin both yield similar contribution dollars).
  • customer-kpis.md — KPI-04 customer metrics; new-vs-repeat ratio and retention KPIs interact with menu-velocity (repeat customers drive anchor-SKU velocity).
  • inventory-planning.md — Par levels, reorder points, demand forecasting frameworks; consumed by Inventory Turns and Days on Hand improvement levers.
  • compliance-metrc.md — Metrc audit cadence (monthly / quarterly / annual), the 4 manifest types (incoming / outgoing / transfers / adjustments), state-specific expiration rules (CA / CO / MI / IL / FL / NY). Cross-linked from Compliance Adherence Rate KPI and Dead Stock Aging Thresholds callout.
  • cross-retail/menu-engineering.md — QSR / fast-casual menu engineering analog; anchor-vs-niche tiering framework consumed by Menu Velocity by Category improvement levers.
  • QUERY_PATTERNS.md — Treez sales_monthly + inventory query patterns; cited in every 📊 Treez data callout above.
  • .planning/phases/26-dispensary-kpis-metrics/validate.sh — Assertion contract this file satisfies.