v2 · 2026-05-13

Exchange Rate

Marketing permissions per 100 users, across 11 sites.

Aggregate exchange rate · 11 sites
0.98per 100
Roughly 1 permission per 100 users in aggregate. Unweighted site average is 0.86; Triumph's scale pulls the weighted rate up.
Eligible users
11,235,105
Total permissions
110,378
Sites
11
The cumulative formula
email + SMS + wallet pass + web push + app permissions
eligible_users
=
0.0098≈ 0.98 / 100
where eligible_users = all_users email_unsubscribers
What goes into the rate
numerator · denominator · unit
Numerator

Total permissions

The sum of permissions across five channels: email, SMS, wallet pass, web push, and app. Each one is an explicit consent from a user to be reached on that channel — no null-state shortcuts.

A user counts once per channel they granted, so someone reachable on three channels contributes 3 to the numerator.

Only email and SMS are instrumented today; wallet pass, web push, and app are part of the definition but not yet populated in the data.

Denominator

Eligible users

The pool of users who are reachable in principle — i.e. haven't actively unsubscribed. Breaks down as:

eligible_users = all_users email_unsubscribers

Unsubscribers (email_consented = FALSE with a non-null updated_at) are removed so opted-out churn doesn't drag the rate down.

Reported as

Per 100 users

The raw fraction is small (single-digit per 100), so we report rate × 100. Computed with SAFE_DIVIDE, which returns NULL rather than erroring when a site has no eligible users yet.

Who counts as what
permissions are strict · only active unsubs leave the pool

SMS permission

  • Has a phone on file.
  • sms_consented = TRUE — explicit consent required (TCPA).
  • No null-state shortcut. SMS marketing never assumes consent.

Wallet pass not yet instrumented

  • Has an active wallet pass installed (Apple / Google Wallet).
  • Installing the pass is itself the explicit consent to be reached.
  • Part of the definition, but not populated in the data yet.

Web push not yet instrumented

  • Has an active browser push subscription.
  • Granted the browser notification permission prompt.
  • Part of the definition, but not populated in the data yet.

App permission not yet instrumented

  • Has the mobile app installed.
  • Granted the app push notification permission.
  • Part of the definition, but not populated in the data yet.

Email unsubscriber

  • email_consented = FALSE
  • email_consented_updated_at IS NOT NULL — actively flipped off.
  • Subtracted from the denominator (the user existed but is now unreachable by email).
Per-site ranking
Cumulative · 11 sites · sorted by per-100 rate
scope
For now this only includes Connect customers with exchanges live.
Cumulative eligible_users can be inflated by bot traffic.
Numbers below reflect email + SMS only — wallet pass, web push, and app are in the formula but not yet instrumented.
#
Site
Email
SMS
Eligible
Rate distribution
Rate
01
Final Boss Sour
NaVnjma
2,521
2,148,428
4.53per 100
02
JP Organic Coffee
jaoQNYL
1,084
101,475
2.11per 100
03
Isshiki Matcha
jaoQpmL
2
42,630
0.99per 100
04
Storelli
Jdm7jxv
203
870,452
0.73per 100
05
EarPeace
yvelp9a
158
298,511
0.45per 100
06
Shiree Odiz
yveyXOv
0
102,827
0.31per 100
07
Viajecito
ALOWrbL
0
93,768
0.23per 100
08
Danforth Pewter
Dvqyq3v
234
517,863
0.045per 100
09
Spritz Flower
gdJw2Za
0
12,952
0.031per 100
10
Triumph
oaAz1v9
161
6,699,539
0.029per 100
11
Ron Ayers
gdJwe0a
0
346,660
0.0075per 100
μ
Unweighted site average
11 sites
0.86per 100
Daily signup cohorts
Last 14 days · 2026-04-30 to 2026-05-13
caveat
Cohort permissions are counted as of now, not as of cohort day.
Site
y-max
14-day signup cohort · per 100
14d avg
The queries
cumulative · daily cohort
exchange_rate_cumulative.sql
-- Cumulative exchange rate for a single site.
-- Scope: every user ever created. Counted as of now.
-- Numerator spans 5 channels. wallet_pass / web_push / app are part of
-- the definition but not yet instrumented — they evaluate to 0 for now.

WITH base AS (
  SELECT
    COUNTIF(email IS NOT NULL AND email_consented = TRUE)  AS email_permissions,
    COUNTIF(phone IS NOT NULL AND sms_consented   = TRUE)  AS sms_permissions,
    COUNTIF(wallet_pass_active = TRUE)   AS wallet_pass_permissions,  -- pending
    COUNTIF(web_push_subscribed = TRUE)  AS web_push_permissions,     -- pending
    COUNTIF(app_push_consented = TRUE)   AS app_permissions,          -- pending
    COUNTIF(email_consented = FALSE
            AND email_consented_updated_at IS NOT NULL) AS email_unsubscribers,
    COUNT(*) AS all_users
  FROM `user`
  WHERE website_id = 'NaVnjma'  -- Final Boss Sour
)
SELECT
  all_users,
  email_unsubscribers,
  all_users - email_unsubscribers AS eligible_users,
  email_permissions,
  sms_permissions,
  wallet_pass_permissions,
  web_push_permissions,
  app_permissions,
  email_permissions + sms_permissions + wallet_pass_permissions
    + web_push_permissions + app_permissions AS total_permissions,
  SAFE_DIVIDE(
    email_permissions + sms_permissions + wallet_pass_permissions
      + web_push_permissions + app_permissions,
    all_users - email_unsubscribers
  ) * 100 AS permissions_per_100_users
FROM base;
exchange_rate_daily_cohort.sql
-- Daily cohort exchange rate for a single site, last 14 days.
-- Scope: users whose created_at falls on day D. Permissions counted as of now.
-- Recent days under-state the rate (cohorts haven't matured).
-- wallet_pass / web_push / app are defined but not yet instrumented.

WITH cohort AS (
  SELECT
    DATE(created_at) AS cohort_date,
    COUNT(*) AS all_users,
    COUNTIF(email_consented = FALSE
            AND email_consented_updated_at IS NOT NULL) AS email_unsubscribers,
    COUNTIF(email IS NOT NULL AND email_consented = TRUE) AS email_permissions,
    COUNTIF(phone IS NOT NULL AND sms_consented   = TRUE) AS sms_permissions,
    COUNTIF(wallet_pass_active = TRUE)  AS wallet_pass_permissions,  -- pending
    COUNTIF(web_push_subscribed = TRUE) AS web_push_permissions,     -- pending
    COUNTIF(app_push_consented = TRUE)  AS app_permissions           -- pending
  FROM `user`
  WHERE website_id = 'NaVnjma'
    AND created_at >= CURRENT_DATE() - INTERVAL 14 DAY
  GROUP BY cohort_date
)
SELECT
  cohort_date,
  all_users,
  email_unsubscribers,
  all_users - email_unsubscribers AS eligible_users,
  email_permissions,
  sms_permissions,
  wallet_pass_permissions,
  web_push_permissions,
  app_permissions,
  SAFE_DIVIDE(
    email_permissions + sms_permissions + wallet_pass_permissions
      + web_push_permissions + app_permissions,
    all_users - email_unsubscribers
  ) * 100 AS permissions_per_100_users
FROM cohort
ORDER BY cohort_date DESC;