Cannabis Data Project
Cross-market comparison

Markets side by side, only where they line up

——
Basis
Channel
Time unit
Latest month
Up to 6 jurisdictions share an axis.

Loading every jurisdiction’s figures…

At a glance

Retail spending over the selected range, one tile per jurisdiction. The default basis is per resident, because raw dollars between markets of very different size is the single most misleading thing this page could do. Each tile carries the month its own regulator has reached — they do not publish on the same clock.

Retail sales over time

Dollars paid at licensed retail, by calendar month, summed from the most granular rows each source publishes. A jurisdiction joins this axis only if its own data file says it can; the ones that cannot are listed underneath with the reason, not quietly dropped.

Licensed retail sales

Lines break where the source published nothing. A bridged line would draw a month the regulator never reported, which is the defect class this whole site exists to avoid.

Alcohol, for scaleannual

A second yardstick, on its own axis. This chart shares only the time axis with the one above — never a vertical scale, because gallons of ethanol and dollars of cannabis are not the same kind of quantity and a ratio taken across them would mean nothing. The marker on each line is the first month this site holds cannabis sales for that jurisdiction, so you can see what drinking was doing while a cannabis market opened.

Apparent alcohol consumption per person

Apparent consumption, not a survey. NIAAA derives these figures from alcoholic beverage sales, tax receipts and shipment data, so they count alcohol SOLD in a state. Cross-border buying and tourism land in the state of sale, which is most of why New Hampshire sits at the top of this chart every year.

Volume, not spend. NIAAA publishes gallons of ethanol; there is no state-level alcohol sales-dollar series behind it. That is the second reason these two charts can never share an axis.

A different denominator. Per person aged 14 and over, which is NIAAA's own base — the cannabis figures on this site divide by total resident population. The populations ship in data/alcohol.json so either series can be recomputed on a common base.

The series is annual and ends in 2023, so it stops short of the cannabis lines rather than being extended to meet them.

What a gram of bud costs

The cleanest comparison available: a price per gram carries no population in it, so nothing has to be divided out. It is also the strictest — this axis is whole bud only, excluding pre-rolls, shake and trim, so a jurisdiction whose published basket is wider is listed as excluded rather than quietly averaged in.

Whole bud, average price per gram

The basket is the rule, not the field name. Where one regulator files pre-rolls and shake inside its flower category and another does not, matching on the word flower would compare two different things — worth about two per cent, and it moves with product mix rather than with price.

A price is never converted from a per-package figure, and never from a per-unit figure whose weight is not defined in a citable source. A jurisdiction without a weight basis is excluded from this chart rather than assumed onto it.

Medical and adult-use, per market

Each jurisdiction's own channel structure, on its own terms. A single-channel market is a different kind of thing from a market with a medical share, so it is labelled as one rather than ranked against the others — a medical-share league table across mixed and single-channel markets is mostly a map of which places license adult-use retail.

A channel that had not opened yet is a declared gap carrying its own sentence, never a zero. Zero would say the channel existed and sold nothing, which is a different and false claim.

Patient counts, by what they measure

There is no single definition of a patient count, so there is no single chart. Jurisdictions are grouped by the measure they actually publish, and each measure gets its own panel. A cumulative registration total that only rises and a current stock that falls as patients migrate to adult-use are not two readings of one number.

Quarterly marketsquarterly

Several states publish quarterly and nothing finer. When the rest of the selection is monthly, they get their own view rather than a place on the monthly chart, because spreading a quarter across three months is an invented number whatever arithmetic produces it. Select one of them and the charts above switch to quarters instead — summing the monthly markets up is exact, and spreading a quarterly one down never is.

Licensed retail sales, by quarter

This section reads the quarterly series and has no code path that turns a quarter into months. When the selection resolves to quarters this section folds, because the markets it holds are then on the main axis above rather than beside it.

Arrests, before and after each legalization

Annual figures · not affected by the month filter

Like-for-like Both series are possession arrests per 100,000 residents, each divided by its own population in that same year, so the size difference between the two jurisdictions is already removed.

This one marker is declared in the page config rather than derived from a state file, because its data is arrests.json: FBI/UCR and local-police counts, a different corpus on a different revision model and a different grain, with its own spec. Folding it into the state schema would imply a comparability that has not been established.

How possession enforcement changed in each jurisdiction.

Every metric, every jurisdiction

Derived at load, never stored

The full comparability declaration for each jurisdiction on screen, read from its data file at load. Nothing in this table is stored in the page — change a basis flag in a state file and the marker here changes with it, which is the only arrangement in which a marker cannot go stale while a gate stays green.

Show the full comparability matrix

Where these figures come from

One canonical source per jurisdiction

One canonical source per jurisdiction. Where a regulator publishes a second series measuring the same thing, it is carried on that jurisdiction's own page as a labelled cross-check — never averaged into the figure above, and never silently substituted for it.

Show every source, cadence and coverage window

Reading this comparison honestly

  • Nothing on this page is estimated. Every figure is one a regulator published, read from that jurisdiction's own filing. Where a month is missing it is drawn as a gap with the reason printed beside it, never bridged and never filled with a zero.
  • Per-resident figures divide each period by that jurisdiction's own population for that period's year, taken from the Census Bureau's July 1 estimates (Vintage 2025, NST-EST2025-POP). Never one fixed denominator across a series, and never across grains — a quarterly market's per-resident figure is three months of spending and is charted apart from the monthly ones. Years beyond the latest published estimate use the latest one and say so, per jurisdiction, in the panel above. Source: Census Bureau population estimates.
  • Dividing by population does not make two numerators comparable. A per-resident ranking is only as comparable as the least comparable figure in it, so every basis flag on the numerator is repeated on the per-resident view rather than left behind on the source chart.
  • Markers are structural, not decorative. Like-for-like, Partly comparable and Not like-for-like each carry a word rather than only a colour, and each states why. They are computed from the state files every time the page renders, so a marker and the condition it describes cannot drift apart.
  • Grains are never mixed on one axis, and they are only ever climbed upward. Select a market that publishes quarterly and every chart here switches to quarters, summing the monthly markets’ complete quarters — exact arithmetic that loses nothing. A quarter missing any of its months is drawn as a gap, never as a partial total. Nothing is ever spread the other way: a monthly figure a regulator did not publish is an invented number, whatever arithmetic produced it.
  • A jurisdiction that cannot join a chart is listed on it. Under every chart is the set of selected jurisdictions that were excluded, each with the reason its own data file gives. A silently shorter chart is indistinguishable from a chart nobody thought about.
  • Unlicensed markets appear in none of this. Gifting shops, delivery outside the licensed channel and the illicit market are outside every dataset here, in every jurisdiction.

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.