v2 · 2026-05-14

Exchange Rate

Marketing permissions per 100 users, across 11 sites.

Aggregate exchange rate · 11 sites
1.00per 100
Roughly 1 permission per 100 users in aggregate. Unweighted site average is 0.89; Triumph's scale pulls the weighted rate up.
Eligible users
11,155,835
Total permissions
111,168
Sites
11
The cumulative formula
email + SMS + wallet pass + web push + app permissions
unique_eligible
=
0.0100≈ 1.00 / 100
where
unique_eligible
=unrecognized_unique_visitors
+recognized_uncaptured_visitors
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 unique people we could still capture a permission from — deduplicated per person, not per visit. Breaks down as:

unique_eligible
=unrecognized_unique_visitors
+recognized_uncaptured_visitors

Unrecognized unique visitors — people we've seen but have no identity for, counted once each (many visit 2–5×). Recognized, uncaptured — people we match via hashed email but who haven't subscribed.

The existing per-site value is shown as-is; the unrecognized / recognized split is part of the definition but not yet populated.

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
5 permission channels · 2 denominator segments

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.

Unrecognized visitor

  • A person we've seen but have no identity for.
  • Counted once per person, not per visit — many visit 2–5×.
  • First half of the denominator.

Recognized, uncaptured

  • A person we recognize via hashed email match.
  • Has not subscribed — no permission captured yet.
  • Second half of the denominator.
Per-site ranking
Cumulative · 11 sites · sorted by per-100 rate
scope
For now this only includes Connect customers with exchanges live.
Cumulative unique_eligible 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,542
2,067,484
4.74per 100
02
JP Organic Coffee
jaoQNYL
1,096
100,728
2.15per 100
03
Isshiki Matcha
jaoQpmL
2
42,009
0.99per 100
04
Storelli
Jdm7jxv
203
866,198
0.74per 100
05
EarPeace
yvelp9a
159
299,091
0.45per 100
06
Shiree Odiz
yveyXOv
0
103,346
0.32per 100
07
Viajecito
ALOWrbL
0
92,909
0.24per 100
08
Danforth Pewter
Dvqyq3v
234
525,293
0.045per 100
09
Spritz Flower
gdJw2Za
0
13,000
0.031per 100
10
Triumph
oaAz1v9
161
6,698,405
0.030per 100
11
Ron Ayers
gdJwe0a
0
347,372
0.0075per 100
μ
Unweighted site average
11 sites
0.89per 100
Daily signup cohorts
Last 14 days · 2026-05-01 to 2026-05-14
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.
-- Numerator: 5 permission channels (wallet_pass / web_push / app pending).
-- Denominator: unique eligible visitors, deduplicated per person —
-- the unrecognized / recognized split is not yet instrumented.

WITH permissions 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
  FROM `user`
  WHERE website_id = 'NaVnjma'  -- Final Boss Sour
),
eligible AS (
  -- Unique people, deduplicated (once per person, not per visit).
  SELECT
    COUNT(DISTINCT IF(identity_id IS NULL, visitor_id, NULL))
      AS unrecognized_unique_visitors,
    COUNT(DISTINCT IF(identity_id IS NOT NULL AND NOT subscribed, identity_id, NULL))
      AS recognized_uncaptured_visitors
  FROM `visit`
  WHERE website_id = 'NaVnjma'
)
SELECT
  unrecognized_unique_visitors,
  recognized_uncaptured_visitors,
  unrecognized_unique_visitors + recognized_uncaptured_visitors AS unique_eligible,
  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,
    unrecognized_unique_visitors + recognized_uncaptured_visitors
  ) * 100 AS permissions_per_100_users
FROM permissions, eligible;
exchange_rate_daily_cohort.sql
-- Daily cohort exchange rate for a single site, last 14 days.
-- Cohort = users / visitors first seen on day D. Counted as of now.
-- Recent days under-state the rate (cohorts haven't matured).
-- wallet_pass / web_push / app and the visitor split are pending.

WITH permissions AS (
  SELECT
    DATE(created_at) AS cohort_date,
    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
),
eligible AS (
  -- Unique people per cohort day, deduplicated (once per person).
  SELECT
    DATE(first_seen_at) AS cohort_date,
    COUNT(DISTINCT IF(identity_id IS NULL, visitor_id, NULL))
      AS unrecognized_unique_visitors,
    COUNT(DISTINCT IF(identity_id IS NOT NULL AND NOT subscribed, identity_id, NULL))
      AS recognized_uncaptured_visitors
  FROM `visit`
  WHERE website_id = 'NaVnjma'
    AND first_seen_at >= CURRENT_DATE() - INTERVAL 14 DAY
  GROUP BY cohort_date
)
SELECT
  p.cohort_date,
  e.unrecognized_unique_visitors,
  e.recognized_uncaptured_visitors,
  e.unrecognized_unique_visitors + e.recognized_uncaptured_visitors AS unique_eligible,
  p.email_permissions,
  p.sms_permissions,
  p.wallet_pass_permissions,
  p.web_push_permissions,
  p.app_permissions,
  SAFE_DIVIDE(
    p.email_permissions + p.sms_permissions + p.wallet_pass_permissions
      + p.web_push_permissions + p.app_permissions,
    e.unrecognized_unique_visitors + e.recognized_uncaptured_visitors
  ) * 100 AS permissions_per_100_users
FROM permissions p
JOIN eligible e USING (cohort_date)
ORDER BY p.cohort_date DESC;