Retail analytics for licensed cannabis operators

Power BI Dashboard for Cannabis Dispensary Operators: METRC, 280E and Strain-Level Margin

We join your point-of-sale, the state traceability system and your ledger into one governed model — sales by store, daypart and budtender, margin by category, brand and strain, package-tag reconciliation, and cost of goods sold kept separate from the expense the tax code will not let you deduct.

  • Microsoft-certified
  • Hours never expire
  • 3–5 day turnaround
  • No project minimums
  • You own everything
Revenue Overview Revenue$4.2M Margin38% Orders12.4k Churn2.1% Monthly performance By segment 64%

Representative dashboard — sample data

Three systems, three versions of the truth

Your till knows the day. The state knows the plant. Neither one knows your gross profit

A licensed retailer runs on at least three records of the same transaction. The point of sale knows what was rung up, at what discount, by whom. The state traceability system knows which tagged package that product came out of and what weight left the building. The ledger knows what you paid the distributor and what the excise and local taxes took off the top. Every one of them is authoritative about something, and none of them will answer the question the owner asks on Monday: which brands, categories and strains actually made money last week, and which store gave the margin away at the counter.

That is a modeling problem, not a reporting problem, and it is why generic retail analytics does not transfer cleanly. The grain is a package tag rather than a SKU. Revenue has statutory taxes stacked inside the ticket total that have to come out before margin means anything. And the profit line that matters to your tax position is not operating income — it is gross profit, because federal law treats almost everything below it as non-deductible.

The line that changes everything

Gross profit is the number with tax consequences

IRS guidance states that a dispensary “may not deduct, for example, advertising or selling expenses” but “may… reduce its gross receipts by its cost of goods sold, as calculated pursuant to Internal Revenue Code section 471.” A report that blurs COGS and operating spend is not just untidy — it hides the only margin the code recognizes.

Try us risk-free for 4 hours

Buy a block of prepaid Flex hours and, if you're unhappy within the first 4 hours, we refund you in full — no questions asked. Hours are deducted only for work you've reviewed and approved, there's no project minimum, and your banked hours never expire.

Screens a retail operator opens every week

Six views built for a licensed storefront, not a generic shop

Each one is tied to a decision — reorder, re-price, coach, or correct a record before the state does.

Sales by store, daypart and budtender

Net sales with excise and local cannabis tax stripped out, trended by store, day of week and hour, then broken to the individual budtender and register — so a slow Tuesday and a slow shift stop being the same finding.

Margin by category, brand and strain

Gross profit down to the individual strain and package, rolled up to flower, pre-rolls, vape, concentrates, edibles and accessories, with brand and distributor beside it — the view that decides the next purchase order.

METRC and POS reconciliation

Package-tag level comparison of what the till sold against what the traceability system recorded, with receipts, adjustments, waste and destruction in the same view — variances surfaced as a worklist, not discovered during an audit.

280E-aware profit reporting

Cost of goods sold reported apart from the selling, general and administrative spend the code disallows, so gross profit — the number your effective tax rate is built on — is visible monthly rather than reconstructed at year end.

Purchase-limit exception reporting

Per-transaction checks against your state's daily purchase limits, with medical and adult-use rules applied separately, plus same-customer same-day splitting across registers or stores flagged for review.

Discount, loyalty and mix leakage

Stacked discounts, loyalty redemptions, employee purchases and medical versus adult-use mix priced against full menu — showing where the posted margin and the realized margin separate, by store and by person applying the discount.

What should a dispensary report measure that a shop report does not?

A storefront selling regulated product carries measures that no general merchandise report needs, and they only hold up if each one has a single agreed definition. We fix those definitions with you before a visual is drawn — whether excise tax sits inside net sales, whether a loyalty redemption is a discount or a cost, whether in-store waste is shrink or compliance — then implement them as governed DAX measures (opens in new tab) so the same number survives being sliced by store, brand and month.

  • Net sales after statutory tax — excise, local cannabis business tax and sales tax unstacked from the ticket total, so revenue and margin are not quietly inflated by money you are only holding.
  • Gross profit by package tag — landed cost carried at the tag rather than the SKU, because two packages of the same strain from the same brand rarely cost the same.
  • Traceability variance — POS units and weight against the quantity reported to the state, per tag, with reason codes for adjustment, waste, destruction and return.
  • Budtender contribution — net sales per hour worked, discount rate applied, and attach on pre-rolls and accessories, so coaching rests on the same figures every shift lead can see.
  • Package aging against test and expiry dates — days held per tag measured against the lab test date and any state shelf-life rule, ranked by capital at risk rather than by unit count.
  • Deli weight variance — the difference between weight rung and weight deducted on loose flower, which is where a lot of untracked loss quietly lives.

Why do METRC and your point of sale never quite agree?

Because they are recording two different events. The POS records a sale; the traceability system records the movement of a tagged package. Most states require retail sales to reach that system either through a certified POS integration or by manual entry, and every place the two are joined by a human is a place they can drift. The usual culprits are manual receipts on a busy transfer day, returns and voids handled on one side only, in-store sampling and destruction logged late, repackaging or tag splitting that breaks the link between the old tag and the new one, and rounding on partial-gram sales.

None of that is exotic. It becomes a problem only when nobody sees it until a compliance review, by which point the variance is thousands of rows old. We model the traceability extract and the POS extract as separate fact tables on a shared package and date dimension — a plain star schema (opens in new tab) — and let the report do the comparison every night. Metrc is the traceability system in most licensed states, and where your state runs BioTrack or its own platform instead, the same reconciliation holds with different field names.

Three systems of record, and what each one is actually authoritative for
System Authoritative for Where it misleads on its own
Dispensary POS Ticket detail, discounts, loyalty, budtender, register, tender type and time of day Shows gross ticket revenue including taxes collected, and rarely carries true landed cost per package
State traceability (Metrc or equivalent) Package tags, transfer manifests, quantities on hand, adjustments, waste and destruction Knows weight and units, not money — and reflects what was reported, which is not always what happened
Accounting ledger Invoiced product cost, tax remittance, operating expense and the COGS classification Posts at month level and by account, so it cannot tell you which strain or store the margin came from

Why 280E is a reporting problem before it is a tax problem

Section 280E of the Internal Revenue Code disallows deductions and credits for a trade or business trafficking in a Schedule I or II controlled substance. The IRS is explicit in its cannabis industry guidance (opens in new tab) that a dispensary may not deduct selling or advertising expense, but may reduce gross receipts by cost of goods sold as calculated under section 471. For a retailer buying finished product, that generally means the invoice price of goods plus the costs necessary to acquire and bring them in — a narrower set than most operators assume, and narrower than a cultivator's.

We are not tax advisers and we do not decide what belongs above the line. What we build is the reporting that makes your CPA's classification visible all year instead of at filing: an account mapping that keeps COGS and disallowed expense apart, gross profit trended monthly by store, and an operating view alongside it so you can still run the business on numbers that include rent and payroll. The two are shown as two measures, never averaged into one.

How a 280E-aware dispensary report separates the lines
Line Examples How the dashboard treats it
Gross receipts Retail sales, net of excise and local cannabis tax collected on the state's behalf Reported as net sales; tax collected is tracked as a liability view, not revenue
Cost of goods sold Invoice cost of product and the costs necessary to acquire it, per your CPA's section 471 method Carried at package-tag grain so gross profit can be cut by strain, brand, category and store
Below-the-line expense Advertising, selling expense, most payroll, rent, professional fees Reported separately and clearly labeled as disallowed, so operating income is never mistaken for taxable profit
Non-plant-touching lines Accessories, apparel and other merchandise your accountant treats outside the restriction Split in the model as its own reporting segment rather than blended into the cannabis mix

This page describes how we build reporting, not tax advice. How your business applies section 280E and section 471 is a decision for your CPA or tax counsel; we implement the classification they give us.

Which dispensary systems do you connect, and how?

The retail software layer in this industry is fragmented, and a page that promised one tidy connector for all of it would be lying. What varies is the route in — an API, a vendor reporting warehouse, or a scheduled export — and that choice drives refresh cadence more than anything else in the build. We confirm the route in scoping, against your plan and contract, before we quote hours.

Data sources behind a dispensary dashboard and the usual route in
Source What we take from it Typical route
Dispensary POS
(Dutchie, Flowhub, Treez, Cova, BLAZE)
Ticket and line detail, discounts and loyalty, budtender and register, customer type, product and package identifiers Vendor API or reporting warehouse where the plan exposes one; scheduled export where it does not
State traceability system
(Metrc, BioTrack or state equivalent)
Package tags and lineage, transfer manifests, on-hand quantities, adjustments, waste and destruction, reported sales The state system's API, which typically requires both a software vendor key and a per-user key issued to your license
Ecommerce and menu platforms Online order, pickup and delivery volume, menu availability and out-of-stock exposure Platform API or export, joined to the POS ticket so an online order is not double counted
Accounting ledger
(QuickBooks, Sage Intacct, NetSuite)
Invoiced product cost, COGS mapping, operating expense, tax remittance, entity and license structure Native connector or ledger export, joined on store, entity and account
On-premises or self-hosted databases Any of the above hosted on your own hardware or a private instance The on-premises data gateway (opens in new tab) with scheduled refresh (opens in new tab)

Where a vendor offers exports only, we say so plainly and design around the cadence that gives — usually an overnight refresh, which is fine for margin and reconciliation work. We do not promise live figures where the source cannot supply them.

Budtender reporting that coaches instead of ranking

Counter performance is the most requested view and the easiest one to get wrong. A raw sales leaderboard rewards whoever worked the Friday evening rush and punishes whoever opened on a Tuesday, and in a regulated setting it can push behaviour you do not want. We normalize to net sales per hour worked, show discount rate applied beside it, and put attach on pre-rolls and accessories next to both, so a conversation about performance starts from comparable ground.

The same view answers a compliance question. Discount authority, employee purchase activity and voids by operator all belong on one page with the manager who approved them, because that is the pattern a state inspector or an internal auditor will ask about, and it is far easier to explain when you already look at it monthly.

Several storefronts, one license structure, and who sees what

Once you run more than one store, comparison becomes the point and access becomes the constraint. Store managers should see their own counter, their own aging packages and their own budtenders without browsing another location's margin. We implement that with row-level security (opens in new tab) mapped to your license and location hierarchy, so one report serves the whole operation and opening a storefront is a row in a table rather than a redevelopment.

Multi-entity structures need care in the model rather than in the visuals. Separate licenses, separate legal entities and separate ledgers are common, and a roll-up that ignores them produces a consolidated number nobody can tie back. We keep entity as a real dimension so store, license and legal entity can each be the grain of a page.

What does it cost, and how fast?

You buy prepaid Flex hours that never expire. Starter is 20 hours ($2,500), Growth 40 hours ($4,600) and Power 80 hours ($8,000), with senior hourly work from $100. A first build covering sales and margin, traceability reconciliation and the above-the-line split typically fits inside one block, and most tasks ship within 3–5 business days of your approving the scope estimate.

There is no project minimum. Every request is scoped and priced in hours before work starts, hours deduct only for work you approve, and unused hours stay banked. See how prepaid Flex hours work, or what a typical custom Power BI dashboard development engagement includes.

Who is this for?

Owners, general managers and controllers at licensed retailers — a single storefront, a small chain across one state's licenses, or a vertically integrated operator whose retail arm needs its own numbers. The common thread is a business large enough that category and strain economics stop being obvious from the till, and a head count too small to justify a full-time analyst. Whether you serve medical patients, adult-use customers or both changes the limit rules and the pricing tiers, not the model.

Dashboards we build for dispensaries

  • Sales by store, daypart & budtender
  • Margin by category, brand & strain
  • METRC vs POS variance worklist
  • COGS split for 280E reporting
  • Purchase-limit exception report
  • Store scorecards with row-level security
3–5

business days, typical

Prepaid

hours, never expire

You

own everything

A first build usually fits inside one Flex block, and hours deduct only for work you approve. See Flex pricing →

How it works

From two systems that disagree to one view you can defend

  1. 1

    Scope & connect

    On a free demo we walk your licenses, stores, POS platform and state traceability system, and agree the definitions — what sits inside net sales, what counts as COGS, how waste is classified. You send the request, we reply with the hours it needs, and once you approve we confirm each connection route before building.

  2. 2

    Build & validate

    We model the POS and traceability extracts on a shared package and date dimension, write the DAX for net sales, gross profit, variance and limit checks, then reconcile against your own reports package by package on a sample until the numbers are ones you would hand an auditor.

  3. 3

    Launch & hand over

    We publish to your Microsoft tenant, set scheduled refresh and row-level security by store and entity, and train the managers who will use it. The report, the model and the credentials are yours at handover, with optional ongoing support from the same block of hours.

Representative perspective

We could tell you revenue to the dollar and could not tell you gross profit by brand without a week of spreadsheet work. Seeing margin at the package level changed which distributors we kept buying from.
Owner, single-state cannabis retailer

Representative perspective

The reconciliation used to be a monthly panic. Now the variances show up as a short list the next morning with a reason next to each tag, and most of them are fixed before anyone else notices.
Compliance manager, multi-store dispensary group

See which brands, strains and shifts actually make you money

Book a free demo. We'll map your stores, POS and traceability system, then scope the build and tell you the hours it needs before any work begins — and your prepaid hours never expire.

Where this sits next to our other work

Regulated retail borrows from several neighboring pages without being any of them. The general merchandise questions — SKU performance, basket behaviour, sell-through and inventory turns across stores and channels — are owned by Power BI for retail sales dashboards, and nothing on this page restates them; what is here is the traceability, tax and counter-compliance layer that sits on top. If your stores are independently owned under one brand, with royalty, ad-fund and per-owner data separation to handle, the multi-rooftop build is covered on Power BI dashboards for franchise owners instead.

Two more adjacencies come up often. Operators holding a distribution license alongside retail, moving product to other storefronts rather than only selling it, will find the wholesale half of the picture on Power BI for wholesale distributors. And if an outsourced controller or advisory practice prepares your monthly pack, the repeatable-model approach they use across a client portfolio is described on Power BI for fractional CFOs — which is often the fastest way to get the 280E account mapping settled before we build anything.

For the mechanics of delivery — the model, the DAX, the report layout and the handover — see Power BI dashboard development, and how prepaid Flex hours work for pricing. Every task is scoped before work begins from your block of senior-led hours: no project minimums, no surprise invoices, and hours deducted only for work you approve. Contact is form-only — send your request and we'll reply with a scope estimate.

Why it's low-risk

Prepaid hours, you own everything

Every task is scoped and approved before work starts, with hours deducted only for approved work — and at handover the report, model and credentials are yours, inside your own Microsoft tenant. Hours never expire, and there's a full refund within your first 4 hours.

FAQ

Questions from dispensary owners and compliance managers

We model both sides at package-tag grain and compare them: units and weight sold in the POS against sales reported in the traceability system, plus receipts from transfer manifests, adjustments, waste and destruction. The report shows the variance per tag with a reason, so your compliance lead works a short exception list instead of reading two systems side by side.

Yes, if your chart of accounts already draws that line. The IRS position is that a dispensary cannot deduct selling or advertising expense but may reduce gross receipts by cost of goods sold under section 471. We report gross profit and below-the-line spend separately all year. Your CPA owns the classification; we implement it faithfully.

We work with the platforms dispensaries actually run, including Dutchie, Flowhub, Treez, Cova and BLAZE, plus the state traceability system and your accounting ledger. What each vendor exposes — an API, a reporting warehouse, or scheduled exports — varies by platform and plan, so we confirm the route during scoping and tell you plainly if it is export-only.

Yes. We apply row-level security so a store manager opens the same report and sees only their own location's sales, inventory and budtender detail, while ownership sees every store. Roles map to your existing license and location hierarchy, so opening a new storefront is a row in a table rather than a rebuilt report.

You buy prepaid Flex hours that never expire: Starter 20 hours at $2,500, Growth 40 hours at $4,600, Power 80 hours at $8,000, with senior hourly work from $100. A first build covering sales, margin, traceability reconciliation and the 280E split usually fits inside one block, and most tasks ship in 3–5 business days after you approve the scope.

Book a free demo

Get senior Power BI help, on demand

Tell us the task. We scope it, you approve, and a senior consultant delivers — typically in 3–5 business days. Prepaid hours that never expire.

  • Prepaid hours from $100/hour — and they never expire
  • Senior-led delivery — 20+ years on the Microsoft platform
  • Typical 3–5 business day turnaround
  • Full refund if you’re unhappy in your first 4 hours

The fastest way to reach us is the form — tell us the task and we'll reply within one business day.

All fields are required.

We reply within one business day. No newsletters, no drip campaigns.

Book a Free Demo