Two questions, deliberately kept apart. Traffic — where the 34.9 million weekly requests go — is dominated by machines talking to machines. Adoption — how many of the 652 billing-active, non-demo merchants switch a feature on — is a different ranking entirely, and it is the one that describes the product. Where the two disagree is where the interesting decisions are.
The single most important thing on this page: the busiest parts of the platform are not the most-adopted parts, and neither ranking alone should drive a roadmap.
| Surface | Share of traffic | Merchant adoption | What that means |
|---|---|---|---|
| POS integrations | 62.8% | ~87% | Machine chatter. High volume, low product surface. |
| Consumer mobile app | 15.2% | 81% (org-level) | The busiest human-facing surface. |
| Consumer web wallet | 5.7% | — | Second consumer channel, an order of magnitude smaller. |
| Merchant dashboard | 2.3% | — | 291 CPU-hours/week across 275 endpoints — the most expensive traffic we serve. |
| Enrollment / join | 1.0% | — | Small in volume, top of the entire funnel. |
Before any feature number means anything, the base has to be split correctly. Demo accounts are excluded throughout, and the platform's own platform_type turns out to disagree with what merchants actually do.
| Segment | Merchants | % of 652 |
|---|---|---|
| loyalty_and_messaging | 404 | 62.0% |
| messaging_only | 233 | 35.7% |
| messaging_non_integrated | 8 | 1.2% |
| loyalty_only | 7 | 1.1% |
| Segment | Merchants | % of 652 | Definition |
|---|---|---|---|
| Loyalty + messaging | 274 | 42.0% | POS-sourced visits and campaigns sent |
| Loyalty only | 190 | 29.1% | POS visits, no campaigns |
| Dormant | 141 | 21.6% | Neither — billing-active, doing nothing |
| Messaging only | 42 | 6.4% | Campaigns, no visits at all |
| Non-integrated loyalty + messaging | 1 | 0.2% | Visits with no POS source, plus campaigns |
The non-integrated loyalty group is, as expected, effectively empty: one merchant recording visits with no POS source while also sending campaigns. It is a real configuration, not a segment worth building for.
New merchant creation has more than quadrupled since December, and it is almost entirely messaging-first.
| Month | Created | Demo | Messaging-first | Active today |
|---|---|---|---|---|
| 2025-12 | 11 | 1 | 9 | 9 |
| 2026-01 | 23 | 1 | 18 | 12 |
| 2026-02 | 34 | 1 | 28 | 24 |
| 2026-03 | 40 | 1 | 29 | 24 |
| 2026-04 | 13 | 0 | 11 | 9 |
| 2026-05 | 24 | 0 | 19 | 19 |
| 2026-06 | 33 | 12 | 30 | 11 |
| 2026-07 | 47 | 14 | 42 | 16 |
| 2026-08 | 50 | 29 | 47 | 14 |
August is a partial month and already the largest on record. The composition changed sharply from June onward: demo accounts went from ~1 a month to 29 in August, and 94% of new merchants are created as messaging-first.
Distinct billing-active, non-demo merchants against a denominator of 652, measured over 30 days.
| Feature | Merchants | % of 652 | |
|---|---|---|---|
| Transacting (any visit) | 469 | 71.9% | core |
| Rewards configured (excl. seed default) | 428 | 65.6% | core |
| Awarding points | 343 | 52.6% | gap |
| Redemptions | 326 | 50.0% | core |
| Campaigns sent | 317 | 48.6% | core |
| Auto-campaigns enabled | 294 | 45.1% | core |
| Audiences built | 284 | 43.6% | core |
| Referrals active | 34 | 5.2% | niche |
| Gift cards | 14 | 2.1% | niche |
Adoption clusters tightly: once a merchant is genuinely live, they tend to run campaigns, audiences and automations together in the 40–45% band. There is very little partial adoption between "transacting" and "using the product" — merchants are mostly on one side or the other.
Thirty days of activity, from grant issued to reward redeemed.
| Stage | Volume (30d) | Merchants |
|---|---|---|
| Reward grants issued | 33,971,992 | 252 |
| — of which coupons | 32,202,516 | — |
| — of which bonus | 1,480,656 | — |
| — of which instant rewards | 288,820 | — |
| Redemptions | 1,362,577 | 328 |
| — traceable to a grant | 378,013 | 192 |
23 auto-campaign types are enabled somewhere in production. Three account for most adoption; most of the rest are used by fewer than 30 merchants each.
| Type | Merchants | % of 652 | Instances |
|---|---|---|---|
| After Join | 181 | 27.8% | 211 |
| Birthday | 167 | 25.6% | 170 |
| Win Back | 152 | 23.3% | 337 |
| Budz | 69 | 10.6% | 69 |
| After Visit | 51 | 7.8% | 75 |
| Visit Milestone | 50 | 7.7% | 586 |
| App Download | 29 | 4.4% | 29 |
| Reward Available | 28 | 4.3% | 49 |
| Big Purchase | 28 | 4.3% | 34 |
| Spend Milestone | 28 | 4.3% | 246 |
| By Join Date | 25 | 3.8% | 87 |
| Points Expiration | 24 | 3.7% | 37 |
| Delayed After Visit | 19 | 2.9% | 51 |
| Points Milestone | 16 | 2.5% | 90 |
| Email Add | 16 | 2.5% | 16 |
| Interests Add | 13 | 2.0% | 13 |
| API Triggered | 13 | 2.0% | 5,146 |
| Medical Card Expiration | 12 | 1.8% | 17 |
| Birthday Add | 10 | 1.5% | 10 |
| Daily Deals | 8 | 1.2% | 14 |
| Abandoned Cart | 6 | 0.9% | 6 |
| After New Subscriptions | 6 | 0.9% | 9 |
Three types have zero enabled instances anywhere: Unredeemed Reward Reminder, Expiring Reward Reminder, and Join by Referral. They exist in the type registry and in the code, and no merchant runs them.
Alongside campaigns and auto-campaigns there is a third, largely separate messaging path. It behaves much like API-triggered auto-campaigns but carries none of the stashboard features, and the merchants using it are mostly not dispensaries.
| Merchant | Status | POS | Sends (all time) |
|---|---|---|---|
| Game Story Inc | suspended | none | 5,910,253 |
| GTI Delivery | active | none | 1,197,180 |
| Sunflower | suspended | none | 713,003 |
| GrowHealthy | lost | none | 289,827 |
| Bring It On! | active | none | 252,653 |
| Real Gaming | suspended | none | 144,246 |
| Gold Machine | lost | none | 39,279 |
The ten merchants sending via templates in the last 30 days sent zero campaigns over the same twelve months. This is not a secondary path they also use — it is their entire messaging surface. Bring It On! sent 30,019 template messages to 16,682 members; GTI Delivery 15,448 to 3,864; Yayz 9,660 to 2,797.
Scale of the supporting tables: 8,654,467 send logs, 3,011,259 status rows, 1,414,187 error rows, 83,264 template states. Templates themselves are 27,719 rows across 745 merchants, so definition is far more widespread than use — 230 active non-demo merchants have at least one template defined, but only 10 sent anything in 30 days.
Email carries twice the volume of SMS, but SMS reaches twice as many merchants.
| Channel | Merchants | Messages (30d) |
|---|---|---|
| SMS | 283 | 9,626,437 |
| 138 | 19,109,816 | |
| Push | 68 | 4,807,364 |
| iMessage | 0 | 0 |
Channel combinations, by merchant count: SMS-only 207 · SMS+email 46 · email-only 76 · all three 31 · push-only 24 · SMS+push 27 · email+push 11.
34.9 million requests over seven days, classified by who is calling.
| Audience | Requests | Share | CPU hrs | Endpoints |
|---|---|---|---|---|
| POS integrations | 21,942,944 | 62.8% | 563.7 | 21 |
| Consumer mobile app | 5,322,446 | 15.2% | 72.8 | 33 |
| Infrastructure / health | 3,153,813 | 9.0% | 4.5 | 11 |
| Consumer web wallet | 1,982,830 | 5.7% | 72.2 | 41 |
| Merchant dashboard | 804,979 | 2.3% | 291.0 | 275 |
| Analytics & homepage | 796,552 | 2.3% | 2.6 | 4 |
| Partner / public API | 464,750 | 1.3% | 5.5 | 43 |
| Enrollment / join | 358,403 | 1.0% | 3.2 | 25 |
| Other merchant-facing | 105,408 | 0.3% | 11.6 | 296 |
The five busiest individual endpoints are all POS: member lookup (7.5M), member list (4.1M), rewards list (3.1M), the mobile stashboard (3.1M) and offers list (2.5M).
No integration exceeds 17% of active merchants. There is no dominant partner, and that is a strategic fact rather than a technical one.
| POS | Active merchants | % of 652 |
|---|---|---|
| leaflogix | 109 | 16.7% |
| dutchie_ecom | 107 | 16.4% |
| dutchiepos | 82 | 12.6% |
| cova | 78 | 12.0% |
| (no POS configured) | 69 | 10.6% |
| flowhub_maui | 40 | 6.1% |
| headset | 40 | 6.1% |
| treez | 27 | 4.1% |
| iheartjane | 26 | 4.0% |
| blaze | 25 | 3.8% |
| posabit | 25 | 3.8% |
| birchmount | 21 | 3.2% |
| hifyre | 21 | 3.2% |
| everything else (12+ vendors) | <21 each | <3% |
Several findings in this report are not engineering defects and not account oversights on their own — they occur where a per-account setting has no system-level check behind it. Both halves have to move for them to stop recurring.
Three independent flags govern whether a merchant accrues loyalty points: merchant.loyalty, member.allowed_loyalty and merchant_location.loyalty_points. A fourth field, merchant.platform_type, describes what the account was sold. Nothing reconciles them.
def loyalty_enabled? # visit.rb:413
if merchant&.loyalty && member&.allowed_loyalty
return false if merchant_location && !merchant_location.loyalty_points
true
...
platform_type is absent from that method. Its only enforcement is a permissions check on dashboard access (user.rb:116). The result is that the commercial description of an account and its runtime behaviour can drift apart indefinitely, and nothing surfaces the drift.
| Observation | System side | Account side |
|---|---|---|
| 231 of 233 merchants labelled messaging_only have loyalty = true | No validation ties the two fields together | The label no longer describes the account |
| 115 of 343 point-awarding merchants have no loyalty line item; 102 also redeem | Nothing reconciles feature use against billing configuration | Plan assignment needs a periodic review |
| 252 merchants hold only the seeded Sample Reward | The default persists indefinitely with no prompt | Catalog setup is an unfinished onboarding step |
| 141 merchants billing-active with no activity in 30 days | No dormancy signal exists in the product | Account review would surface these first |
| 69 active merchants have no POS configured | Nothing flags an account that cannot deliver its core value | An integration step was never completed |
| 1.79bn points outstanding where members have no catalog to redeem against | Points accrue regardless of catalog state | Rewards were never configured after enablement |
| Change | Owner | Effect |
|---|---|---|
| Reconcile platform_type against loyalty at save time, or derive one from the other | Engineering | Prevents new drift |
| A configuration-health view: enabled features vs configured features vs billed features, per account | Engineering | Makes the gap visible to the people who can close it |
| Flag point accrual where the merchant has no non-seed reward | Engineering | Stops liability accruing against an empty catalog |
| Periodic review of accounts flagged by that view | Account management | Closes the existing backlog |
| Treat catalog setup and POS connection as completion criteria, not optional steps | Shared | Prevents the backlog reforming |
| Make each of these states editable from the admin UI, with an audit trail | Engineering | Removes production access from routine configuration — a control improvement as much as an efficiency one |
| Observation | So what |
|---|---|
| 115 point-awarding merchants have no loyalty line item | 102 of them also redeem. At Loyalty Basic rates (~$342/mo) that is roughly $470k/yr — treat as an upper bound until bundled plans are ruled out. |
| 126 transacting merchants award no points | The largest expansion opportunity in the base. Diagnose before building anything new. |
| platform_type does not gate loyalty | 231 of 233 messaging-only accounts have loyalty enabled. The field describes the sale, not the system. |
| 69 active merchants have no POS configured | Active accounts that cannot get full value. An onboarding question, not an engineering one. |
| Dashboard costs 291 CPU-hrs on 2.3% of requests | Optimisation here buys more headroom than anywhere else in the estate. |
| 296 endpoints serve 0.3% of traffic | The maintenance tail. Deprecation candidates, pending the API-contract audit. |
| 3 automation types have zero users | Built and unused. Retire them or find out why they never landed. |
| 1.1% grant-to-redemption conversion | 32M coupons a month. Worth confirming that issuance volume earns its cost. |
| 13 merchants run 5,146 API-triggered campaigns | A small power-user segment building deeply on the API. Disproportionate strategic value. |
Adoption figures come from the production Postgres replica, read-only, over 30 days, counting distinct merchants where current_status_cache = 'active' and demo_account IS NOT TRUE (652). Traffic figures come from New Relic over 7 days, filtered to appName = 'springBIG' to exclude staging and beta. Endpoint classification is by URL prefix and is mine, not a system-defined taxonomy.