At a glance
Where the market is heading
Non-medical is Ohio's own term for adult-use: sales to any adult 21+, which began on 6 August 2024. Medical is sales to registered patients, which began on 14 January 2019. Both come from the same dispensaries and the same table. Before the non-medical channel opened, its line is a declared hole rather than a zero — DCC prints a dash there, and a zero would claim the channel existed and sold nothing.
Weekly product sales by channel
Ohio does not publish a weekly figure. It publishes a running total to date, and every week on this chart is the difference between two of those totals. That is exact where both totals are printed — and it is why a week the regulator restated downward is drawn as a hole: a week's trade cannot be negative, so no number is shown rather than an impossible one.
The first week in the file has no earlier total to difference against, so it has no bar. Its published figure is an opening level covering the days from the first legal sale, not one week's trade, and charting it as a week would overstate that week.
Who is buying
Ohio reports Non-Medical and Medical as separate columns of the same table, so this split is the regulator's own rather than anything derived here. Where its two columns disagree with its own Total for a week, the split for that week is withheld and only the Total is drawn — one of the three published figures is wrong and the file does not say which.
Product sales by channel
What a gram cost
DCC's own published weekly average, blended across both channels. This is not the same basket as the price line on other states' pages. Ohio's rule defines plant material as “the leaves, stems, buds, and flowers of the marijuana plant”, so leaves and stems are priced in it, while the cross-state price axis is pinned to whole bud. Ohio is shown here and held off that axis until the estate settles whether a non-bud basket may join it behind a marker.
Average price per gram of plant material
There is no monthly price on this page. A month's price would have to weight each week by the plant dollars sold in it, and DCC does not publish plant dollars separately from total product sales — an unweighted average of weekly averages would be a statistic nobody measured.
DCC also publishes the same average per tenth of an ounce. The two columns are one figure in two units, and the regulator's own conversion between them is not the exact number of grams in a tenth of an ounce. The state file records both the factor DCC uses and the exact one, and the sales identity is checked in tenth-ounces, where DCC's arithmetic closes.
How much left the shelves
Pounds of plant material, from the same cumulative table and differenced the same way. Ohio is unusual in publishing weight, transaction counts and dollars side by side, which is what makes the price line above the regulator's own arithmetic rather than an estimate.
Plant material sold per week
“Plant material” is Ohio's statutory category for raw plant — leaves, stems, buds and flowers. Manufactured product is counted separately, in units rather than by weight, and a unit is a package, so the two cannot be added together or converted into one another.
Grouped into monthsmonthly
These are not calendar months. Ohio's weeks end on Saturdays and do not nest inside months, so each bar here is the sum of the weeks that end in the named month. A bucket usually starts a few days inside the previous month and can stop a few days short of this one; the exact span of every bucket, and how many of its days fall outside its own calendar month, is published in the state data file. The dollars are exact. The window is not the one the label names, which is why Ohio joins the cross-state monthly comparison with a caveat rather than directly.
Product sales by month bucket
A bucket publishes only when every week-ending Saturday its calendar month contains is present in the source and each has a computable difference. A bucket missing a week is drawn as a hole, not as a smaller month — a month short one week is not a quieter month, it is a month this data cannot state.
The newest month is normally incomplete for that reason and is left off the chart entirely rather than shown short.
What host communities receivedmonthly
From the Department of Taxation, not the Division of Cannabis Control — a different agency on a different basis. This is not Ohio's cannabis tax revenue. It is the share distributed to the municipalities and townships that host a dispensary, summed across every locality in the department's own workbook, and the department does not publish the total collections it comes out of beside it. Its columns are distribution months, and the workbook does not say whether a column is the month the money went out or the month of the sales behind it.
Adult-use excise distributed to host communities
The series starts where the department's current workbook starts. Earlier months exist only inside two workbooks that have stopped being updated — both still return well-formed figures on request, which is exactly why neither is wired here. Those months are drawn as holes and labelled not ingested, not as zero.
Before non-medical sales began there was no adult-use excise to distribute, so those months are holes with that reason rather than zeroes.
Questions about this data
Why are the charts weekly when other states are monthly?
Because Ohio's source is weekly. The Division of Cannabis Control publishes one spreadsheet of running totals to date, one row per week-ending Saturday. Turning that into calendar months would mean splitting a week across a month boundary and apportioning it, which invents figures the regulator never published. The month view on this page groups whole weeks instead, and says so.
Why does a week sometimes have no bar?
Three different reasons, and the chart distinguishes them. Before non-medical sales began, that channel's cells hold a dash in the source and the line is a declared hole. Where the regulator's running total falls between two weeks — a downward restatement — the implied week is negative, which is impossible for a flow, so it is drawn as a hole. And where the two channel columns disagree with the regulator's own total for a week, the split is withheld while the total is kept.
Is this price comparable with the other states on this site?
Not directly. Ohio's average is per gram of plant material, and Ohio's own rule defines that to include leaves and stems. The cross-state price chart is pinned to whole bud, so Ohio is published on its own page with the basket stated and held off that chart until the site settles whether a broader basket may join it behind a visible marker.
What does Ohio not publish?
Patient counts and current licence counts. Neither appears in any machine-readable file this pipeline reads. The one dispensary roster on the state's asset server predates adult-use entirely — every licence on it is a medical one — so no count is taken from it. Ohio also states nothing about whether its sales figures are before or after discounts, or whether tax is included; a full-text search of the only prose the regulator has published alongside this series found no mention of any of it, and the site records that as an unknown rather than filling it in.
How current is this?
Ohio is usually the last state on this site to have a complete recent period. The workbook is uploaded some weeks after the week it covers, and the banner above the charts gives the latest week actually published together with how long after that week it was uploaded. Both figures come from the file itself on every build.
Where these figures come from
Sourcing, basis and comparabilityOhio runs both channels off one set of dispensaries. DCC's own summary reads: "Medical sales began January 14, 2019. Non-medical sales began August 6, 2024." Everything DCC publishes about sales is cumulative-to-date on a weekly grid, and it splits every figure Non-Medical against Medical.
Basis — DCC cumulative-to-date, week-ending Saturdays
- Measurement
- measured
- Money
- unstated
- Tax
- unstated
- Period
- week
- Scope
- unstated
- Geography
- statewide
- Channels
- medical, adult_use
The regulator's own words: None. The workbook's only text is its two-row header.
Why an axis above reads unstated: DCC attaches no methodology to the workbook: the sheet holds a two-row header and 398 dated rows and nothing else, and the only prose DCC has ever published with this series is the retired PDF. A full-text sweep of all 96 of its pages on 2026-08-16 returned: 'tax' 0, 'excise' 0, 'gross' 0, 'net' 0, 'discount' 0, 'exclud' 0, 'methodolog' 0, 'defin' 0, 'retail' 0, 'dispensar' 0, 'wholesale' 0, 'deliver' 0. Zero hits on every basis term, so gross-versus-net, tax treatment and tier scope are checked negatives here, not omissions. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Basis — One week's activity, differenced from DCC's cumulative totals
- Measurement
- derived
- Money
- unstated
- Tax
- unstated
- Period
- week
- Scope
- unstated
- Geography
- statewide
- Channels
- medical, adult_use
Why an axis above reads unstated: DCC attaches no methodology to the workbook: the sheet holds a two-row header and 398 dated rows and nothing else, and the only prose DCC has ever published with this series is the retired PDF. A full-text sweep of all 96 of its pages on 2026-08-16 returned: 'tax' 0, 'excise' 0, 'gross' 0, 'net' 0, 'discount' 0, 'exclud' 0, 'methodolog' 0, 'defin' 0, 'retail' 0, 'dispensar' 0, 'wholesale' 0, 'deliver' 0. Zero hits on every basis term, so gross-versus-net, tax treatment and tier scope are checked negatives here, not omissions. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Derivation. value(week n) = cumulative(week n) - cumulative(week n-1) Error: Exact where both snapshots are numeric: a difference of two figures the source published. It carries the source's own restatements, so a week whose difference is negative is published as a hole rather than as a flow..
Basis — Month bucket of week-ending Saturdays - NOT a calendar month
- Measurement
- derived
- Money
- unstated
- Tax
- unstated
- Period
- week
- Scope
- unstated
- Geography
- statewide
- Channels
- medical, adult_use
Why an axis above reads unstated: DCC attaches no methodology to the workbook: the sheet holds a two-row header and 398 dated rows and nothing else, and the only prose DCC has ever published with this series is the retired PDF. A full-text sweep of all 96 of its pages on 2026-08-16 returned: 'tax' 0, 'excise' 0, 'gross' 0, 'net' 0, 'discount' 0, 'exclud' 0, 'methodolog' 0, 'defin' 0, 'retail' 0, 'dispensar' 0, 'wholesale' 0, 'deliver' 0. Zero hits on every basis term, so gross-versus-net, tax treatment and tier scope are checked negatives here, not omissions. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Derivation. sum of the week deltas whose week-ending Saturday falls in the named calendar month Error: Ohio's figures are cumulative-to-date on a week-ending-Saturday grid, so a month here is the sum of the weeks that END in it, not a calendar month. Those buckets run 28 to 35 days against calendar months of 28 to 31, they reach back up to 6 days into the previous month, and they can stop up to 6 days short of the month's end. 1 of the 91 buckets happens to cover its calendar month exactly..
Basis — DCC weekly average price, as published
- Measurement
- measured
- Money
- unstated
- Tax
- unstated
- Period
- week
- Scope
- unstated
- Geography
- statewide
- Channels
- medical, adult_use
The regulator's own words: None on basis. The column is headed only "Plant Sales Average / per gram". What "plant material" means is defined elsewhere, by rule: "the leaves, stems, buds, and flowers of the marijuana plant, and does not include seedlings, seeds, clones, stalks, or roots".
Why an axis above reads unstated: DCC attaches no methodology to the workbook: the sheet holds a two-row header and 398 dated rows and nothing else, and the only prose DCC has ever published with this series is the retired PDF. A full-text sweep of all 96 of its pages on 2026-08-16 returned: 'tax' 0, 'excise' 0, 'gross' 0, 'net' 0, 'discount' 0, 'exclud' 0, 'methodolog' 0, 'defin' 0, 'retail' 0, 'dispensar' 0, 'wholesale' 0, 'deliver' 0. Zero hits on every basis term, so gross-versus-net, tax treatment and tier scope are checked negatives here, not omissions. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.
Unit conversion. usd_per_tenth_oz → usd_per_g, factor 2.83, defined in DCC's own, measured off the workbook rather than assumed: column 14 divided by column 15 is exactly 2.83 in 385 of 398 weeks. The exact figure is 2.8349523125 g per tenth of an avoirdupois ounce, so DCC's rounding puts its per-gram column 0.175% above its own per-1/10oz column..
Basis — Adult-use excise distributed to host municipalities and townships
- Measurement
- measured
- Money
- not_applicable
- Tax
- not_applicable
- Period
- filing_period
- Scope
- unstated
- Geography
- statewide
- Channels
- adult_use
Why an axis above reads unstated: The workbook carries a Location column, dated money columns and a total, and no note of any kind. The listing page that links it states no methodology either. What share of the excise reaches host communities is set by statute and is not in the artifact, so it is not asserted here. 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 | DCC Historical Sales Data (Excel) Ohio Department of Commerce, Division of Cannabis Control | xlsx | 2019-01-19 | 2026-08-16 | One workbook, one sheet, 16 columns, 398 weekly rows from 2019-01-19 to 2026-08-29. Unauthenticated, no key, no referer check, Access-Control-Allow-Origin *. The whole history ships every time, so revisions are absorbed by rebuilding rather than by incremental append logic. |
| Cross-check | DCC Historical Sales Data (PDF), retired Ohio Department of Commerce, Division of Cannabis Control | 2019-04 | 2026-08-16 | Never averaged with the canonical figure. 257 of 795 matched cells differ by 1 or more. |
Why each marker above says what it says
| Metric | Marker | Why |
|---|---|---|
| Retail sales | Partly comparable | Ohio's months are buckets of week-ending Saturdays, not calendar months: 28-35 days long, reaching up to 6 days back into the previous month and stopping up to 6 days short of this one, because the source is cumulative on a weekly grid and splitting a week to make a calendar month is the interpolation Q4 prohibits. The dollars are exact; the window is not the one the label names. Ohio's basis is also undocumented - the regulator states nothing about gross versus net, tax treatment or tier scope. |
| Medical / adult-use split | Partly comparable | A genuine two-channel split: DCC publishes Non-Medical and Medical as separate columns of the same table and their sum equals its own Total in 1549 of the 1581 cells checked. It is not a per-transaction attribute the source exposes, only two reported aggregates, and it inherits the week-bucket grain above. |
| Price per gram | Partly comparable | Ohio's price is a published weekly mean per gram of "plant material", which Ohio's own rule defines as "the leaves, stems, buds, and flowers of the marijuana plant, and does not include seedlings, seeds, clones, stalks, or roots". Leaves and stems are in the basket, so this is not the whole bud the cross-state axis is pinned to, and DCC's per-gram column additionally divides by 2.83 where a tenth of an ounce is 2.8349523125 g - putting it 0.175% above its own per-1/10oz column. It is weekly, not monthly, and no weighted monthly mean is published because DCC does not publish plant dollars separately from total product sales. Blocked until oh_price_basket_not_bud is resolved, whatever the status above says. |
| Per capita | Partly comparable | Per resident inherits everything above: the week-bucket window, and an undocumented basis. Ohio's dispensaries also serve out-of-state adult-use customers with no residency test and DCC publishes no residency split, so an unknown share of these dollars belongs to residents of other states. |
| Patient counts | Not like-for-like | Ohio publishes no patient or registry count in any artifact this pipeline reads. The sales workbook has four metric families and none of them counts people; the only per-person figure is Total Receipts, which counts transactions and is published under `transactions`, not here. |
| Licence counts | Not like-for-like | The only machine-readable Ohio licence list found is a roster frozen before adult-use opened, in which every licence type is medical and none is dual-use. It is registered as a zombie and no count is published from it. DCC states current counts in prose news releases, which is not a series. |
| Tax revenue | Partly comparable | This is the adult-use excise DISTRIBUTED to Ohio's 120 host municipalities and townships, not the excise collected: it is a share of a larger figure the Department of Taxation does not publish beside it. Its periods are distribution columns and the workbook does not say whether a column is the month distributed or the month of the sales behind it. It runs 2026-01 to 2026-07 only; earlier months exist solely inside two abandoned workbooks this pipeline refuses to wire. Blocked until oh_tax_distribution_share is resolved, whatever the status above says. |
What is checked on every run 6
| Check | Kind | Last result |
|---|---|---|
| The Department of Taxation's distribution workbook ends with an UNLABELLED row whose cells are the column totals. This checks the sum of the named locality rows against it. The estate rule is to sum the rows and treat the regulator's own roll-up as a check on that sum, never as the figure. | identity | row 122 reconciles to the sum of 120 localities across 7 month columns; largest residual 0.0. The 1 non-month column(s) outside the identity reconcile too. |
| The source's own decomposition: for each of the four metric families, Total equals Non-Medical plus Medical. Where the Non-Medical cell is the pre-open marker the identity is checked as Total equals Medical, because a marker is not a zero and must not be summed as one. When it fails, the remedy reaches the cells this expression names: both the cumulative channel levels AND the weekly deltas derived from them become gaps for that week, carrying the residual as their reason. The Total is kept at both grains. | identity | 32 of 1581 cells non-zero, all in 8 week(s): 2026-07-11, 2026-07-18, 2026-07-25, 2026-08-01, 2026-08-08, 2026-08-15, 2026-08-22, 2026-08-29. Both the cumulative channel levels and the weekly channel deltas are withheld for those weeks and the Total published alone. |
| An independent product decomposition: a week's total product sales should equal the plant material sold that week at the published per-1/10oz average plus the manufactured units sold at the published manufactured average. This is what establishes that both average-price columns are dollars-per-unit means over the week rather than means of transaction prices. 6 week(s) are NOT in the population: their Manufactured Sales Average cell is the registered marker while a non-zero number of units moved, so the manufactured contribution is unknown rather than zero and the week cannot be reconstructed at all (2019-04-06, 2019-04-13, 2019-04-20, 2019-04-27, 2019-05-04, 2019-05-11). Substituting zero for the marker would put the marker-as-zero defect inside the check that is supposed to catch it. | identity | aggregate ratio 1.00032 across 391 weeks. |
| Every cumulative column should be non-decreasing, because a running total cannot fall. Where one does, the source has restated itself and the implied weekly flow is negative. | shape assertion | receipts.medical -2,869 at 2020-11-07; receipts.total -2,869 at 2020-11-07 |
| The retired PDF's tabular cumulative snapshots against the workbook's rows for the same week-ending dates. A second artifact, produced by the same regulator from the same system but rendered independently. | cross source reconciliation | 257 of 795 matched cells differ by 1 or more. |
| Whether Ohio's month buckets equal calendar months. | unchecked | Not cross-checked. There is nothing to check them against. Ohio publishes no calendar-month figure anywhere, so the bucket cannot be reconciled to one - which is the whole reason it is declared a labelled approximation rather than a month. What CAN be measured is stated instead: each bucket's real span is published under detail.monthly, and 1 of the 91 buckets happens to line up with its calendar month exactly. |
The regulator's own notes, and what is still open
The regulator's own notes
Medical sales began January 14, 2019. Non-medical sales began August 6, 2024.
— Ohio Division of Cannabis Control, Historical Sales Data (PDF), page 1
the leaves, stems, buds, and flowers of the marijuana plant, and does not include seedlings, seeds, clones, stalks, or roots
— Ohio Administrative Code 3796:1-1-01, definition of "plant material", fetched from codes.ohio.gov on 2026-08-16
Ohio's figures are cumulative-to-date on a week-ending-Saturday grid, so a month here is the sum of the weeks that END in it, not a calendar month. Those buckets run 28 to 35 days against calendar months of 28 to 31, they reach back up to 6 days into the previous month, and they can stop up to 6 days short of the month's end. 1 of the 91 buckets happens to cover its calendar month exactly. — Derived in expansion/pipelines/oh/pipeline.py from the source's own week-ending dates
Ohio's price is per gram of "plant material", which its own rule defines as "the leaves, stems, buds, and flowers of the marijuana plant, and does not include seedlings, seeds, clones, stalks, or roots". Leaves and stems are in it, so this is not the whole-bud basket the cross-state price axis is pinned to. — Ohio Administrative Code 3796:1-1-01, definition of "plant material", fetched from codes.ohio.gov on 2026-08-16
DCC's two average-price columns are the same figure in two units, and the conversion is the regulator's own: per-1/10oz divided by per-gram is exactly 2.83 in 385 of 398 weeks. A tenth of an avoirdupois ounce is 2.8349523125 g, so the published per-gram figure sits 0.175% above what the per-1/10oz column implies. This page publishes DCC's own per-gram column rather than a recomputed one; the decomposition identity is checked in tenth-ounces, where the regulator's arithmetic closes. — Measured from the source workbook's own columns 14 and 15
Open questions on this data
Unresolved definitional questions that gate something. Listed because a question nobody can see is a question nobody closes.
- The cross-state price axis is pinned to whole bud. Ohio's published price is per gram of plant material, which Ohio's own rule defines to include leaves and stems. Does the estate price chart admit a non-bud basket behind a visible marker, or does Ohio stay off it? Blocks: price_per_gram. Closing it needs: A decision on DECISIONS Q7 paragraph 3, which is already open for Mississippi and Maine and is not Ohio's to make. Ohio's own half is closed: the basket is known and it is not bud.
- Is a column in the AUM workbook the month the money was distributed or the month of the sales it derives from, and what fraction of adult-use excise collections does the host-community distribution represent? Blocks: tax_revenue. Closing it needs: Ask the Department of Taxation's revenue accounting office which month a column denotes, and cite the statutory distribution share from the Revised Code rather than inferring it from the totals.