Methodology

How we compute strain lab statistics

Our state-lab potency statistics come from 17,793 flower tests in public data, matched to strain names by strict rules. This page documents each step and its limits. Breeder specifications and other published potency descriptions are separately attributed in the guides.

Generated 2026-10-02. All numbers below are computed from the source files; nothing was imputed.

Downloads: summary by strain (CSV) and full aggregates (JSON). Guides with the original test rows provide a downloadable per-test CSV. Guides with only the published aggregates provide a labelled JSON summary and omit per-test histograms.

1. Source

State File Bytes Last commit Rows read Name fields in file Flower tests used
CA data/ca/ca-results-latest.csv 1,585,774,619 2026-02-02 85,487 strain_name, product_name, product 410
FL data/fl/fl-results-latest.csv 305,684,201 2026-02-02 16,309 strain_name, product_name 43
NV data/nv/nv-results-latest.csv 98,519,804 2024-08-16 153,064 product_name 4,520
OR data/or/or-results-latest.csv 38,932,645 2024-08-16 196,900 — (none) 0
MA data/ma/ma-results-latest.csv 35,460,727 2024-08-16 75,164 product_name 350
MD data/md/md-results-latest.csv 32,885,944 2024-08-16 105,013 strain_name 4,394
HI data/hi/hi-results-latest.csv 27,109,389 2024-08-16 13,485 strain_name, product_name 257
MI data/mi/mi-results-latest.csv 13,171,269 2024-08-16 89,956 product_name 3,707
UT data/ut/ut-results-latest.csv 9,639,780 2024-08-16 1,230 strain_name, product_name 22
RI data/ri/ri-results-latest.csv 7,318,634 2024-08-16 25,832 — (none) 0
NY data/ny/ny-results-latest.csv 2,374,548 2024-08-16 330 strain_name, product_name 10
CO data/co/co-results-latest.xlsx 13,405,514 2024-08-16 25,798 product_name 138
CT data/ct/ct-results-latest.xlsx 74,288,499 2024-08-16 19,963 product_name 18
WA data/wa/wa-results-latest.xlsx 56,124,010 2024-08-16 202,812 strain_name, product_name, inventory_name, product_description 3,924

Files deliberately not used: data/all/all-results-latest.csv (2.5 GB; the per-state files were used instead); the .xlsx twins of the CSV files; and the newer Connecticut COA exports data/ct/ct-coa-data-*.xlsx (last commit 2026-02-02), which were not used in this release. The CT figures here come only from ct-results-latest.xlsx (sheet Values, 19,963 records = the full file).

The dataset README notes that the data are a non-random subset of all lab results and that data about individuals may not be used commercially. The public CSV produced here contains no producer, licensee or personal fields.

How to cite (use exactly)

Source: Cannlytics, cannabis_results (CC BY 4.0), analysis by Official Cannabis.

CC BY 4.0 also asks for a link to the license and an indication that changes were made; on the web page, link “CC BY 4.0” to the license URL above and note that the data were filtered, de-duplicated and aggregated.

2. Pipeline

  1. Streaming. Every CSV was streamed over HTTPS straight into a CSV parser (the 1.59 GB CA file was never written to disk). The three xlsx-only states (CO, CT, WA) were downloaded temporarily, read with openpyxl and deleted. A deliberately broad regex pre-filter kept every row whose name fields mention any strain stem (e.g. blue\W*dream, chem, diesel, g\W?13), so strict matching could be redone offline.
  2. Name field. strain_name if present, else product_name (WA: strain_name, checked against the product name / inventory name; UT: strain parsed from the “Strain: … Lab Tracking” text when needed).
  3. Strict matching (section 3), product-type filter (section 4), value extraction (section 5), de-duplication (section 6), plausibility filter (0 < total THC ≤ 40 %), then statistics (section 7).

3. Strain matching rules

Normalisation. Lower-case; accents and curly quotes folded; possessives collapsed (lamb's → lambs); content in parentheses/brackets set aside; compound packaging words joined (pre-roll → preroll, pop corn → popcorn, fresh frozen → frozen, sugar shake → shake); tokens split on any punctuation. Aliases may be written with or without spaces/hyphens (BlueDream, G-13, C-99, Chem-Dawg all match).

STRICT match = after normalisation the name consists of exactly one alias (contiguous tokens) plus only non-name tokens, before or after it. Non-name tokens are: weights and fractions (3.5g, 1/8, oz, lb, eighth, dime …), numbers and alphanumeric lot/batch/test codes (#2, T18.8, TLMB1206202201), packaging and form words for flower (flower, bud(s), smalls, popcorn, bulk, lot, jar, pouch, sample, test, QA …), quality grades (A/B, AAA, tier, top shelf, premium), cultivation words (indoor, outdoor, greenhouse, light-dep, organic …), lineage words (sativa, indica, hybrid, S/I/H, fem), and 1–2-letter codes (except name-like abbreviations such as OG, NL, SD, NY, LA, SF, UK).

Excluded (counted as near-matches): any extra strain-name word before or after the alias (Santa Cruz Blue Dream, Super Sour Diesel, Blue Dream OG, Platinum GSC, Gelato Cake, Royal Wedding Cake); any cross marker (x, cross, bx, f1/f2, s1); names containing two different target strains; glued variants (Blue Dreamsicle); CBD variants (CBD Blue Dream, Lambsbread (CBD)); a cross or another strain inside parentheses. In rows whose source product type is flower, concentrate/edible words are treated as name words (so Blueberry Crumble — a different cultivar — is excluded rather than mistaken for a concentrate).

Brand / producer prefixes stripped only where obvious: (a) a first segment before a separator (-, |, :) that recurs in front of ≥3 different product names in the same state file (e.g. Cloud Cover - GSC - Bulk, Virtue - G13 - Lab Sample); (b) leading words equal to the leading words of the row’s producer/brand field (≥2 words, or one ≥4-letter word that is not a common strain word); (c) a short curated list of brand/descriptor names verified in the data (none is a strain word): travis x james, true humboldt, true mom pop, true mom & pop, almora farm, oz farms, joy ridge, circle s farms, summit buds, cloud cover, franklin fields, charlie walter, luman chichester, med to au transfer, proficiency test, for packaged flower, farmer and the felon, time machine, trb, tcs, summa, sst, cannasol, curaleaf, virtue, kushman, wcc, wwp, led, hps. Examples: TRB = Tahoe-Reno Botanicals (producer field), SUMMA = Euphoria Wellness, Kushman = one NV producer’s line used in front of many different strains. (d) breeder-of-record prefixes, accepted only in front of the cultivar that breeder released: DJ Short + Blueberry, Ken's + Granddaddy Purple, Josh D + OG Kush.

Alias table: each strain’s common names plus obvious spelling and spacing variants found in the data (sour deisel, jack herrer, grand daddy purple, train wreck, girl scout cookie, northern light, lamb breath …); glued/hyphenated forms (BlueDream, G-13) are matched automatically:

Strain Group Aliases matched
Blue Dream network blue dream
Sour Diesel network sour diesel, sour d, sour deez, sour deisel, sour diesal
Green Crack network green crack, green crush, green cush
Northern Lights network northern lights, northern light
Purple Urkle network purple urkle, purple urkel
Blue Cheese network blue cheese
Cinderella 99 network cinderella 99, c99, cindy 99
Hindu Kush network hindu kush
Chemdawg network chemdawg, chemdog, chem dawg, chem dog, chem 91, chem 4, chem d
Grape Ape network grape ape
G13 Haze network g13 haze
G13 network g13
Lemon Kush network lemon kush
Agent Orange network agent orange
Lamb’s Bread network lambs bread, lambsbread, lambs breath, lamb bread, lamb breath
Lime OG network lime og
Critical Jack network critical jack
Pineapple Express comparison pineapple express
OG Kush comparison og kush
Jack Herer comparison jack herer, jack herrer
Durban Poison comparison durban poison
Granddaddy Purple comparison granddaddy purple, grandaddy purple, grand daddy purple, granddaddy purp, grandaddy purp, grand daddy purp, gdp, granddaddy purps, grandaddy purps, grand daddy purps
Super Lemon Haze comparison super lemon haze
Girl Scout Cookies comparison girl scout cookies, girl scout cookie, gsc
Gelato comparison gelato
Wedding Cake comparison wedding cake
Blueberry comparison blueberry
Trainwreck comparison trainwreck, train wreck
Strawberry Cough comparison strawberry cough

Chemdawg sub-buckets. All strict Chemdawg matches form the main bucket; sub-buckets are plain (no designator), 91 (Chemdawg 91 / Chem 91 / Chem ’91), 4 (Chemdog #4 / Chem 4), d (Chem D / Chemdog D) and other_number (pheno-hunt/lot numbers such as Chem Dawg #173). Chem 4 and Chem D are accepted as the standard short forms of Chemdog #4 / Chemdog D; they are reported separately in the aggregates JSON (chemdawg.sub_buckets) so they can be dropped. G13 Haze and G13 are separate strains (G13 Haze never counts as G13).

strain_name vs product name. Where a row has both, the product name is checked: if it names a different target strain, a cross/variant of the strain, or another cultivar, the row is excluded as a conflict.

Washington. In the WA file the joined strain_name frequently contradicts the product / inventory name (e.g. strain “Jack Herer” on product “Flower Lot (A-bud) - A-bud - Nitro Cookies - (g)”). Among WA flower rows involving a target strain: 4,329 have both fields agreeing; 1,018 conflict; 422 have a product name for a target strain but a different strain_name; and 7,118 carry only a generic product name (“Flower Lot”). Because the join is unreliable, a WA test is used only when strain_name and the product/inventory name independently name the same strain; the generic-name rows are excluded and counted as wa_uncorroborated_flower.

4. Flower-only filter

Each row’s source product type is mapped to: flower, shake/trim, pre-roll, infused pre-roll, concentrate, edible/topical, wet/whole plant, hemp, other, unknown. Only “flower” enters the statistics. Flower types by state: CA Flower; Flower, Inhalable; Flower, Medical Inhalable; Flower, Product Inhalable; Plant (Flower - Cured) · CO Flower, Inhaled Product · CT Raw material (flower), Usable Marijuana, Flower… · FL Flower, Flower Inhalable · HI Flower Lot · MA flower · MD Buds · MI Flower · NV Marijuana Flowers/Buds, Small/Popcorn Buds, …-Packaged · NY Flower · UT Flower, Packaged Flower, Bulk Flower · WA Flower Lot, Flower Unlotted, Usable Cannabis/Marijuana (Leaf: from the [strain - type - size] bracket of the inventory name). Shake/trim, hemp and “Flower, Non-Inhalable” are excluded. A flower-typed row is re-classified (and excluded) when its name says pre-roll/joint/blunt/cone, infused, shake/trim/grind, fresh-frozen/whole-plant, or proficiency test. UT: most rows have no type; rows whose UDAF tracking number starts with “F” are treated as flower (all explicitly typed UT flower rows carry an F number) and flagged in flags.

5. Values and units

6. De-duplication

The CA file contains the same certificate parsed several times (different sample_hash, same lot and values); Metrc states repeat one lab result on every child package. Within each strain, tests are dropped when they share (1) a sample_id, results_hash or WA lab_result_id, or (2) the same state, lab, producer, test date, total THC, total CBD, THCA and Δ9-THC (rounded to 0.001). Rule (2) is not applied to WA CCRS rows, whose potency is reported in whole or tenth percent and which have a unique lab_result_id per test.

7. Statistics

n_tests = de-duplicated, strictly matched, flower, plausible tests. Percentiles use linear interpolation. share_ge_25pct and share_ge_1pct are fractions (0–1). Per-state medians are given for states with n ≥ 10. Top-3 terpenes rank individual terpenes by median (ties by mean); n is given for each and a note flags fewer than 10 tests. max_single_lab_share = largest share of a strain’s tests (with a lab recorded) from one lab; lab IDs are state-specific (WA/MD license IDs, MI/MA anonymised in the source, HI none).

8. Exclusions and quality checks (per strain)

Near-matches and conflicts are counted over candidate rows of all product types before de-duplication.

Strain Tests used Near-matches excl. (all types) …of which flower Name conflicts WA uncorroborated flower Other product types concentrate shake/trim pre-rolls Duplicates removed Flower, no THC value THC ≤0 or >40
Blue Dream 2,118 780 311 319 537 1,347 946 179 143 267 87 1
Sour Diesel 1,071 2,304 1,449 228 405 642 320 170 84 65 44 11
Green Crack 1,236 156 56 347 815 352 216 91 20 123 25 0
Northern Lights 406 251 92 153 155 437 306 94 13 10 18 1
Purple Urkle 35 12 9 28 44 7 6 0 0 2 0 0
Blue Cheese 288 50 38 59 98 70 37 17 0 2 3 6
Cinderella 99 598 150 57 37 21 179 6 172 0 6 14 1
Hindu Kush 17 217 93 105 103 19 16 0 3 1 0 1
Chemdawg 668 1,244 790 105 222 428 141 192 57 91 23 0
Grape Ape 202 74 16 277 231 147 94 40 7 5 0 0
G13 Haze 14 2 1 4 1 0 0 0 0 0 0 0
G13 97 117 57 37 6 51 30 11 0 4 1 0
Lemon Kush 29 251 151 27 48 62 60 1 0 1 1 0
Agent Orange 140 9 3 29 167 85 16 66 1 3 7 1
Lamb’s Bread 117 174 90 32 38 19 11 0 8 4 9 0
Lime OG 29 35 10 0 0 39 33 2 0 1 0 0
Critical Jack 8 14 12 7 1 5 0 0 0 0 0 0
Pineapple Express 461 379 133 248 300 418 309 23 42 15 41 0
OG Kush 379 1,000 707 172 250 483 235 63 61 24 50 0
Jack Herer 910 297 102 257 132 568 344 120 25 18 48 0
Durban Poison 528 175 12 124 157 407 269 59 41 22 33 1
Granddaddy Purple 512 163 36 196 286 368 292 23 22 19 22 0
Super Lemon Haze 1,543 275 30 321 375 532 269 203 14 64 40 1
Girl Scout Cookies 567 818 515 141 232 306 186 89 6 32 14 1
Gelato 1,845 7,792 5,666 346 636 670 322 156 102 84 39 0
Wedding Cake 3,085 1,132 841 603 624 1,190 561 420 136 95 129 0
Blueberry 411 6,005 3,083 304 738 299 77 44 15 21 26 1
Trainwreck 248 772 440 249 121 219 131 33 38 48 14 0
Strawberry Cough 231 223 14 176 375 271 203 11 17 55 3 0
Total 17,793 24,871 14,814 4,931 7,118 9,620 1,082 691 26

The most frequent excluded near-match names per strain are listed in the aggregates JSON (exclusions.near_match_top_names).

9. Concentration of the evidence

Producer shares are computed only over tests that record a producer (MD and MI record none).

Strain Tests Labs Max share one lab Max share one producer (tests with producer) Largest state share
Blue Dream 2,118 49 0.167 0.316 (1250) 0.29 (WA)
Sour Diesel 1,071 45 0.253 0.166 (385) 0.56 (MD)
Green Crack 1,236 37 0.235 0.256 (951) 0.61 (WA)
Northern Lights 406 24 0.433 0.214 (56) 0.76 (MD)
Purple Urkle 35 10 0.265 0.519 (27) 0.66 (WA)
Blue Cheese 288 12 0.91 0.556 (9) 0.93 (MD)
Cinderella 99 598 15 0.263 0.684 (57) 0.87 (MD)
Hindu Kush 17 7 0.353 0.375 (16) 0.82 (WA)
Chemdawg 668 28 0.308 0.331 (450) 0.50 (NV)
Grape Ape 202 23 0.441 0.451 (162) 0.47 (NV)
G13 Haze 14 4 0.571 0.714 (14) 0.86 (WA)
G13 97 10 0.299 0.726 (73) 0.55 (NV)
Lemon Kush 29 7 0.5 0.412 (17) 0.41 (MI)
Agent Orange 140 12 0.443 0.444 (18) 0.84 (MD)
Lamb’s Bread 117 6 0.761 0.846 (26) 0.78 (MD)
Lime OG 29 9 0.552 0.833 (6) 0.79 (MI)
Critical Jack 8 2 0.5 0.25 (4) 0.50 (MA)
Pineapple Express 461 33 0.233 0.185 (265) 0.42 (MI)
OG Kush 379 32 0.231 0.282 (291) 0.32 (WA)
Jack Herer 910 26 0.293 0.209 (508) 0.44 (NV)
Durban Poison 528 35 0.237 0.153 (314) 0.42 (NV)
Granddaddy Purple 512 30 0.336 0.34 (247) 0.43 (MD)
Super Lemon Haze 1,543 35 0.189 0.288 (1176) 0.44 (WA)
Girl Scout Cookies 567 36 0.165 0.43 (251) 0.41 (MD)
Gelato 1,845 47 0.162 0.091 (692) 0.37 (MI)
Wedding Cake 3,085 49 0.181 0.188 (1802) 0.43 (NV)
Blueberry 411 35 0.399 0.144 (194) 0.43 (MD)
Trainwreck 248 24 0.348 0.38 (205) 0.37 (NV)
Strawberry Cough 231 17 0.498 0.572 (194) 0.52 (WA)

10. Caveats

11. Per-state notes

12. Reproducibility

The pipeline is scripted end to end (streaming pre-filter, matching and classification, de-duplication and aggregation) and is rerun when Cannlytics publishes new data. Every figure on our strain guides is computed from these outputs at build time; none is typed in by hand.