Cannabis Data Project
California · Quarterly and monthly

California's cannabis market, by quarter and by month

Showing—
Loading…

Loading the latest CDTFA and DCC figures…

At a glance

Where the market is heading

Cannabis sales is the figure retailers report as the base of the cannabis excise tax — the cannabis-only column. Taxable sales is the wider figure from the same shops' sales-and-use-tax returns, which CDTFA says also covers merchandise that is not cannabis. They are different measures and they are drawn as two lines, never merged.

Quarterly sales

Why the cannabis line starts later. CDTFA's cannabis-sales column exists only from the quarter excise reporting moved from distributors to retailers. Before that no retailer reported the figure, so the cells are drawn as gaps rather than zeros — a zero there would say California sold no cannabis in a quarter it reported hundreds of millions of dollars of taxable sales.

Quarters get revised. CDTFA republishes the whole history every edition and states that amounts are subject to change, so a figure here may differ from one read last quarter. Every edition this pipeline has fetched is archived, and measured changes are listed in the state file.

The same market, month by monthmonthly

California's tax authority reports quarterly and its cannabis regulator reports monthly, and these are two different measurements rather than two views of one. This line is the DCC's, derived from Metrc track-and-trace and read off a Looker Studio dashboard that offers no export. The quarterly line above is CDTFA's, from returns retailers filed. Summed to a quarter the two do not agree, and the gap between them is published on this page rather than closed.

Retail sales by month, from the DCC's Monthly Sales Summary Report

The DCC dashboard prints every figure display-rounded. What that costs in precision, measured against the one figure the dashboard prints to the dollar, is stated with the rest of this state's integrity checks below.

The DCC publishes no statement of whether its figure is gross or net of discounts, or whether tax is inside it. Both axes read `unstated` and must stay that way.

Summed to a quarter these months do not match the CDTFA line above, and the gap is measured rather than closed. Doing that sum and setting it against CDTFA's own columns is one of this state's standing checks; what it found on the last run, over the quarters where the two series overlap, is listed with the rest of this state's integrity checks below. Neither series is corrected against the other and no line here is stitched out of both.

What the state collects

These are amounts reported on returns for the quarter, not cash received in it. The excise column is net of two adjustments CDTFA names — credit for excise paid to distributors before the reporting shift, and retained vendor compensation — so both are drawn separately for anyone who wants to add them back.

Cannabis tax reported, by quarter

The cultivation line stops, and that is correct. California repealed the cultivation tax, and the quarters after it are gaps rather than zeros: a zero would claim the tax existed and collected nothing. CDTFA's own footnote gives the date and this page reads it from there.

Sales tax is not a cannabis tax. CDTFA states it applies to cannabis products and other tangible personal property, so it is shown for context and is deliberately withheld from the cross-state tax metric, which carries the excise column alone.

How many shops

CDTFA counts sites on sales-and-use-tax accounts carrying a cannabis-retailer attribute. That is a tax-registration concept and not a licence: the licensing regulator is a different agency, and its figures are not read by this page. The two do not agree and are not reconciled here.

Cannabis-retailer tax account sites

Ceased is a flow, active is a stock. CDTFA says the ceased count covers sites with a cease date inside the quarter. Differencing the active count against it does not recover openings, because the active count is itself restated each quarter.

The series starts late. CDTFA's footnote says this report replaced an earlier one built on a different account attribute, and it publishes nothing for the quarters before the replacement. Those cells are gaps.

Where these figures come from

Sourcing, basis and comparability

California licenses adult-use and medicinal retail through one system and taxes both through one excise, so nothing CDTFA publishes separates them. Everything on this page is a tax-return aggregate: CDTFA is the revenue agency rather than the licensing regulator, and its quarterly open-data sets are the only machine-readable official series California publishes. Medicinal distribution under the state's earlier collective model predates commercial licensing and is not in this series; no date is claimed for it here, because no source this pipeline reads states one.

Retail sales Partly comparableMedical / adult-use split Not like-for-likePrice per gram Not like-for-likePer capita Partly comparablePatient counts Not like-for-likeLicence counts Not like-for-likeTax revenue Partly comparable
Basis — Cannabis sales reported by retailers subject to the excise tax
Measurement
measured
Money
gross
Tax
unstated
Period
calendar_quarter
Scope
retail_only
Geography
statewide
Channels
medical, adult_use
Rounding
Whole dollars in every column of this dataset.

The regulator's own words: CDTFA's dataset footnote: "Cannabis Sales - Cannabis sales represents amounts reported by retailers subject to the excise tax." The `money: gross` flag is sourced rather than inferred: CDTFA's rate table heads its own column "Excise Tax Rate of Gross Receipts" and the same page states that the tax "is based on gross receipts from the retail sale of cannabis or cannabis products". Rates in force over this series, as CDTFA prints them: 2025-10-01 at 15%; 2025-07-01 to 2025-09-30 at 19%; 2023-01-01 to 2025-06-30 at 15%.

Why an axis above reads unstated: `tax` is a checked negative. A full-text search of the 140500 characters of CDTFA footnote and rate-page text this pipeline fetches (CDTFA dataset footnotes, CDTFA tax-rates page) for ten tax-inclusion phrases returned no hit. CDTFA states the rate and the base's name; it does not state whether the reported figure is inclusive or exclusive of the excise or the sales tax. Q6's "gross excluding tax" is therefore aspirational here and the flag stays `unstated` rather than being reasoned out of California tax law, which ANCHORS 6 forbids. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.

Basis — Taxable sales on sales-and-use-tax returns of cannabis retailers
Measurement
measured
Money
gross
Tax
unstated
Period
calendar_quarter
Scope
unstated
Geography
statewide
Channels
medical, adult_use
Rounding
Whole dollars.

The regulator's own words: CDTFA's dataset footnote: "Taxable Sales - Taxable sales include sales of cannabis, cannabis products, and other retail sales of tangible personal property reported on sales and use tax returns." `scope` is `unstated` rather than `retail_only` because the footnote says the base contains something other than cannabis and does not say how much. Measured against the cannabis base where both exist, this one runs a factor of 1.1543 to 1.2489 larger over 14 quarters, 1.1543 at 2024-Q1 and 1.2489 at 2025-Q2; that spread is the non-cannabis component plus any difference in how the two bases treat tax, and this source separates neither.

Why an axis above reads unstated: Both `scope` and `tax` are checked negatives against the same corpus as the excise base. The scope search is the footnote itself, which names "other retail sales of tangible personal property" without quantifying them; CDTFA publishes no cannabis-only cut of this column at any grain in the 6 datasets its cannabis category carries. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.

Basis — Cannabis tax reported, by return reporting period
Measurement
measured
Money
not_applicable
Tax
not_applicable
Period
calendar_quarter
Scope
retail_only
Geography
statewide
Channels
medical, adult_use
Rounding
Whole dollars.

The regulator's own words: CDTFA's dataset footnote: "Revenue represents amounts reported based on the reporting period of the return." These are liabilities reported for the quarter, not cash received in it. The same footnote records that excise amounts "are net amounts due after adjustments for tax paid to distributors prior to January 1, 2023, and vendor compensation", which is why the two adjustment columns are carried as their own fields rather than folded in.

Basis — Sales-and-use-tax account sites carrying the cannabis retailer attribute
Measurement
measured
Money
not_applicable
Tax
not_applicable
Period
calendar_quarter
Scope
retail_only
Geography
statewide

The regulator's own words: CDTFA's dataset footnote: "This report consists of count of sites related to sales and use tax accounts with the cannabis retailer attribute." A tax-account concept, not a licence. It is not joined to any licence count and does not feed the cross-state licence metric.

Basis — Cultivation and excise revenue reported, by state fiscal year
Measurement
measured
Money
not_applicable
Tax
not_applicable
Period
fiscal_year
Scope
all_tiers
Geography
statewide
Rounding
Cents, as reported.

The regulator's own words: CDTFA's dataset footnotes: "Revenue represents amounts reported based on the reporting period of the return." and "Cannabis Cultivation Tax ended on July 1, 2022" The weight columns are cultivation-tax weight entering commercial distribution, which is a cultivation-tier measure and not retail flower sold - hence `scope: all_tiers`. Periods are labelled by the year the fiscal year ENDS, so 2018 means the fiscal year beginning in July 2017. THAT START MONTH IS MEASURED, not assumed: no CDTFA dataset states it, so each quarter-boundary candidate was scored by summing the quarterly CULTIVATION-tax figures it implies against the published fiscal-year cultivation total, which is the one column both tables carry on the same basis for its whole life. July fits to a mean relative error of 0.1445% across four candidates; the runner-up, April, is 87 times worse. The excise column was tried first and discriminates nothing, because the fiscal-year table predates the 2023 reporting shift and the quarterly one does not.

Basis — DCC Monthly Sales Summary (Metrc track-and-trace)
Measurement
measured
Money
unstated
Tax
unstated
Period
calendar_month
Scope
retail_only
Geography
statewide
Rounding
Every figure the embed prints is display-rounded, so each monthly cell is only as precise as its last displayed digit. Across the 80 published months the rounding intervals add to at most $940,000 in total, and the widest single cell is $50,000. What bounds that in practice is the report's own grand total, which is printed to the dollar: the 80 months sum to within $24,874 of it, or 0.00008% of the total.

Why an axis above reads unstated: Searched every string the rendered dashboard produces (136 distinct texts, tab strip and glossary label included) for any of 13 words that would state a money or tax basis - gross, net, discount, excise, sales tax and the tax-inclusive and tax-exclusive phrasings. Zero hits. The search is known to work on this text: 2 of 2 control phrases the dashboard certainly prints were found by the same scan. The source is silent, so both axes read `unstated` rather than being filled with the likeliest answer. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.

Sources 3
Where every figure on this page comes from
RoleSourceFormat FromLast verifiedNote
CanonicalCannabis Tax Revenues (CDTFA Open Data Portal, OData v4)
California Department of Tax and Fee Administration
json_api2018-Q12026-09-02Unauthenticated OData v4. The endpoint name is the catalog's `ApiCall` value (Cannabis_Tax_Revenues); the `DatasetURL` form (CannabisTaxRevenues) answers HTTP 403 with a zero-byte body, and a name that does not exist answers identically. Because those two failures cannot be told apart, the catalog at https://cdtfa.ca.gov/dataportal/api/odata/Catalog is read first on every run and the endpoint resolved from it, so a rename self-heals and a withdrawal errors.
Cross-checkCannabis Sales by County (CDTFA Open Data Portal, OData v4)
California Department of Tax and Fee Administration
json_api2018-Q22026-09-02Never averaged with the canonical figure. 31 of 33 quarters reconcile, with residuals from -$28 to -$8 - the signature of per-row whole-dollar truncation. 2 do not (2018-Q2 by $949,554; 2018-Q4 by -$17,806), and their county detail is withheld rather than published. CDTFA aggregates its suppressed jurisdictions into a single "Undisclosed" row rather than dropping them, which is why this is a complete decomposition and not a floor. It is never averaged into the canonical figure and never substituted for it.
Cross-checkMonthly Sales Summary Report (Google Looker Studio embed, Metrc track-and-trace)
California Department of Cannabis Control
html2020-012026-09-01Never averaged with the canonical figure.
Why each marker above says what it says
How this state compares with the others
MetricMarkerWhy
Retail salesPartly comparableCDTFA, the canonical source for this line, publishes quarterly and nothing finer. DECISIONS Q4 forbids interpolating a quarterly figure into a monthly series absolutely, so the CDTFA line is excluded from every monthly chart with that reason rather than spread across the 102 months its 34 quarters cover but never report separately. Those quarters run 2018-Q1 to 2026-Q2. That is the first thing to know about this line: it appears on the quarterly view and is excluded from every monthly one, with the grain given as the reason. On basis it is a close match - `cannabis_sales` is the measured retailer-reported excise base, gross by the regulator's own wording - with two things attached. The tax axis is a checked negative rather than an agreement. And the series begins at 2023-Q1 rather than at 2018-Q1, because the cannabis-only column did not exist before the retailer-reporting shift; the wider taxable-sales column covers those quarters but is a different measure and is not offered here. California itself is not a quarterly-only state: the California Department of Cannabis Control publishes a calendar-month series of its own, and this file carries it whole under its own grain key, its own basis and the field `dcc_retail_sales_monthly`. That is a different agency measuring a different thing, so the two are never averaged, spliced or used to correct one another and no line a reader sees is stitched out of both. The monthly views draw the `dcc_looker_monthly` series; the CDTFA quarterly line stays off them for the grain reason above, and not for want of a monthly figure in the state.
Medical / adult-use splitNot like-for-likeCalifornia publishes no medical-versus-adult-use sales split anywhere in this source. Both channels are licensed and taxed through one system and no CDTFA dataset carries a channel attribute on a sales row. The DCC licence attribute `licenseDesignation` describes a LICENCE, not a transaction, and is not a sales split; ANCHORS 5 names it as the trap, and it is recorded in `headline.disallowed_substitutes` so it cannot be quietly promoted into one. This is a checked negative, not an unconsidered metric.
Price per gramNot like-for-likeNothing to price. The only weight in the category is cultivation-tier ounces on a fiscal-year table that closed at 2022. CDTFA does put those ounces on the same row as excise and market-price dollars, but they are a different tier from the dollars beside them, so dividing one into the other would cross a tier boundary and a basis boundary at once. The whole-bud standard is not unverified here - there is no basket at all, which is why `price_meta.basket` is `none` with a stated reason.
Per capitaPartly comparableEvery basis flag on the numerator rides along: `cannabis_sales` is gross by CDTFA's own wording with the tax axis a checked negative, so this line inherits that silence. Two further things are specific to California. The numerator is quarterly and begins at 2023-Q1, so 20 of the 34 quarters in this file have no per-resident figure at all. And California is the one state that ships its own denominators - CDTFA publishes PerCapitaSales for counties and cities but none for the state, so the county figures on California's own page and this statewide line are computed on different denominators and must not be summed into one another.
Patient countsNot like-for-likeCDTFA is the revenue agency and publishes no patient figure of any kind. California's medical identification card is voluntary and administered by a different department whose data this pipeline does not read, so there is no patient measure here to declare - not a cumulative registration count, not an active stock, not a certificate flow - none of the three measures the estate recognises. A patient axis may carry a second jurisdiction only when the measure matches, and California publishes nothing to match with.
Licence countsNot like-for-likeCalifornia does publish a quarterly count here and it is deliberately not offered to this metric. CDTFA counts SITES on sales-and-use-tax accounts carrying a cannabis-retailer attribute - its own footnote says so - which is a tax-registration concept rather than a licence. The licensing regulator is a different agency and its figures are out of this pipeline's scope, so the two cannot be reconciled from anything read here. The count is charted on California's own page with that label and carries role `none` so it cannot leak onto a licence axis. Over 14 quarters it runs from 1,796.0 in 2023-Q1 to 1,760.0 in 2026-Q2 - a change of -36.0.
Tax revenuePartly comparableCDTFA, the canonical source for this line, publishes quarterly and nothing finer. DECISIONS Q4 forbids interpolating a quarterly figure into a monthly series absolutely, so the CDTFA line is excluded from every monthly chart with that reason rather than spread across the 102 months its 34 quarters cover but never report separately. Those quarters run 2018-Q1 to 2026-Q2. On basis, the excise column is the cannabis-specific tax and the one offered here; sales tax and the total are withheld from this metric because CDTFA states they cover "other tangible personal property" as well. Two caveats attach. The figure is a LIABILITY reported for the return's period, not cash received in it. And it is net of the two adjustments CDTFA names - credit for excise paid to distributors before the reporting shift, and retained vendor compensation - so the gross tax on the quarter's sales is higher. Both adjustment columns are carried as their own fields for anyone who needs to add them back.
What is checked on every run 11
What is checked on every run
CheckKindLast result
The county rows, including CDTFA's "Undisclosed" bucket, sum to the statewide taxable-sales figure for the same quarter.identitypass - 31 of 33 quarters within $49 (residuals -$28 to -$8, below); 2 beyond it (2018-Q2 above by $949,554; 2018-Q4 below by $17,806), detail withheld
Excise reported, with the two adjustments CDTFA names added back, is the published statutory rate applied to the cannabis-sales base.identitypass - 14 quarter(s) checked against CDTFA's own rate; worst deviation 0.0434% at 2023-Q2, tolerance 0.0650%. Effective rate spans 15.0059% to 19.0247%, and the identity holds across the 2 published rate change(s) in the window (2025-Q3 to 19%; 2025-Q4 to 15%)
The published total equals its three published components.identitypass - exact in 26 of 34 quarters, off by at most $1 in the other 8, tolerance $1
In the fiscal-year set, excise is the statutory rate applied to the column CDTFA names `AverageMarketPrice` - which is how that column is shown to be a dollar base and not a price.identitypass - ratio spans 15.000000% to 15.000000% across 6 fiscal years against a published 15%; worst deviation 0.000000029% at FY ending 2018, tolerance 0.000000044%
The city set is a SUBSET of the state, not a decomposition, and is asserted to stay one.shape assertionpass - city coverage 58.9816% to 99.9820% across 34 quarters; 0 quarter(s) above 100%
Whether the headline cannabis-sales figure has an independent decomposition.uncheckedNot cross-checked. It does not. CDTFA decomposes TAXABLE sales by county and by city, and that decomposition is checked above - but taxable sales are a different and wider base than the headline. `CannabisSales` is published at the state level only, in one column, with no geographic, channel or product split anywhere in the cannabis category. The excise identity above ties it to the excise column at the regulator's own published rate, which is a real constraint and the reason the field can be trusted as the excise base - but it is one relation between columns of the SAME return, not an independent decomposition. Unlike the District of Columbia, whose headline is over-determined by identities in its own document, California's is not, and this page should not imply equal rigour.
Everything the parser assumes about the table's layout, checked against the rendered DOM before a value is read. This is the estate's only headless-browser source, and it is the only one whose publisher offers no compatibility contract: Looker Studio is a Google product with no version to pin and no changelog to read. So the scrape asserts its own shape before it writes anything - 8 structural checks covering the 5 report tabs, the table captions, the unfiltered state of the item-group control, the consecutive year run, and a cell present for each of the 84 month-year pairs the grid lays out, whether or not that month is published yet. Any one of them failing stops the run, leaves the previous file untouched, and California degrades to the quarterly CDTFA series it already publishes.shape assertion8 structural assertions all held on this run: 12 month rows, 7 year columns, 84 grid cells of which 4 are the not-yet-published months after 2026-08-30.
The published months must sum to the report's own grand total, which is the one figure on the page printed to the dollar. This is what turns the display-rounding from an unknown into a measured bound.identity80 published months sum to $31,502,740,000 against a printed grand total of $31,502,764,874: a residual of $24,874 inside a rounding bound of $940,000.
Each year's twelve monthly cells must sum to the annual-total cell the same table prints beneath them, within both figures' display rounding.identityall 7 years hold; the widest is 2025, whose months sum to $4,434,410,000 against an annual cell of $4,430,000,000, a residual of $4,410,000 inside a $5,150,000 bound.
DCC's months, summed to a quarter, against CDTFA's quarterly columns for the same quarter. The two are not expected to agree.cross source reconciliationover 14 overlapping quarters CDTFA's cannabis-gross column runs between 87.0% and 91.8% of the DCC month-sum, and its taxable-sales column between 103.6% and 111.9% of it.
Whether this monthly total can be split into medical and adult-use.uncheckedNot cross-checked. No official medical-versus-adult-use sales split exists anywhere in California. The licence-level `licenseDesignation` attribute is a property of a licence, not of a sale, and must never be presented as one.
The regulator's own notes, and what is still open

The regulator's own notes

Everything on this page comes from the CDTFA Open Data Portal's cannabis category - 6 datasets, all keyless OData v4, all quarterly or annual. California's licensing regulator publishes a monthly series, but only inside an embedded dashboard with no export, and it is out of this pipeline's scope by decision. Nothing here is interpolated to monthly. — CDTFA Open Data Portal, cannabis datasets

Two dollar columns, two different things. The headline is the cannabis figure - the base the excise tax is levied on. The wider taxable-sales column includes non-cannabis merchandise sold in the same shops, by CDTFA's own definition, and is shown separately because it is the only column covering the years before 2023-Q1. — CDTFA Open Data Portal, cannabis datasets

Quarters get revised. CDTFA republishes the whole history every edition and says amounts are subject to change, so figures here may differ from a figure read last quarter. This pipeline has measured 213 such change(s) across 1 edition(s) it has seen; they are listed in revision.observed_revisions and in raw/REVISIONS.jsonl. — CDTFA Open Data Portal, cannabis datasets

Open questions on this data

Unresolved definitional questions that gate something. Listed because a question nobody can see is a question nobody closes.

  • Does CDTFA's reported cannabis-sales figure include or exclude the excise tax and the sales tax? Closing it needs: A CDTFA methodology statement, a data-request answer, or a definition on the portal. Not by reasoning from the statute: ANCHORS 6 forbids filling a basis axis from general knowledge of a state's tax law, and the same silence is why the District of Columbia's flag stays unstated.
  • How much of CDTFA's taxable-sales column is non-cannabis merchandise? Closing it needs: CDTFA would have to publish a cannabis-only cut of the taxable-sales column, or a breakdown of the difference. Neither exists in the 6 datasets its cannabis category carries.
  • Why do 2 early quarters of county detail not sum to their own statewide total? Closing it needs: CDTFA would have to restate those quarters or say which figure is authoritative. Both sets are republished every edition, so a future run may simply find them reconciled.
  • Should California's monthly series be ingested from the licensing regulator's embedded dashboard? Closing it needs: ANSWERED, this file carries the result. DECISIONS Q8 accepts a headless browser for exactly this one series; `pipelines/ca_monthly/` builds it with its own shape assertion and the merge is applied here. What stays open is not the decision but the source: Looker publishes no compatibility contract, so the scrape can break without notice. Its degrade posture is `quarterly_only` - it writes nothing and leaves the previous feed alone - and this page then renders on the CDTFA record with no monthly line, which is the state it was in before the merge.

Publication notices

Know when a new month of figures is added — no email address, no account.

Follow the feed

Paste this address into any feed reader and a new entry appears each time a month of figures is published. Nothing is stored about you, and there is never advertising.

https://cannabisdataproject.com/feed.xml

New to feeds? A reader such as Feedly, Inoreader, NetNewsWire or Thunderbird checks the address for you and shows new entries as they appear.