At a glance
Where the market is heading
Minnesota runs two channels through one reporting perimeter. OCM's Retail Sales tab describes it as a dual supply chain, with product grown and designated either for the general public or for medical patients, and licence holders required to track every sale in Metrc. Both lines below are OCM's own monthly rows; the total is their sum, because OCM publishes no statewide roll-up at monthly grain.
Monthly retail sales by channel
Tribal retail is not in here. OCM states on the dashboard's Overview tab that it does not include Tribal sales, and tribal adult-use retail has operated in Minnesota outside that perimeter. What this page shows is state-licensed retail; the difference between that and the whole Minnesota market is not published by anyone, which matters most when Minnesota is set beside a state with no sovereign carve-out. The state file carries the full statement and every caveat that rests on it.
The adult-use line starts where the channel does. Months before state-licensed adult-use retail existed are drawn as gaps, not as zeros: there was no channel to sell nothing in. The state file records the reason on every one of them.
These months revise. OCM says its figures are preliminary and subject to changes or correction, and the query returns the whole history on every call, so this page rebuilds rather than appends and a month can move after it is first published.
Medical and adult-use
OCM reports retail dollars under two markets. Its Retail Sales tab describes a dual supply chain, with cannabis product grown and designated for use either by the general public or by medical patients. What that designation settles, and what it does not, is stated in the comparability note for the medical/adult-use split in the method section below.
Retail dollars by channel
What is selling
OCM splits retail into six product categories. Five of them are here. The sixth, Plants, is left off this chart because OCM publishes a Plants row for one market only and not in every month, so a bar summed over whatever months happen to carry one would invite a comparison with the five continuous categories that the data does not support. It is in the data file, with every month OCM omits marked as an omission rather than as no sales.
Retail sales by product category
How many transactions
OCM publishes a transaction count beside each month's dollars. It does not define the event it is counting, so this is shown as its own measure rather than divided into the dollars to produce a basket size.
Monthly transactions by channel
Where these figures come from
Sourcing, basis and comparabilityOCM runs one Metrc-backed reporting perimeter over two channels. Its Retail Sales tab puts it plainly: "Minnesota has a dual supply chain model, with cannabis product being clearly grown and designated for use by either the general public (under the adult-use category) or medical patients." Minnesota's figures cover state-licensed retail only. OCM states on the Cannabis Market Monitor's Overview tab that "This dashboard does NOT include Tribal sales or data related to the cultivation, production, or sale of hemp or hemp-derived intoxicating products", and tribal adult-use retail has operated in Minnesota outside that perimeter, so every Minnesota total here understates what was sold in the state by an amount nobody publishes.
Basis — OCM Cannabis Market Monitor, Metrc-derived retail, state-licensed only
- Measurement
- measured
- Money
- unstated
- Tax
- unstated
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide_excl_tribal
- Channels
- medical, adult_use
The regulator's own words: OCM's Retail Sales tab states "License holders are required to track all sales in Metrc, the state's seed-to-sale tracking system. This dashboard presents aggregated sales data." and the Overview tab states "This dashboard does NOT include Tribal sales or data related to the cultivation, production, or sale of hemp or hemp-derived intoxicating products."
Why an axis above reads unstated: money and tax are unstated, and that is a checked negative rather than an omission. Every textbox run in the report was read on this run - the extraction stamp, the preliminary-and-trailing-cadence banner, the dual-supply-chain note, the Metrc note, the TTM definition, the product-category glossary and the Overview's tax instruction. The only money basis OCM states anywhere is for the PRICE figure, where the Product Sales tab prints "*Trailing Twelve Months (TTM) price is calculated before taxes". It says nothing corresponding about the sales dollars, so the flag stays unstated rather than borrowing the price footnote. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — OCM trailing-twelve-month median retail price per gram of flower
- Measurement
- measured
- Money
- unstated
- Tax
- excl
- Period
- rolling_window
- Scope
- retail_only
- Geography
- statewide_excl_tribal
- Channels
- medical, adult_use
The regulator's own words: The Product Sales tab footnotes the figure "*Trailing Twelve Months (TTM) price is calculated before taxes", and the Overview glossary defines the basket: "Flower - Includes cannabis flower regardless of the packaged size." against "Shake/trim - Includes products such as cannabis shake/trim or raw cannabis prerolls.", so shake, trim and raw pre-rolls sit in a different category from the flower this price is quoted on.
Why an axis above reads unstated: money is unstated: the footnote settles tax and says nothing about discounts, and no other run in the report mentions gross, net or discount. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — OCM licence counts, as at the report's extraction date
- Measurement
- measured
- Money
- not_applicable
- Tax
- not_applicable
- Period
- point_in_time
- Scope
- unstated
- Geography
- statewide_excl_tribal
- Channels
- medical, adult_use
The regulator's own words: The Licenses tab distinguishes the two units in terms: "There are differences between a licensed cannabis business and a licensed business site."
Why an axis above reads unstated: scope is unstated: OCM does not say whether a licence counted here is one that is merely issued or one that is operating, and no run in the report addresses surrender or expiry. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Sources 2
| Role | Source | Format | From | Last verified | Note |
|---|---|---|---|---|---|
| Canonical | OCM Cannabis Market Monitor - Power BI public querydata API Minnesota Office of Cannabis Management | json_api | 2022-10 | 2026-09-04 | The dashboard page itself is unfetchable by a cron: every mn.gov *.jsp route redirects to validate.perfdrive.com and returns a Radware bot-manager CAPTCHA under a success status. The Power BI Gov host behind the embed has no such gate and answers unauthenticated with the public report GUID in a header. modelId, DatasetId and ReportId are read out of modelsAndExploration on every run because they rotate when OCM republishes the report. |
| Cross-check | OCM licensed-business roster (XLSX) Minnesota Office of Cannabis Management | xlsx | 2026-08-10 | 2026-08-17 | Never averaged with the canonical figure. Counts SITES where the dashboard counts BUSINESSES, and its own Summary sheet disagrees with its own detail sheet - the Summary prints zero for three licence types the detail sheet lists rows for, and omits a fourth type entirely. It is captured daily by the estate archiver and read by a human, not joined to anything here. |
Why each marker above says what it says
| Metric | Marker | Why |
|---|---|---|
| Retail sales | Partly comparable | Minnesota's figures cover state-licensed retail only. OCM states on the Cannabis Market Monitor's Overview tab that "This dashboard does NOT include Tribal sales or data related to the cultivation, production, or sale of hemp or hemp-derived intoxicating products", and tribal adult-use retail has operated in Minnesota outside that perimeter, so every Minnesota total here understates what was sold in the state by an amount nobody publishes. |
| Medical / adult-use split | Partly comparable | The split is by the market a product was DESIGNATED for, not by who bought it. OCM describes the field in cultivation terms - its Retail Sales tab says "Minnesota has a dual supply chain model, with cannabis product being clearly grown and designated for use by either the general public (under the adult-use category) or medical patients." - and none of the words buyer, customer, purchaser, transaction, receipt appears in the report's textbox prose, every run of which is read on this run. That scope is OCM's written notes. Its displayed visual headings are read on the same run and are not covered by that negative, because one of them does use such a word. "Total transactions (TTM)" on the Retail Sales tab - a count of transactions is not a statement about who bought, and this page reports it as its own measure rather than as a channel attribution. That reading has an edge: 8 of the 24 non-textbox visuals set no title text at all and keep Power BI's own default label, which is not in the payload and so could not be read. So Minnesota's medical share is a share of product designation, and it is not like-for-like with a state whose share comes from a per-transaction customer flag. |
| Price per gram | Not like-for-like | OCM publishes one median retail price per gram of flower per market, over the trailing twelve months and nothing finer - $9.98 medical against $14.29 adult-use on this run. The source carries no time dimension for it, so Minnesota has no monthly price line, and a published median cannot share an axis with the derived means the other jurisdictions carry. Blocked until mn_price_no_series is resolved, whatever the status above says. |
| Per capita | Partly comparable | Every rate here divides a month by its own year's July-1 estimate. Minnesota's figures cover state-licensed retail only. OCM states on the Cannabis Market Monitor's Overview tab that "This dashboard does NOT include Tribal sales or data related to the cultivation, production, or sale of hemp or hemp-derived intoxicating products", and tribal adult-use retail has operated in Minnesota outside that perimeter, so every Minnesota total here understates what was sold in the state by an amount nobody publishes. Minnesota's resident denominator therefore sits under a numerator that excludes an entire licensed retail sector operating inside the state's borders, and the per-capita figure is understated by that much. |
| Patient counts | Not like-for-like | Minnesota's active patient count is published only on a weekly OCM page behind a Radware bot gate, as a point-in-time figure with no history. DECISIONS Q8 rules that out of automation, so this pipeline ships no patient field at all rather than a number it cannot re-fetch. Blocked until mn_patients_bot_gated is resolved, whatever the status above says. |
| Licence counts | Partly comparable | The licence total is a snapshot value rather than a series field: OCM publishes no licence history, so there is no grain to declare and nothing joins on a time axis. OCM counts licensed BUSINESSES there, and counts licensed business SITES in a separate table - a microbusiness with cultivation, manufacturing and retail sites is one of the former and three of the latter. Both are carried, labelled, and neither is a facility count of the kind states with a single-site licence issue. |
| Tax revenue | Not like-for-like | Minnesota publishes no cannabis tax collections series. The Department of Revenue's reports-and-studies index carries none, and OCM instructs readers not to derive one from this dashboard: "This dashboard should NOT be used to calculate approximate tax revenue generated from the cannabis taxes or the total amount of intoxicating-cannabinoid products sold in Minnesota." That instruction is asserted present on every run, so this reason cannot outlive the sentence it rests on. Blocked until mn_no_tax_series is resolved, whatever the status above says. |
What is checked on every run 4
| Check | Kind | Last result |
|---|---|---|
| OCM publishes a per-category breakdown in a different entity from its market totals. This sums the categories per market-month and checks them against the total. | identity | 57 market-months checked across 6 product categories; the largest residual between the sum of OCM's category rows and its own market total is $0.00. OCM's Power BI omits a product-category row entirely where a market sold none of that category in a month, rather than publishing a zero. 49 of the 342 market-month-category cells are omitted that way. They are drawn as gaps, not zeros - what bounds them is that the categories OCM does publish sum to its own market total to within $0.00 across every market-month. |
| OCM publishes its own trailing-twelve-month totals. The estate rule is to sum the rows and treat the regulator's roll-up as a check on that sum, never as the figure. | identity | OCM's own trailing-twelve-month totals reconcile against the sum of the last 12 months of the monthly series to within $0.00 and 0 transactions. The two are different entities in the same model, so this is a decomposition check rather than an independent measurement. |
| The licence-issuance ticker carries both a per-date count and a cumulative column, and two other entities carry the same total by a different cut. | identity | The licence-issuance ticker's cumulative column reproduces its own running sum across 181 issuance dates and ends at 355 - the same total the licence-type table sums to, and the same total the social-equity split sums to. |
| Whether the published price per gram can be independently reproduced from anything else the report publishes. | unchecked | Not cross-checked. Nothing published alongside the price can check it. Dividing the trailing-twelve-month flower dollars by OCM's own flower-ounce figures gives $13.29 per gram adult-use against a published mean of $14.27, and $8.78 against $10.35 medical - a divergence of up to 15.1%. The two entities are therefore measured over different populations, and a quotient of them would be an invented number rather than a check. |
The regulator's own notes, and what is still open
The regulator's own notes
This dashboard does NOT include Tribal sales or data related to the cultivation, production, or sale of hemp or hemp-derived intoxicating products.
— OCM Cannabis Market Monitor, Overview tab
Cannabis Market Monitor data are preliminary and subject to changes or correction. Data are updated monthly on a 30-day trailing basis.
— OCM Cannabis Market Monitor, banner on every tab
This dashboard should NOT be used to calculate approximate tax revenue generated from the cannabis taxes or the total amount of intoxicating-cannabinoid products sold in Minnesota.
— OCM Cannabis Market Monitor, Overview tab
*Trailing Twelve Months (TTM) price is calculated before taxes
— OCM Cannabis Market Monitor, Product Sales tab
Flower - Includes cannabis flower regardless of the packaged size. Shake/trim - Includes products such as cannabis shake/trim or raw cannabis prerolls.
— OCM Cannabis Market Monitor, Overview tab glossary
Open questions on this data
Unresolved definitional questions that gate something. Listed because a question nobody can see is a question nobody closes.
- Does OCM publish, or will it publish, a price per gram with a time dimension? The entity behind the figure returns one row per market and no period column. Blocks: price_per_gram. Closing it needs: Re-read the conceptual schema for a period column on the price entity, or ask OCM.
- Can Minnesota's active patient count be obtained without defeating a bot-management product? Blocks: patient_counts. Closing it needs: Ask OCM for a machine-readable registry series, or record the weekly figure manually. DECISIONS Q8 forbids automating around the gate.
- Does any Minnesota agency publish cannabis tax collections? Blocks: tax_revenue. Closing it needs: Re-check the Department of Revenue's reports-and-studies index, or file a records request.