Store IntelYesterday = last complete day (today is partial, excluded). Day deltas vs the same weekday last week; week figures are rolling 7-day windows. Action impacts are heuristic magnitudes for prioritization. Refreshed nightly.
Green — demand curve: as price rises, units sold fall.
Blue — revenue (P×Q): peaks at the revenue-maximizing price. Drag the slider left/right to find it.
Amber dot — your current average effective price (baseline). KPIs show Δ from here.
Purple dashed — gross margin (if cost data available). Red dashed = unit cost floor.
β (elasticity) key:
Curves fitted from actual Dutchie transaction data (log-log OLS with day-of-week controls, last 90 days). ★ = statistically significant (p<.10). Indeterminate high-rev SKUs need a controlled A/B price test to learn their true elasticity.
python3 pricing_engine.py then python3 analyze.py to generate pricing exceptions.
AOV Δ / IPT Δ are vs the store baseline. Incrementality caveat: margin assumes the sale happens anyway — A/B a promo (hold a control) to measure true lift.
Actuals = When I Work clock-ins; schedule = published shifts (variance vs clocking staff only — salaried/non-clocking managers excluded). "Staffing vs Demand" redistributes the same labor budget to match each hour's sales share. Hours 9a–9p + post-close cleanup; empty = closed.
Layers live: sales · COGS · gross margin · labor · post-labor margin. Awaiting your monthly rent figure and QBO Production approval to add layers 4 (rent) and 5 (operating expenses) → full daily P&L.
GM% here uses the line-level convention (net of discount) and may differ slightly from the P&L tab. Inventory at the latest snapshot; COGS/GM over the trailing 90 days. On-order (committed) capital is unavailable — Dutchie's open-PO feed is empty — so received-inventory run-rate is shown as a proxy.
python3 analyze.py (needs inventory, 28-day sales, and the nearby-competitor scrape).
Reorder costs use your landed cost (live or historical); expand costs estimate wholesale at ~55% of nearby shelf price. Trim "recoverable" assumes a ~50% markdown to move dead stock. Suggested qty targets ~4 weeks of cover (reorder) or a starter buy scaled by peer count (expand). Vendor is your most recent supplier for that brand. New arrivals (<60d on shelf) may appear in Trim — sanity-check before liquidating. Full line-by-line sheet: smart_buylist_<date>.csv.
python3 par_levels.py then python3 analyze.py.
Par = min(demand over lead+review + safety stock, demand × max-days-cover). Safety stock = z·σ·√(lead), z from the category service level. Velocity & variability from trailing 28 days (returns netted). Below-par SKUs overlap the Buy List's Reorder section — par levels are the standing policy that makes reordering automatic. Full set: par_levels_<date>.csv.
Cohort: Bloc, New Era, Rush Budz, Sensory, SilverLeaf, Somerset Green, Unity Rd, Valley Wellness. Brand names normalized across stores (casing/diacritics). Top NJ analytics is brand-level NJ-wide aggregate — we do not have per-store SKUs for the top 25 non-MSO stores, so the "demand" view is our proxy for their assortment.
ROIC v1 is directionally correct. Precision improves as you (1) update owner_equity_contributed_lifetime to the full owner cap-stack, (2) enter all loans via debt_dashboard add-loan, (3) connect QBO Production for true AP/AR + opex line-items. The 280E logic is correct — federal tax applies to gross profit, state tax to operating income.
Sources: competitor_promos populated nightly by promo_sync.py (Firecrawl scrape of each store's Dutchie specials page or homepage). 8 stores, classified into storewide / themed-day / brand / bundle / clearance / loyalty / other. Brand attribution is best-effort from title regex.
Individual: 2.5→$40 · 2.75→$60 · 3.0→$80 | Storewide (stacks): 2.5→+$20/ea · 2.75→+$35 · 3.0→+$50. Eligibility: 50+ tickets/week. Names shown as initials.
The +39% customer-traffic gap is the entire growth story. This tab tracks how the new customers actually arrive — promos, sources, geography, and whether they come back. 1st-visit AOV ÷ returning AOV tells us if we hook them.