At a glance
Where the market is heading
Gross is what the products rang up at. Net is what was actually paid after discounts. Utah publishes both, and the gap between the lines is the whole story: discounts were 0.2% of gross in March 2020 and are now around a quarter of it.
Monthly sales, gross and net
Gross is the headline here. That is the estate standard wherever a state separates the two, and it is the figure the cross-state chart uses — but it is a choice worth about 24%, so net is drawn beside it rather than hidden behind it.
Utah's own arithmetic does not quite close: net runs up to $8,300 above gross minus discounts. All three columns are rounded to the nearest hundred, so rounding accounts for at most $100 of that. The difference is real, unexplained by the source, and logged as an open question rather than smoothed away.
What is selling
These are the Center for Medical Cannabis's own six categories. They do not add up to the sales figures above, and they are not meant to: the $3 state fee is excluded from them by the source's own note, and they are rounded to the nearest thousand where the sales table is rounded to the nearest hundred. Across every month they land 1.2% to 2.9% under net. Concentrate is mostly a gap, not a zero — Utah omits the row entirely for 37 of the 77 months rather than printing a nought, so those months say nothing about whether concentrate sold. The eight months where Utah does print a zero are drawn as zeros.
Net sales by product category
How the orders arrive
Two fulfilment routes Utah reports separately: orders placed online and collected at a pharmacy, and orders delivered. Together they are under a quarter of the market — walk-in purchases are not broken out anywhere — so these are a slice of the total and never a total themselves. Deliveries were not reported before January 2021, and the pickups table skips July to December 2020 entirely; both are drawn as gaps. Two early pickup months print an order count of 0 beside a positive dollar total — that is Utah's rounding grain, not a month with no orders, so it is a gap too.
Order value by route
Orders by route
The patient register
Utah publishes no monthly count of active patients. What it publishes is the current active population sorted by the month each patient first joined it — so every historical figure is recomputed each release and legitimately changes. A number that goes down here is the source working as documented, not a collection fault.
Common questions
Why are there two sales lines?
Because Utah publishes two, and the difference is about a quarter of the number. Gross is the total the products rang up at; net is what patients paid after discounts. The headline figure on this site is gross, which is the standard applied to every state that separates them, and net is drawn alongside on its own basis. Neither is averaged with the other.
Do these figures include sales tax?
Utah does not say. The data package documents its rounding, its $3 state fee and its county suppression rule, and says nothing at all about tax — and that absence is a measured one, not a glance at the README. Every member of the archive is swept on every run: the README, all 15 CSVs in full including their bodies, and the extracted text of the 26-page report PDF, 223,103 characters in all, for thirteen tax terms with word boundaries. Zero hits, against four known-positive controls that do fire. Utah levies no cannabis excise, only ordinary sales tax, which makes it tempting to assume these figures sit below it. That assumption is not evidence, so the basis is recorded as unstated and the question is open with the regulator.
Why is there no price per gram?
Utah reports quantity in items, not weight. Divide flower dollars by flower items and you get about $55.77, which is the price of a package rather than of a gram. Turning that into a per-gram figure would need an assumed grams-per-package factor the source does not supply, so Utah is left off the cross-state price chart rather than estimated onto it.
Why do the patient numbers change between updates?
By design. Utah's patient counts are computed from patients' current status and dated by when each patient first activated, so a patient who lets a 2021 card lapse is removed from the 2021 figure. The README says so in as many words. The pipeline reloads the whole history every run for exactly this reason, and records the changes as notices rather than errors.
Is there any adult-use cannabis in Utah?
No. Utah has only ever licensed medical sales, which began in March 2020, and there is no adult-use channel to report. That makes the medical share here 100% by law rather than by behaviour, which is why Utah is grouped as a single-channel market rather than scored against states that have both.
How reliable is the headline figure?
Less cross-checked than some. Nothing else Utah publishes adds up to gross sales: the product categories exclude the state fee and are rounded more coarsely, and pickups and deliveries together cover under a quarter of the market. The patient snapshot is the opposite — three separate tables in the same package all land on the same number. Where a figure is checked, this site says so; where it is not, it says that too.
Where these figures come from
Sourcing, basis and comparabilityUtah runs a medical-only market. Proposition 2 passed in 2018 and was replaced by HB 3001 before it took effect; pharmacy sales began in March 2020. There is no adult-use channel. Two regulators split the programme: DHHS's Center for Medical Cannabis registers patients and providers, while the Department of Agriculture and Food licenses cultivators, processors and pharmacies. Utah levies no cannabis excise tax, so no cannabis tax-revenue series exists.
Basis — Gross retail sales, calendar month
- Measurement
- measured
- Money
- gross
- Tax
- unstated
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide
- Channels
- medical
- Rounding
- README: "Note that some dollar values and order counts are rounded to the nearest ten or hundred." Every dollar value in Sales Per Month.csv is in fact a multiple of 100, and every order count a multiple of 10.
The regulator's own words: README: "SALES PER MONTH: Quantity and value of items sold per month." The columns are headed Gross Sales, Total Discounts, Order Count and Net Sales.
Why an axis above reads unstated: The README documents the ICS source system, the rounding grain, the $3 state fee exclusion and the county suppression threshold, and says nothing about tax. Swept EVERY member of the archive -- the 4,847-byte README, all 15 CSVs in full (bodies as well as headers) and the extracted text of the 26-page monthly report PDF, 223,103 characters in total -- for 'tax', 'taxes', 'taxed', 'taxable', 'excise', 'before tax', 'after tax', 'inclusive', 'exclusive', 'net of tax', 'gross of tax', 'incl' and 'excl', all with word boundaries: zero hits. The same sweep's known-positive controls ($3 State fee x1, ICS x8, less than 20 orders x2, rounded to the nearest x1) all fire, so the zero is a measurement and not a broken regex. Utah levies no cannabis excise, only standard state and local sales tax, and whether these figures sit above or below it is not stated. Inferring it from general knowledge of Utah tax law is exactly what ANCHORS 6 forbids. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — Net retail sales after discounts, calendar month
- Measurement
- measured
- Money
- net_of_discounts
- Tax
- unstated
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide
- Channels
- medical
- Rounding
- Same nearest-hundred grain as gross. Note that rounding does NOT account for the whole gross-minus-discounts residual: all three columns are multiples of 100, so independent rounding can move the identity by at most $100, and the observed residual reaches $8,300 (2021-07).
Why an axis above reads unstated: The README documents the ICS source system, the rounding grain, the $3 state fee exclusion and the county suppression threshold, and says nothing about tax. Swept EVERY member of the archive -- the 4,847-byte README, all 15 CSVs in full (bodies as well as headers) and the extracted text of the 26-page monthly report PDF, 223,103 characters in total -- for 'tax', 'taxes', 'taxed', 'taxable', 'excise', 'before tax', 'after tax', 'inclusive', 'exclusive', 'net of tax', 'gross of tax', 'incl' and 'excl', all with word boundaries: zero hits. The same sweep's known-positive controls ($3 State fee x1, ICS x8, less than 20 orders x2, rounded to the nearest x1) all fire, so the zero is a measurement and not a broken regex. Utah levies no cannabis excise, only standard state and local sales tax, and whether these figures sit above or below it is not stated. Inferring it from general knowledge of Utah tax law is exactly what ANCHORS 6 forbids. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — Net sales and items sold by product category, calendar month
- Measurement
- measured
- Money
- net_of_discounts
- Tax
- unstated
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide
- Channels
- medical
- Rounding
- Rounded to the nearest THOUSAND -- a coarser grain than the monthly sales table's nearest hundred. Together with the excluded $3 fee this is why the categories sum to 1.2%-2.9% under published net every month and can never be a decomposition of the headline.
The regulator's own words: README: "SALES BY TYPE PER MONTH: Quantity and value of items sold per month per category. $3 State fee is not included in these totals, which would otherwise be under 'Non Medicated'."
Why an axis above reads unstated: The README documents the ICS source system, the rounding grain, the $3 state fee exclusion and the county suppression threshold, and says nothing about tax. Swept EVERY member of the archive -- the 4,847-byte README, all 15 CSVs in full (bodies as well as headers) and the extracted text of the 26-page monthly report PDF, 223,103 characters in total -- for 'tax', 'taxes', 'taxed', 'taxable', 'excise', 'before tax', 'after tax', 'inclusive', 'exclusive', 'net of tax', 'gross of tax', 'incl' and 'excl', all with word boundaries: zero hits. The same sweep's known-positive controls ($3 State fee x1, ICS x8, less than 20 orders x2, rounded to the nearest x1) all fire, so the zero is a measurement and not a broken regex. Utah levies no cannabis excise, only standard state and local sales tax, and whether these figures sit above or below it is not stated. Inferring it from general knowledge of Utah tax law is exactly what ANCHORS 6 forbids. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — Pickup and delivery order value, calendar month
- Measurement
- measured
- Money
- unstated
- Tax
- unstated
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide
- Channels
- medical
- Rounding
- Nearest hundred for dollars, nearest ten for counts.
Why an axis above reads unstated: The README defines PICKUPS PER MONTH as 'Total pharmacy pickups per month' and DELIVERIES PER MONTH as 'Total Deliveries per month', and never says whether the value is before or after the discounts that Sales Per Month reports separately. (Its 'Includes dollar value and number of orders' phrasing belongs to the PER COUNTY entries, not to these two.) The columns are headed 'Order Total', which matches neither 'Gross Sales' nor 'Net Sales'. Same whole-archive zero-hit tax sweep as the sales basis. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — Order and patient counts, calendar month
- Measurement
- measured
- Money
- not_applicable
- Tax
- not_applicable
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide
- Channels
- medical
- Rounding
- README: order counts are rounded to the nearest ten or hundred. Patient counts are not rounded.
Basis — Current active patients, decomposed by the month they entered or left the programme
- Measurement
- measured
- Money
- not_applicable
- Tax
- not_applicable
- Period
- calendar_month
- Scope
- retail_only
- Geography
- statewide
- Channels
- medical
The regulator's own words: README: "'Activated Per Month' Counts are based on current active patients. The month is determined by when they were first made active. Since these counts are based on current active patients, counts in previous months may change as patients expire and renew."
Basis — Programme counts as at the report date
- Measurement
- measured
- Money
- not_applicable
- Tax
- not_applicable
- Period
- point_in_time
- Scope
- all_tiers
- Geography
- statewide
- Channels
- medical
Sources 1
| Role | Source | Format | From | Last verified | Note |
|---|---|---|---|---|---|
| Canonical | Medical cannabis program data ZIP (15 CSVs, README and the monthly report PDF) Utah Center for Medical Cannabis, DHHS | zip | 2020-03 | 2026-08-16 | The archive ships its own README documenting every file -- rare in this inventory -- and carries the complete history back to 2020-03 on every release, which is why the write is a full rebuild. Each month's ZIP replaces the last at a new filename; older filenames survive for a while (2026-06.zip, 2026-05.zip and 2026-04-2.zip all resolved on 2026-08-16) but not indefinitely (2020-03.zip is gone). |
Why each marker above says what it says
| Metric | Marker | Why |
|---|---|---|
| Retail sales | Partly comparable | Utah is the one state on this site that states its money basis outright: the headline is GROSS retail, before discounts, and those discounts are 17.81% of gross across all 77 months and 24.24% in 2026-07 - a share that has grown, not a constant. DC and Maryland both leave that axis unstated, so a Utah bar is a known quantity set beside two unknown ones rather than a like-for-like match. Whether any of the three includes sales tax is unstated in Utah's case too. Medical only. |
| Medical / adult-use split | Single-channel market | Medical only. Utah has never licensed adult-use retail, so there is no split to report and a 100% medical share here is a statement about the law, not about buyer behaviour. Utah's cards are physician-recommended, unlike DC's, where any adult 21+ self-certifies. |
| Price per gram | Not like-for-like | No price per gram is derivable. Utah's product table reports an 'Inventory Quantity' in ITEMS, not weight, so Flower works out at $55.77 per item in 2026-07 -- a package price. Converting it would need an assumed grams-per-package factor that the source does not supply, which DECISIONS Q7 forbids. |
| Per capita | Partly comparable | Per resident, and inheriting every flag on the numerator: Utah's is gross of discounts where the anchors' basis is unstated, and its tax basis is unstated too. It also divides a medical-only market by the whole population, so the ratio answers a different question from an adult-use state's. |
| Patient counts | Not like-for-like | Utah publishes no monthly count of registered patients. What it publishes monthly is the CURRENT active population decomposed by the month each patient first activated, which is neither DC's cumulative registrations nor Maryland's active stock nor Maine's certificate flow. Every historical value is recomputed each release, so the history legitimately changes and a figure that falls is the source working. A single point-in-time active total is published in the monthly report and is carried in the snapshot instead. Blocked until ut_activated_measure is resolved, whatever the status above says. |
| Licence counts | Not like-for-like | Utah's monthly report counts PEOPLE, not premises: registered and paper-only recommending providers, pharmacy medical providers, and processor, pharmacy and courier agents. It publishes no pharmacy or dispensary licence count at all, and the one facility table it does carry -- cultivators and processors by county -- is a positional PDF layout that cannot be extracted reliably. An agent headcount is not a licence count and must not be charted as one. |
| Tax revenue | Not like-for-like | Utah levies no cannabis excise tax -- only standard state and local sales tax, which is not reported separately for cannabis anywhere. There is no cannabis tax-revenue series to publish. |
What is checked on every run 7
| Check | Kind | Last result |
|---|---|---|
| Gross minus discounts equals net, at the width that only a parse defect can breach. | identity | 77 months, max residual -$8,300 (0.1164%) at 2021-07 |
| Discounts < net <= gross, in every month. | identity | 77 months, 0 breaches; net/discounts 2.54x to 542.25x |
| The same residual against the source's own observed envelope. | identity | 77 months, 0 outside the band |
| The product-category table against published net sales -- a band, because it is not a decomposition. | identity | 77 months, 0 outside the band |
| The current active-patient count, from three places in the same archive. | identity | county 116,177 == conditions 116,177 == PDF 116,177 |
| 'Activated Per Month' summed, against the published active total. | identity | 116,049 vs 116,177 (-0.11%) |
| Gross sales has no independent decomposition in this archive. | unchecked | Not cross-checked. Nothing published by Utah adds up to gross sales. Pickups and deliveries together are 23.3% of 2026-07 gross because walk-in purchases are never broken out; the product-category table is on a coarser rounding grain and excludes the $3 state fee, and tracks net rather than gross; and the county tables cover only the pickup and delivery subsets and suppress their own order counts. Utah's headline is therefore a single unverified number, unlike DC's, which two independent in-document identities over-determine. The page says so rather than implying equal rigour. |
The regulator's own notes, and what is still open
The regulator's own notes
Note that some dollar values and order counts are rounded to the nearest ten or hundred.
— Utah Center for Medical Cannabis, README.txt
$3 State fee is not included in these totals, which would otherwise be under 'Non Medicated'.
— README.txt, SALES BY TYPE PER MONTH
Since these counts are based on current active patients, counts in previous months may change as patients expire and renew.
— README.txt, PATIENT STATUS PER MONTH
Any month/county with less than 20 orders doesn't specify the number of orders.
— README.txt, PICKUPS PER COUNTY and DELIVERIES PER COUNTY
The county-level pickup and delivery tables are not ingested. 706 of their 3152 order-count cells print 0, and 682 of those sit beside a positive dollar total, so any county order figure is a floor rather than a count. The README says why in as many words -- "Any month/county with less than 20 orders doesn't specify the number of orders" -- so this is the regulator's stated suppression rule, not an inference from the data. The statewide monthly tables are used instead. — dccannabisdata.com, from the 2026-07 archive
SOURCE_CONTRACT section D records Utah's suppression marker as a blank cell. There is not one blank numeric cell anywhere in the 15 CSVs; the token Utah actually prints is a literal 0, which is why this file registers that instead and pairs it with a positive dollar total to tell it apart from a real zero. — dccannabisdata.com, verification note 2026-08-16
Open questions on this data
Unresolved definitional questions that gate something. Listed because a question nobody can see is a question nobody closes.
- Are Utah's published gross and net sales figures before or after state and local sales tax? Closing it needs: Email medicalcannabis@utah.gov (the address printed on page 2 of every monthly report) and ask whether Gross Sales in Sales Per Month.csv is stated before or after sales tax.
- Why is net sales systematically larger than gross minus discounts, by up to $8,300 in a month? Closing it needs: Ask the Center for Medical Cannabis what Net Sales is computed from in ICS -- specifically whether returns, voided orders or the $3 state fee enter one column and not the other.
- Is 'Activated Per Month' the current active patient population decomposed by first-activation month, rather than a flow of activations? Blocks: patient_counts. Closing it needs: Ask the Center for Medical Cannabis to confirm the construction, and whether any historical edition of the file can be re-obtained to measure how far back the restatement reaches.