Michigan cannabis-market competitiveness
A statewide read on where dispensary competition is tightest in Michigan — and the data behind 15CARTS.
New Buffalo has 1,823.2 dispensaries per 100,000 residents — 9.1× ahead of Morenci, the next closest market in Michigan. The next four cities behind it are all small towns within twenty miles of the Indiana or Ohio border. On a single chart the gap looks like a typo. It isn't.
The top of the table
Every city in the top ten sits within a thirty-mile drive of either the Indiana or Ohio border. The pattern isn't subtle: density follows demand from neighboring populations where adult-use cannabis is either still prohibited or only recently legal. New Buffalo's gap above the rest is driven by the same geography taken to an extreme — the Chicago metro (9.5 million people) is a seventy-five-minute drive away, and Illinois legal cannabis is heavily taxed.
| # | City | Shops | 2020 pop. | Shops / 100k | Why this market |
|---|---|---|---|---|---|
| 1 | New Buffalo | 33 | 1,810 | 1,823.2 | Two miles from Indiana, fifteen from Illinois. Chicago metro (9.5M) is a 75-minute drive on I-94. |
| 2 | Morenci | 4 | 1,993 | 200.7 | Three blocks from the Ohio line. Ohio only legalized adult-use in late 2024 — demand has softened but the cluster is mature. |
| 3 | Reading | 2 | 1,025 | 195.1 | Tiny Hillsdale-County town a short drive north of the Indiana line, anchored on US-12. |
| 4 | White Pigeon | 2 | 1,514 | 132.1 | Sits literally on the Indiana line at US-12. Closest Michigan shops to South Bend and Elkhart. |
| 5 | Quincy | 2 | 1,592 | 125.6 | I-69 corridor in Branch County, twenty miles from Indiana. Same Fort Wayne / Indianapolis catchment that drives Coldwater. |
| 6 | Buchanan | 4 | 4,272 | 93.6 | Southwest Michigan, twelve miles from the Indiana line; folds into the Niles / South Bend catchment. |
| 7 | Monroe | 19 | 20,462 | 92.9 | I-75 corridor, twenty minutes from the Toledo metro (270k). Same Ohio dynamics as Morenci. |
| 8 | Constantine | 2 | 2,191 | 91.3 | St Joseph County, ten miles from the Indiana line on US-131. |
| 9 | River Rouge | 5 | 7,365 | 67.9 | Detroit-metro industrial pocket that opted in early; absorbs spillover demand from neighborhoods where Detroit licensing got delayed. |
| 10 | Three Rivers | 5 | 7,541 | 66.3 | St Joseph County, on US-131 about twenty-five miles from the Indiana line. |
A small-denominator effect is real here: a two-shop town of a thousand people scores 200 / 100k on math alone. That's why the methodology section below leans on shop count and shop-floor median together — the second number tells you whether competition is actually pressing prices down.
What that density does to price
Density on its own is just a count. The next question is whether more shops actually translate into tighter prices, and the SKU tables below are the answer. For each of five common SKUs we publish three numbers per market: the absolute floor (the lowest priced in-stock listing anywhere in the market), the typical shop floor (the median across each shop's own cheapest listing), and the dispersion (the interquartile range of those shop-level floors, expressed as a percentage of the median — lower means tighter competition).
What stands out is the depth, not just the floor. Every one of New Buffalo's 33 shops carries a premium 1/8 — that's 33 shops competing on the same SKU. In a smaller market, a single shop running a doorbuster drags the market floor down without affecting what most visitors actually encounter on the shelf. The shop-floor median is the more honest read of the two.
1g flower
Any quality. Anything labeled deli/bulk/shake/trim is excluded; the premium variant below uses an additional name + subcategory filter for the same exclusions.
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $0.50 | 31 | $3.00 | 58.3% |
| Morenci | $6.00 | 2 | $8.00 | 25.0% |
| Reading | $3.75 | 1 | $3.75 | 0.0% |
| White Pigeon | $2.50 | 2 | $3.00 | 16.7% |
| Quincy | $3.75 | 1 | $3.75 | 0.0% |
| Buchanan | $3.42 | 4 | $6.50 | 67.6% |
| Monroe | $2.00 | 16 | $4.00 | 35.6% |
| Constantine | $8.00 | 1 | $8.00 | 0.0% |
| River Rouge | $2.00 | 5 | $5.00 | 40.0% |
| Three Rivers | $2.00 | 5 | $3.75 | 49.6% |
| Coldwater | $2.00 | 6 | $5.00 | 5.7% |
| Cassopolis | $3.20 | 1 | $3.20 | 0.0% |
| Sturgis | $2.00 | 6 | $2.93 | 14.0% |
| Hazel Park | $1.00 | 8 | $2.14 | 110.8% |
| Niles | $2.70 | 4 | $4.40 | 56.8% |
| Dowagiac | $3.00 | 2 | $3.08 | 2.4% |
| Adrian | $0.43 | 4 | $1.75 | 51.0% |
| Battle Creek | $1.21 | 6 | $2.12 | 38.2% |
| Hamtramck | $1.00 | 5 | $5.00 | 40.0% |
| Kalamazoo | $1.00 | 11 | $4.00 | 41.0% |
| Ann Arbor | $1.00 | 16 | $4.00 | 51.2% |
| Lansing | $1.00 | 16 | $4.00 | 32.5% |
| Grand Rapids | $2.50 | 14 | $3.75 | 30.7% |
| Detroit | $1.00 | 40 | $3.00 | 54.2% |
Premium 1g flower:
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $1.00 | 17 | $6.00 | 101.7% |
| Morenci | — | 0 | — | — |
| Reading | $3.75 | 1 | $3.75 | 0.0% |
| White Pigeon | — | 0 | — | — |
| Quincy | $3.75 | 1 | $3.75 | 0.0% |
| Buchanan | — | 0 | — | — |
| Monroe | $2.00 | 8 | $4.62 | 32.5% |
| Constantine | — | 0 | — | — |
| River Rouge | $5.00 | 1 | $5.00 | 0.0% |
| Three Rivers | $2.00 | 4 | $3.88 | 30.6% |
| Coldwater | $4.00 | 2 | $22.00 | 81.8% |
| Cassopolis | $10.00 | 1 | $10.00 | 0.0% |
| Sturgis | $2.00 | 4 | $3.12 | 70.0% |
| Hazel Park | $1.52 | 6 | $4.00 | 131.2% |
| Niles | $10.00 | 3 | $10.29 | 48.6% |
| Dowagiac | — | 0 | — | — |
| Adrian | $0.43 | 1 | $0.43 | 0.0% |
| Battle Creek | $2.00 | 3 | $2.25 | 157.8% |
| Hamtramck | $1.00 | 3 | $3.00 | 83.3% |
| Kalamazoo | $3.00 | 5 | $5.00 | 120.0% |
| Ann Arbor | $1.00 | 10 | $4.15 | 93.0% |
| Lansing | $3.00 | 9 | $7.00 | 71.4% |
| Grand Rapids | $7.00 | 1 | $7.00 | 0.0% |
| Detroit | $1.63 | 26 | $5.00 | 115.0% |
1/8 flower (3.5g)
Any quality:
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $1.75 | 33 | $9.75 | 61.5% |
| Morenci | $7.50 | 4 | $10.00 | 9.4% |
| Reading | $4.00 | 1 | $4.00 | 0.0% |
| White Pigeon | $8.00 | 2 | $9.25 | 13.5% |
| Quincy | $4.00 | 2 | $7.00 | 42.9% |
| Buchanan | $7.00 | 4 | $9.28 | 73.7% |
| Monroe | $5.00 | 19 | $10.00 | 28.7% |
| Constantine | $6.00 | 1 | $6.00 | 0.0% |
| River Rouge | $5.00 | 5 | $10.00 | 76.0% |
| Three Rivers | $4.00 | 5 | $7.50 | 40.0% |
| Coldwater | $5.00 | 7 | $8.91 | 39.4% |
| Cassopolis | $10.00 | 1 | $10.00 | 0.0% |
| Sturgis | $8.00 | 6 | $8.69 | 9.0% |
| Hazel Park | $3.50 | 8 | $8.50 | 87.6% |
| Niles | $6.00 | 4 | $9.61 | 30.0% |
| Dowagiac | $4.29 | 2 | $7.14 | 40.0% |
| Adrian | $1.50 | 5 | $7.00 | 100.0% |
| Battle Creek | $4.00 | 8 | $10.00 | 56.5% |
| Hamtramck | $5.00 | 5 | $15.00 | 0.1% |
| Kalamazoo | $3.25 | 12 | $9.28 | 41.8% |
| Ann Arbor | $3.00 | 18 | $10.00 | 91.0% |
| Lansing | $3.00 | 16 | $8.00 | 53.1% |
| Grand Rapids | $4.90 | 20 | $10.00 | 15.0% |
| Detroit | $3.00 | 45 | $8.00 | 56.2% |
Premium 1/8:
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $3.00 | 33 | $11.99 | 41.7% |
| Morenci | $7.50 | 4 | $10.00 | 9.4% |
| Reading | $4.00 | 1 | $4.00 | 0.0% |
| White Pigeon | $9.00 | 2 | $14.50 | 37.9% |
| Quincy | $4.00 | 2 | $7.00 | 42.9% |
| Buchanan | $7.00 | 3 | $15.00 | 30.5% |
| Monroe | $5.00 | 19 | $12.00 | 50.0% |
| Constantine | $6.00 | 1 | $6.00 | 0.0% |
| River Rouge | $12.00 | 4 | $13.80 | 36.6% |
| Three Rivers | $4.00 | 4 | $9.95 | 15.8% |
| Coldwater | $8.80 | 7 | $16.00 | 42.2% |
| Cassopolis | $10.00 | 1 | $10.00 | 0.0% |
| Sturgis | $8.63 | 6 | $9.95 | 47.4% |
| Hazel Park | $5.00 | 8 | $11.30 | 68.6% |
| Niles | $6.00 | 4 | $18.00 | 18.1% |
| Dowagiac | $18.01 | 2 | $24.00 | 25.0% |
| Adrian | $1.50 | 4 | $12.00 | 30.2% |
| Battle Creek | $5.00 | 7 | $10.00 | 38.0% |
| Hamtramck | $5.00 | 5 | $15.00 | 0.0% |
| Kalamazoo | $4.00 | 12 | $11.90 | 54.9% |
| Ann Arbor | $3.20 | 17 | $12.00 | 83.3% |
| Lansing | $4.00 | 15 | $11.99 | 25.6% |
| Grand Rapids | $8.00 | 20 | $10.00 | 50.0% |
| Detroit | $3.25 | 43 | $10.00 | 61.3% |
0.5g vape cart
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $12.00 | 11 | $16.50 | 57.6% |
| Morenci | $9.00 | 1 | $9.00 | 0.0% |
| Reading | — | 0 | — | — |
| White Pigeon | — | 0 | — | — |
| Quincy | — | 0 | — | — |
| Buchanan | $18.00 | 3 | $25.00 | 42.0% |
| Monroe | $12.00 | 8 | $25.02 | 56.0% |
| Constantine | — | 0 | — | — |
| River Rouge | $35.00 | 1 | $35.00 | 0.0% |
| Three Rivers | — | 0 | — | — |
| Coldwater | $14.00 | 3 | $15.00 | 37.7% |
| Cassopolis | — | 0 | — | — |
| Sturgis | $8.00 | 5 | $20.00 | 31.2% |
| Hazel Park | $20.00 | 2 | $23.75 | 15.8% |
| Niles | — | 0 | — | — |
| Dowagiac | $20.00 | 1 | $20.00 | 0.0% |
| Adrian | $20.00 | 1 | $20.00 | 0.0% |
| Battle Creek | $35.00 | 1 | $35.00 | 0.0% |
| Hamtramck | $22.95 | 2 | $26.48 | 13.3% |
| Kalamazoo | $16.50 | 6 | $20.00 | 26.2% |
| Ann Arbor | $12.00 | 7 | $21.00 | 41.7% |
| Lansing | $15.60 | 5 | $19.99 | 17.5% |
| Grand Rapids | $15.00 | 7 | $25.00 | 56.0% |
| Detroit | $10.00 | 6 | $18.50 | 90.8% |
1g vape cart
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $2.65 | 33 | $5.00 | 36.0% |
| Morenci | $3.60 | 4 | $6.50 | 24.6% |
| Reading | $4.00 | 1 | $4.00 | 0.0% |
| White Pigeon | $4.00 | 2 | $4.00 | 0.0% |
| Quincy | $3.75 | 2 | $3.88 | 3.2% |
| Buchanan | $6.00 | 4 | $7.05 | 13.8% |
| Monroe | $2.65 | 19 | $5.00 | 50.0% |
| Constantine | $6.00 | 1 | $6.00 | 0.0% |
| River Rouge | $5.50 | 5 | $5.75 | 8.7% |
| Three Rivers | $4.50 | 5 | $6.00 | 50.0% |
| Coldwater | $4.02 | 7 | $5.86 | 19.2% |
| Cassopolis | $8.00 | 1 | $8.00 | 0.0% |
| Sturgis | $2.50 | 6 | $5.50 | 45.5% |
| Hazel Park | $2.40 | 8 | $5.75 | 21.7% |
| Niles | $5.15 | 4 | $6.00 | 7.3% |
| Dowagiac | $4.75 | 2 | $6.38 | 25.5% |
| Adrian | $3.99 | 6 | $5.01 | 39.8% |
| Battle Creek | $5.00 | 9 | $5.75 | 17.4% |
| Hamtramck | $5.00 | 4 | $7.50 | 55.8% |
| Kalamazoo | $2.00 | 12 | $5.00 | 20.4% |
| Ann Arbor | $3.60 | 16 | $6.00 | 35.4% |
| Lansing | $4.50 | 17 | $7.00 | 21.4% |
| Grand Rapids | $3.60 | 20 | $6.00 | 16.7% |
| Detroit | $2.00 | 43 | $6.00 | 34.2% |
100mg THC edible
| City | Market floor | Shops carrying | Typical shop floor | IQR % (dispersion) |
|---|---|---|---|---|
| New Buffalo | $1.20 | 32 | $6.50 | 93.7% |
| Morenci | $4.00 | 3 | $7.00 | 78.6% |
| Reading | $9.00 | 1 | $9.00 | 0.0% |
| White Pigeon | $8.00 | 2 | $10.00 | 20.0% |
| Quincy | $6.50 | 2 | $9.25 | 29.7% |
| Buchanan | $7.50 | 4 | $10.00 | 41.2% |
| Monroe | $2.00 | 17 | $8.00 | 62.5% |
| Constantine | $11.20 | 1 | $11.20 | 0.0% |
| River Rouge | $2.00 | 5 | $4.00 | 175.0% |
| Three Rivers | $3.00 | 5 | $6.50 | 169.2% |
| Coldwater | $3.00 | 7 | $5.00 | 65.0% |
| Cassopolis | $5.33 | 1 | $5.33 | 0.0% |
| Sturgis | $3.00 | 6 | $4.25 | 69.1% |
| Hazel Park | $3.00 | 6 | $8.00 | 77.3% |
| Niles | $2.50 | 4 | $11.14 | 35.1% |
| Dowagiac | $2.50 | 2 | $2.75 | 9.1% |
| Adrian | $2.50 | 5 | $5.00 | 20.0% |
| Battle Creek | $1.29 | 6 | $10.00 | 135.0% |
| Hamtramck | $6.00 | 3 | $12.00 | 25.0% |
| Kalamazoo | $3.00 | 12 | $6.50 | 101.9% |
| Ann Arbor | $2.00 | 17 | $9.00 | 105.6% |
| Lansing | $1.50 | 16 | $6.00 | 57.0% |
| Grand Rapids | $3.00 | 16 | $5.10 | 129.8% |
| Detroit | $1.50 | 34 | $6.90 | 114.1% |
Methodology
- Shops per 100,000 residents
- Verified open-and-licensed dispensary count divided by the 2020 Census total-population denominator for the city, scaled to 100k. We deliberately use total population, not adults 21+. The ACS five-year file would give us a 21+ slice but requires an API key, and even if we shrunk every city by the same plausible adjustment the 9.1× headline gap holds — so the extra precision wasn't worth chasing.
- City-level unit, not county
- Competition is a drive-time bubble, not a county-level fact. A shop in St Joseph (Berrien County) doesn't compete with a New Buffalo shop the way two New Buffalo shops on the same block do. We score at the Census Place level — what people locally call "the town."
- Market floor
- The lowest active price across every in-stock listing in the market for that SKU, on the latest scrape per shop. Active price means COALESCE(special_price, list_price) — what a walk-in actually pays. Very sensitive to a single shop's doorbuster.
- Typical shop floor (median)
- For each shop in the market, take that shop's own cheapest in-stock listing of the SKU. The median across those per-shop floors is the "typical floor a visitor will see." Less sensitive to outliers than the market floor.
- IQR % (dispersion)
- Interquartile range of the per-shop floors, divided by the median. Captures how tightly shops are clustered around the typical floor — lower means tighter competition, higher means a wide-open mix of cheap and expensive shops.
- Two-column flower (any vs premium)
- "Any quality" includes everything the shop puts on its flower shelf. "Premium" adds a name- and subcategory-based filter that drops common deli/bulk/shake/trim listings. Same shop, two reads — premium is closer to what most visitors are actually shopping for.
- End-use framing
- Most of the markets near the top of the table sit on a state line, and the demand-driver populations they feed are out-of-state. We note that pattern because it explains the data, not because we advocate for any particular cross-border behavior. 15CARTS compares Michigan prices at Michigan shops; we recognize the demand for the data regardless of how the visitor uses it.
Why the SW-Michigan corridor was the natural next step
This study didn't start as a public writeup. We ran the numbers privately to decide where 15CARTS should expand from its New Buffalo-only roots — and the result pointed straight at the SW-Michigan / Indiana-border corridor: Reading, Quincy, Coldwater, Sturgis, Three Rivers, Constantine, White Pigeon, Dowagiac, Cassopolis, and Buchanan. A few dozen dispensaries across ten towns, each within a short drive of the same Fort Wayne and Indianapolis catchment that already drives Coldwater's density into the top of the chart.
Those markets are the launch cohort for this page — the pricing tables above already reflect them, and the corresponding shop maps and cross-shop comparisons are rolling out on the rest of the site in parallel.
What didn't make the first expansion: Battle Creek (10 shops on I-94 — bigger than several of the border markets but not a border play; included in this writeup's density ranking, slated for a later regional expansion), the Toledo-adjacent cluster (Monroe / Adrian / Morenci — demand softening since Ohio's late-2024 adult-use legalization), and the in-state metros (Grand Rapids, Ann Arbor, Lansing, Kalamazoo, Detroit — a volume play with no border moat, and Detroit needs a zip-cluster UX before it's useful).
Data sources & caveats
- Menu prices — captured from each shop's public live menu in a one-day statewide snapshot. The same scraper that powers the Berrien-county half of 15CARTS, pointed at the rest of the state for a sidecar database. We hold pricing data at the SKU level, not just headline floors, so the math above is reproducible.
- Populations — US Census Bureau 2020 Decennial Census, table P1_001N (total population), Census Place geography. We track each city's exact Census QuickFacts citation in the raw data file.
- Shop discovery — a city-level enumeration of public adult-use shop listings, run once for each candidate market in the study and deduplicated against the existing 15CARTS Berrien-county registry. We started from the fourteen largest single-market candidates and extended to the SW-Michigan corridor towns explicitly for the expansion read.
- Scrape success — a small number of shops fail any given pass for unrelated reasons (occasional test/demo entries that slip into the upstream city listings, a one-off menu-data quirk that trips our parser). Two known demo shops — one each in Detroit and Ann Arbor — are subtracted from the density numerator here. The miss rate is under 2% and doesn't move any market's headline.
- Adult-use only — medical-only menus are excluded. Where a shop holds both licenses, we use its adult-use menu and drop the medical mirror to avoid double-counting (relevant in a small number of cases statewide).
- One-day snapshot — every table on this page is a single point-in-time read. Specials change daily, shops change weekly, menus drift. The 15CARTS comparison tables for each market refresh in near-real-time; the snapshot here is what was on the menu the day we ran the analysis.
Raw analysis JSON, the per-SKU per-shop computations, and the population denominators all live in this site's repo; the methodology is open enough that anyone with the data can rebuild the tables. Drop us a note at /contact if you spot something off.