Cannabis Data Project
Massachusetts · Adult-use and medical

Massachusetts' cannabis market, by the numbers

Showing—
Loading…

Loading the latest CCC figures…

At a glance

Where the market is heading

Adult-use is sales to any adult 21+. Medical is sales to registered patients. Adult-use retail opened 20 November 2018, the first on the East Coast; medical dispensing began three years earlier, but the Commission's data starts with the adult-use launch, so the medical line here is where the records begin and not where the programme did.

Monthly sales by channel

April 2020 is real. Adult-use retail was closed for the COVID shutdown and took $2,768 across the whole month, against $50.3m in March. Medical was allowed to stay open and took $22.8m. The dip is drawn rather than smoothed, because it is what the Commission published and because it is the single clearest thing in this chart about how the two channels differ.

The latest month shown is always a complete calendar month. The Commission refreshes its file most days, so the month in progress is deliberately held back rather than drawn as a collapse.

Who is buying

Massachusetts publishes its two channels as two separate extracts carrying an industry flag set per transaction, so this is a genuine measured split rather than an inference from what kind of licence a shop holds.

Retail dollars by channel

Summed across the selected range

What is selling

Adult-use, by product type

the Commission's own category labels, grouped

    Medical, by product type

    the Commission's own category labels, grouped

      What a gram of bud costs

      Massachusetts reports dollars and grams side by side for each product category, so a price per gram can be worked out from the state's own figures. Buds is the Commission's own category and it is bud alone — shake, trim and both kinds of pre-roll are counted separately — which is what makes this line comparable with DC's and Maryland's.

      Average price per gram

      Three lines, and the third is a check on the first. The Commission publishes its own average retail price per gram. We derive ours by summing the underlying rows, the way we do for every state, and show theirs beside it. Across all 93 months the two agree to within six cents and ours is always the lower; the Commission publishes no methodology, so the difference is reported rather than explained away.

      Prices are for bud sold by weight. The tax basis is not stated anywhere in the Commission's data, so whether these figures include the 10.75% excise and 6.25% sales tax is unknown and is not guessed at.

      Questions about this data

      Why does June 2026 not show a record month?

      Because it was not one. The Commission's file labels each row with the extract batch it arrived in rather than with a sales period, and on two June dates the same day arrived twice — once in a batch that counts every transaction's dollars twice over. Summed naively, June 2026 comes to $156.4 million and reads as an all-time high; several outlets published that figure. De-duplicated it is $139.8 million, which is $4.66 million a day and sits smoothly between May's $4.65 million and July's $4.82 million.

      How do you know which copy of those days is the right one?

      The two copies disagree in a specific way. Dollars and grams are sums and they come out at almost exactly two to one; receipts are a count of distinct sales and they come out equal. That is what happens when the same transactions are counted twice, and it is not what happens when two genuinely different sets of sales are added together. The copy we keep also shows an average basket of $34.89, in line with the days either side; the copy we drop shows $69.80.

      Does this match the Commission's own published totals?

      Every one we could find. The Commission announced passing $9 billion in cumulative adult-use sales on 4 February 2026, with $151 million so far that year; it reported $1.65 billion for calendar 2025 and $1.57 billion cumulative medical. All four agree with the figures on this page, and the $9 billion threshold is crossed on exactly the day the Commission named. None of them reaches June 2026, which is why the de-duplication above rests on the structure of the rows instead.

      Why is there no patient count?

      Massachusetts does not publish one. The Commission's data catalogue lists fifteen datasets — sales, licences, applications, agent demographics and testing — and none is patient-related. Seven likely endpoint names were also tried directly and each returned a genuine 404 in a run where a known-good file downloaded normally. So it is not published here, rather than published somewhere we did not look hard enough.

      Are these figures before or after tax?

      Not stated. Massachusetts charges a 10.75% excise plus 6.25% sales tax on adult-use and exempts medical, but the Commission's data platform carries no data dictionary and no methodology note — a full-text search of both of its open-data pages returns nothing for tax, excise, gross, net, discount or definition. Reasoning from the tax code to an answer would be a guess, so the basis is recorded as unstated.

      How many shops are open?

      This page counts licences, not open storefronts, and the two are not the same: a licence can be active without the business trading. There are 949 active licences across every type, of which 457 are retailers. The Commission's licence files carry business email addresses, phone numbers and tax identification numbers, so they are aggregated to counts and never republished.

      Where these figures come from

      Sourcing, basis and comparability

      Medical dispensing began in 2015 under the Department of Public Health; adult-use retail opened on 20 November 2018, the first on the East Coast. The Cannabis Control Commission now regulates both and publishes them in one schema, so the medical/adult-use split is a genuine per-transaction industry flag rather than a licence attribute. The CCC's open data begins 2018-11, three years after medical sales started, so this page's medical line is a data floor and not a start date.

      Retail sales Partly comparableMedical / adult-use split Partly comparablePrice per gram Like-for-likePer capita Partly comparablePatient counts Not like-for-likeLicence counts Partly comparableTax revenue Not like-for-like
      Basis — CCC daily sales extract, summed to calendar months
      Measurement
      measured
      Money
      unstated
      Tax
      unstated
      Period
      calendar_month
      Scope
      retail_only
      Geography
      statewide
      Channels
      medical, adult_use

      The regulator's own words: The word 'gross' appears only in the CCC's own filenames -- a_sales_au_gross.csv and a_sales_mtc_gross.csv -- and in press-release prose ('gross adult-use sales', '$1.57 billion in gross patient sales'). The data-catalog page that links those files titles them 'Marijuana Establishment Facility Sales and Statistics' and 'Medical Treatment Centers - Facility Sales', without the word. Nothing anywhere defines what it excludes.

      Why an axis above reads unstated: Checked negative, re-run on every build and reproducible by anyone: `python pipeline.py --offline` re-searches the mirrored corpus under raw/basis/ and regenerates this sentence from the counts, so the claim cannot drift from its evidence. Run date is sources.canonical.verified_on. Corpus: both CCC open-data pages (data-catalog.html, 128,081 bytes, open-data.html, 123,468 bytes) plus all 5 processing scripts the data-catalog page links under '2025 Industry Report'. Needles: 'tax', 'excise', 'gross', 'net of', 'discount', 'exclud', 'methodolog', 'definition', 'data dictionary'. ZERO hits for 'excise', 'net of', 'discount', 'exclud', 'methodolog', 'definition', 'data dictionary' across every artifact. NOT zero, and stated rather than rounded down to zero: 'tax' x1 in adultMedical_MEs_processing.Rmd; 'tax' x1 in facilitySales_processing.Rmd; 'tax' x1 in monthlyPrice_processing.Rmd; 'tax' x1 in testing_processing.Rmd; 'gross' x4 in data-catalog.html; 'tax' x1 in open-data.html. Every one of those hits is plumbing, not a definition: the 'gross' hits are the dataset download URLs a_sales_au_gross.csv/.json and a_sales_mtc_gross.csv/.json, the page 'tax' hit is the sentence 'This safely regulated industry will contribute through economic development, job growth, and tax revenue', and every script 'tax' hit is the substring inside the filename 'Data_syntax.Rproj'. So the platform is NOT silent -- it publishes 5 processing scripts, and saying otherwise was the round-1 error -- but those scripts define date parsing and category rollups over a column set that only partly overlaps the live extract. Measured against the CURRENT header on every run, not recalled: 4 of the 12 live columns are spelled identically in those scripts (SaleDate, Industry, ProductCategoryName, UnitOfMeasureName). The naming is therefore NOT wholesale superseded -- the 2026-08-18 re-casing moved the live spelling TOWARDS the scripts, and a sentence written before it claimed a mismatch that no longer exists. What the scripts compute money and counts from is the real gap: CountBasedTotal, DollarCountBasedTotal, DollarWeightBasedTotal, WeightBasedTotal occur in the scripts and in no live column, and the live money and count columns (Quantity, Units, TOTAL_$, Receipts) occur in no script. So the scripts cannot be read as a dictionary for the extract's value columns, and -- the point the flags rest on -- not one of them says whether a dollar figure is gross of discounts or whether it carries tax. What IS still absent, and is what the flags rest on: no artifact in this corpus is a data dictionary or links to one, and the 7 needles listed above as ZERO -- which include 'data dictionary', 'methodolog', 'net of', 'discount' and 'excise' -- do not occur anywhere in it. Massachusetts levies a 10.75% excise plus 6.25% sales tax on adult-use and exempts medical, but reasoning from that to a flag value is exactly what ANCHORS 6 forbids -- so money and tax both stay unstated. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.

      Basis — Bud price per gram, derived from paired CCC dollars and grams
      Measurement
      derived
      Money
      unstated
      Tax
      unstated
      Period
      calendar_month
      Scope
      retail_only
      Geography
      statewide
      Channels
      adult_use

      The regulator's own words: SOURCED. The CCC's own processing script medical_market_data_processing.Rmd -- published on the data-catalog page under '2025 Industry Report' as one of the 'corresponding processing scripts', mirrored at raw/basis/methodology/ -- sets out the Commission's category taxonomy verbatim. In its 'clean up product categories' chunk 'Buds' maps to itself: `ProductCategoryName == "Buds" ~ "Buds"`, while `"Shake/Trim"` and `"Shake/Trim (by strain)"` are grouped separately as 'Shake/Trim' and `"Raw Pre-Rolls"` and `"Infused Pre-Rolls"` each keep their own label. Its next chunk, 'create broader categories', then rolls Buds, Shake/Trim and Fresh Frozen Flower up into a BROADER category the CCC calls 'Flower', and sends Raw Pre-Rolls and Infused Pre-Rolls to a separate broad category 'Pre-Rolls'. So the regulator itself distinguishes whole bud from the wider flower grouping, and this page's basket is the narrow one -- which is precisely the DC / Maryland distinction ANCHORS 5 records as the price_flower_g trap, stated by the source rather than inferred by us.

      Why an axis above reads unstated: money and tax only; inherited from ccc_daily and the same checked negative applies. The BASKET axis is no longer unstated -- see source_statement. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.

      Derivation. sum(TOTAL_$) / sum(Quantity) over ProductCategoryName='Buds' and UnitOfMeasureName='g' Error: No unit conversion and no assumed constant: the source already reports these rows in grams. The only judgement is the basket, and the basket is the CCC's own category label..

      Basis — The CCC's published average retail price per gram
      Measurement
      measured
      Money
      unstated
      Tax
      unstated
      Period
      calendar_month
      Scope
      retail_only
      Geography
      statewide
      Channels
      adult_use

      The regulator's own words: The data-catalog page titles this file 'Average Monthly Price per OUNCE for Adult-Use Cannabis' while the file's own column is AVERAGERETAILPRICEPERGM and its UNIT column reads 'Grams' on all 93 rows. The file wins -- the values track a per-GRAM series to $0.061 max against our own derivation, and are two orders of magnitude away from a per-ounce figure -- but the catalog title is wrong, and a reader who took it at face value would be out by 28.35x. Recorded because it is the same class of source mislabel as ABCA's Feb-2025 report titled JANUARY 2025.

      Why an axis above reads unstated: Inherited from ccc_daily; the same checked negative applies. An undocumented basis is a gap to be labelled, never filled in with the most likely answer.

      Basis — CCC licence register, counted
      Measurement
      measured
      Money
      not_applicable
      Tax
      not_applicable
      Period
      point_in_time
      Scope
      retail_only
      Geography
      statewide
      Channels
      medical, adult_use
      Sources 2
      Where every figure on this page comes from
      RoleSourceFormat FromLast verifiedNote
      CanonicalCCC Open Data - gross sales extracts (adult-use and medical)
      Massachusetts Cannabis Control Commission
      csv2018-112026-08-23Two files, one dataset: a_sales_au_gross.csv (Industry='Adult-Use') and a_sales_mtc_gross.csv (Industry='Medical'), identical 12-column schema. a_sales_au_deliveries.csv is a strict SUBSET of the adult-use file -- all 33,994 of its rows are the delivery-typed rows already present -- and is deliberately NOT ingested, because adding it would double every delivery dollar.
      Cross-checkCCC Open Data - Adult-Use Average Retail Price per Gram
      Massachusetts Cannabis Control Commission
      csv2018-112026-08-23Never averaged with the canonical figure. Max |diff| $0.0610 at 2022-09, mean |diff| $0.0308, across all 93 months. Signed, it runs $-0.0029 to $0.0610 with a mean of $0.0307, and it is NOT one-signed: the published figure is the higher in 92 of 93 months and the lower in 1 (2020-04, worst $-0.0029 at 2020-04). Unexplained -- the CCC's published scripts never state how it is computed -- so it is reported, not fitted away.
      Why each marker above says what it says
      How this state compares with the others
      MetricMarkerWhy
      Retail salesPartly comparableMassachusetts reports measured daily transactions summed to calendar months, which is the closest of any state to the anchor definition. But the Commission's published methodology covers date parsing and category rollups only and never says whether a dollar figure is gross of discounts or whether it carries the 10.75% excise and 6.25% sales tax, so both are unstated -- the same silence DC's report has, and two silences are not a match.
      Medical / adult-use splitPartly comparableA genuine split: the two channels are two separate extracts carrying an Industry flag set per transaction, not a licence attribute. The caveat is the floor, not the split -- medical dispensing began in 2015 and the Commission's data begins in November 2018, so the medical line here is three years shorter than the programme and its early share cannot be compared with a state whose medical history is complete.
      Price per gramLike-for-likeBud-only and matched to DC and Maryland on basket, not on field name, and the Commission's own published processing script says so rather than us inferring it: medical_market_data_processing.Rmd keeps Buds as an atomic category, groups Shake/Trim separately, leaves Raw Pre-Rolls and Infused Pre-Rolls with their own labels, and rolls Buds + Shake/Trim + Fresh Frozen Flower up into a BROADER category it calls Flower while sending pre-rolls to a separate one. The basket therefore excludes what Maryland's flower TYPE wrongly includes, on the regulator's authority. The tax basis is unstated, unlike Maryland's ex-tax figure. Held off the cross-state chart by an open question, not by a data problem: DECISIONS Q7 excludes Massachusetts as all-product, and that premise is falsified above. Blocked until ma_q7_basket_reclassification is resolved, whatever the status above says.
      Per capitaPartly comparablePer-resident figures inherit every flag on the numerator, so the unstated money and tax basis travels with them. Two population vintages are spliced because this series predates Vintage 2025's first year: 2018 and 2019 come from Vintage 2020.
      Patient countsNot like-for-likeMassachusetts publishes no patient or registry dataset. The Commission's catalog enumerates fifteen endpoints -- five sales, four licence and application, two agent demographic, two testing -- and none is patient-related; seven plausible endpoint names were probed directly and each returned an honest 404 in a run where a known-good control file returned 200. That is a checked negative, so treat it as not found rather than proven not to exist.
      Licence countsPartly comparableCounts only. The Commission's licence extracts carry BUSINESS_EMAIL, BUSINESS_PHONE and EIN_TIN on every row, so they are aggregated in memory and never mirrored. The count is of licences, not of open storefronts: the register includes provisional and final licences across every type.
      Tax revenueNot like-for-likeThe Commission publishes no tax dataset. Massachusetts Department of Revenue reports a marijuana excise line in its monthly collections, and this file does NOT ingest it: no DOR artifact is fetched, mirrored or declared as a source here, so no figure from it is quoted and no reconciliation against it is claimed. What this parse can say is what the statutory 10.75% would imply from the sales it does hold - $15.5M from 2025-07 adult-use and $14.7M from 2025-06 - and that DOR's line is a different base on a different accrual. Adopting it without establishing what it measures would be exactly the unsourced conversion this project forbids.
      What is checked on every run 4
      What is checked on every run
      CheckKindLast result
      Every figure the CCC has published about its own sales data, against this parse.cross source reconciliationcum_9b=pass (computed $9,001,042,180.50); ytd_2026=pass (computed $151,075,098.72); cy2025=pass (computed $1,651,850,578.77); cum_mtc=pass (computed $1,567,134,969.97)
      Derived bud $/g against the CCC's own published price-per-gram file.cross source reconciliationpass
      After de-duplication, no date's average basket may exceed 1.40x the median of its surrounding 15 days.shape assertionpass
      The medical/adult-use split has no independent decomposition to check against.uncheckedNot cross-checked. The split is structural: the two industries are two separate files, so their totals cannot fail to sum to the total by construction. Nothing in the CCC's data reconciles the split against an outside measure, and unlike DC's headline this one is not over-determined. Saying so is the point.
      The regulator's own notes, and what is still open

      The regulator's own notes

      Massachusetts publishes daily rows labelled with the extract batch they arrived in, not with a sales period. Two dates in June 2026 arrived twice, and one of the two copies counts every transaction's dollars and grams twice over while counting its receipts once. This page keeps, for each date, the batch with the most receipts -- the measure that does not inflate when a transaction set is duplicated -- and drops the other. Without that step June 2026 reads as a $156.4M record month; with it, it reads as $139.8M, which is the figure that fits the days either side of it. — This site's method note

      The parse is checked against every sales figure the Commission has itself published: $9 billion cumulative adult-use and $151 million year-to-date, both as of 4 February 2026, $1.65 billion for calendar 2025, and $1.57 billion cumulative medical. All four agree, and the $9 billion threshold is crossed on exactly the day the Commission named. None of them reaches June 2026, which is why the de-duplication above rests on the structure of the rows rather than on a published total. — Cannabis Control Commission press releases, 2026-01 and 2026-02

      Open questions on this data

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

      • DECISIONS Q7 excludes Massachusetts from the cross-state price chart on the ground that its price series is all-product. Is that ground still standing? Blocks: price_per_gram. Closing it needs: Chris reopens Q7, or confirms the exclusion on some other ground. This file declares the honest flags and gates itself out of the chart meanwhile; it does not overrule a binding decision.
      • What does the Receipts column count -- transactions, or receipt-lines within a product category? Closing it needs: Ask the CCC. There is no data dictionary on the platform.
      • Are the CCC's 'gross sales' figures gross of discounts, and do they include the 10.75% excise and 6.25% sales tax? Closing it needs: Ask the CCC, or find a basis statement outside the open-data platform. The five processing scripts the platform DOES publish were read and are silent on it.

      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.