EM-114 · the gap that cost us the baseline

The people who tried to give us their number

Yes, they are identified. 9,049 named people acted on the SMS step between 21 June and 18 August, the window where SMS capture collapsed. We have an email address for every single one of them, because reaching the SMS step required submitting the email step first.

6,367 of them still have no SMS consent today, and 5,850 of those are still reachable by email. That is the recoverable cohort, and it is a better target than the wider pool because these people demonstrably tried and the mechanism failed them.

Klaviyo API, 20 Aug 2026. Identified by joining submitted_form_step events on the session cid, which links a view-1 SMS action back to the view-0 email submit in the same session. 28,452 events, 15,115 sessions. Every one of the 9,049 resolved to a live profile. Currency USD.

9,049
Identified by name
6,367
Still no SMS consent
5,850
Recoverable · email-reachable
4,830
We never got their number
2,265
Are existing customers
01

The size, and how they were found

I said in the last report that the mobile abandoners were unrecoverable. That was wrong, and this is the correction.

How they were identified

Every submitted_form_step event carries a session cid. The same cid appears on the view-0 email submit and the view-1 SMS action within one session. So even when the SMS step captured no phone number, the email from the same session names the person.

That is the whole trick, and it means 100.0% of the people who acted on the SMS step in the gap are identifiable, not just the ones who typed digits. I had assumed the empty submitted_fields on the mobile path meant the person was lost. It only meant the number was lost.

Sessions on the popup, 21 Jun to 18 Aug
15,115
Acted on the SMS step
9,362
… on mobile, where the number was never captured
7,202
… on desktop
2,160
… who actually typed a phone number
2,207
Unique people, resolved to a Klaviyo profile
9,049

What happened to those 9,049 people since:

Where they are todayPeopleShareMeaning
Still NEVER_SUBSCRIBED6,36770.4%Tried, never got there, still has not
Since became SUBSCRIBED2,01322.2%Got in later, by checkout or a retry
UNSUBSCRIBED6697.4%Do not contact
Total identified9,049100%

Of the 6,367 with no consent, 517 cannot be emailed either, which leaves 5,850 genuinely contactable. The unreachable break down as:

Why we cannot email themPeople
Suppressed: UNSUBSCRIBE368
Suppressed: HARD_BOUNCE73
Suppressed: USER_SUPPRESSED40
Suppressed: SPAM_COMPLAINT31
Suppressed: INVALID_EMAIL2
NEVER_SUBSCRIBED2
Suppressed: UNSUBSCRIBE/USER_SUPPRESSED1

Independent corroboration. Before running this I estimated the baseline shortfall at roughly 6,000 to 6,700 lost SMS subscribers, by comparing June, July and August against May's rate of 4,437 a month. The event-level count of people who tried and still have no consent came out at 6,367. Two different methods, same answer, so the cohort is the gap rather than a slice of it.

02

How we ended up holding numbers we cannot use

This is the mechanic and the three sources, because it is the part that decides whether any of this is a compliance problem or a plumbing problem.

The mechanic

In Klaviyo a phone number is a profile attribute. Consent is a separate subscription write. Anything that writes profile data can set phone_number and never touch consent: a Shopify order sync, a form submit, an identify() call, a CSV import. Two different writes, and only the second one grants permission to text anybody.

That is why this stayed invisible. Nothing malfunctioned in a way that would raise an alarm, and nothing unlawful happened by storing the number. The proof that no consent was ever taken is in the data: sms_method is None on 100.0% of all 39,918 profiles. Klaviyo stamps a method (FORM, SHOPIFY, TEXT, API) every time consent is granted or changed. A blank on every single record means there has never been a consent event of any kind on any of them.

And we have not been marketing to them. Direction verified from the From Number and To Number on every SMS event: WKY8He Received Text Message (us to customer) “Received Text Message”, which is the metric for one of our marketing texts landing on a handset, returns zero events across roughly 240 sampled pool profiles. Klaviyo also refuses to include a profile with can_receive_sms_marketing: false in a send at all, so this is platform-enforced rather than something we have been getting away with. That is a sample rather than a full census, but the mechanism backs it up.

One naming trap worth recording. The metric RV6gt2 Sent Text Message (INBOUND: customer to us) is called “Sent Text Message” and it is inbound: Klaviyo names it from the profile's point of view, so it means the customer sent us a text. On our sample, From Number was our own toll-free number in 0 of 20 cases. Reading that metric as us sending is the obvious mistake and it inverts the entire picture.

The three sources, sized

1

Checkout. 52.2% of the pool has placed an order.

Scale 20,852 profilesLawful YesFix Already in flight

20,852 of the 39,918 have bought from us, and checkout captures a phone for delivery. The Shopify integration carries form_settings.shopify_visitor_api.sync_SMS_consent: true, so those numbers sync onto the Klaviyo profile. A number given to receive a shipping notification is transactional data and it correctly arrives with no marketing consent. Nothing here is a breach; it is simply a large number of people handing us a phone number in a context that cannot be used for marketing.

This is the one the thank-you page SMS opt-in is for, and that is the right fix: it puts an explicit, disclosed marketing ask at the exact moment we already have the number and the customer's attention, instead of hoping a transactional field can be repurposed later. It converts source 1 from a dead end into a capture point.

2

The popup's double opt-in, never confirmed

Scale 1,020 in this cohortFix Shipped 18 Aug

Someone typed a real number into the SMS step, Klaviyo wrote it to the profile at submit, and the confirmation was never completed, so consent never closed. Already covered in the capture-scope report and fixed when VdWm2S On-Page SMS Subscribers went single opt-in. Completion on typed numbers went from 41.2% to 82.7%.

3

Tap-to-text: they sent the text and we rejected it

Scale 5,004 peopleStatus Not live in any formSeverity This was the collapse

This one was not known and it is the biggest of the three. Between 1 June and 21 August, 5,004 unique phone numbers texted our toll-free number with the tap-to-text opt-in message, and Klaviyo classified 5,002 of them as Message Type: unrecognized, intent Other. We auto-replied and granted no consent. They did every single thing we asked of them.

The cause is in the message body. The pre-filled text read “Send this text to subscribe to recurring automated personalized marketing alerts (e.g. special promotions, cart reminders) from Klaviyo Library (ref:…)”. Klaviyo's inbound parser matches keywords, and that sentence does not contain the keyword JOIN that the form declared. So the opt-in arrived as unparseable prose.

Proof that the keyword machinery itself works: over the same window 2,261 inbound texts were correctly classified subscribe, and 2,199 of those were the literal string YES. Short keyword, recognised. Long sentence, discarded.

This also corrects the previous report. I attributed the 0.9% mobile completion rate to shoppers not bothering to send the text. Roughly seven in ten of them did send it: 5,004 unique numbers texted us against 7,202 mobile actions on the SMS step in the same period. The SMS collapse was not reluctance. It was a keyword that never matched.

03

Two audiences, not one

The recoverable 5,850 split by whether we ever got the digits. They need different asks.

Group A · we hold their number
1,020
They typed a real number into the form and the confirmation step lost them. We have the digits on the profile. What is missing is only the consent record.
Group B · we never got the number
4,830
Almost all mobile. They tapped “Subscribe via SMS”, were handed to their messaging app, and never sent the text. Nothing was captured. They have to type it.

Group B is the bigger surprise and the bigger prize. It is 82.6% of the recoverable cohort and it is invisible to the segment I built last week, because that segment requires a phone number on the profile. These 4,830 people are additive to the 19,970 in RCm4nZ SMS Recovery · phone on file, never SMS-opted-in, email-reachable, not a subset of it.

24,800
Distinct people we can ask for an SMS opt-in: the 19,970 with a number on file but no consent, plus the 4,830 from the gap whose number we never captured.
04

Who they are

Names, emails and phone numbers are masked on this page. Vercel Authentication is not available on our plan for production, so this URL is public to anyone holding it. The unmasked roster is local only, at reports/sms-gap-cohort.html and reports/sms-gap-cohort.csv. Counts and revenue are unmodified.

When they tried
2026-06
26
2026-07
3,813
2026-08
2,011

July is the bulk, which is exactly when the broken mobile path was at full volume.

Where they are
California
526
Texas
431
Florida
377
(unknown)
246
Pennsylvania
179
New York
176
Georgia
175
North Carolina
170
Ohio
152
Illinois
146
Value already in the cohort

2,265 of the 5,850 have bought from us before, carrying $281,310 of historic revenue. The other 3,585 have never ordered, so for them an SMS opt-in is the first commercial relationship rather than a deepening of one.

The thirty-five highest-value customers in the cohort. Note how many show no number captured: that is the mobile path, and it is why this group could not be found by looking at phone numbers.

PersonNumber we holdDevice when they triedRegionOrdersRevenueTried on
Gary B.g**********@yahoo.comnone capturedMOBILEKentucky9$2,3092026-07-22
John S.k******@aol.com+1423*****97MOBILETennessee10$2,1392026-07-26
Jason D.s***************@gmail.comnone capturedMOBILETexas23$2,1022026-07-03
Norman L.l*******@casscomm.com+1309*****52DESKTOPIllinois12$1,6252026-07-30
Stephen F.s**************@yahoo.com+1419*****41DESKTOPOhio7$1,5672026-07-04
Francisco A.f**********@yahoo.com+1650*****27MOBILECalifornia12$1,5492026-07-24
Amy C.a***********@msn.com+1201*****01MOBILENew Jersey16$1,5072026-07-20
Zadekiel S.m**********@yahoo.com+1773*****49MOBILEIllinois13$1,3572026-07-17
Clinton W.c******@hotmail.comnone capturedMOBILEBritish Columbia5$1,1912026-07-22
Philip S.d*****************@gmail.comnone capturedMOBILEFlorida8$1,1802026-07-04
Brandy B.b**************@gmail.comnone capturedMOBILEOregon12$1,1072026-07-17
Pauline R.p*******@gmail.cimnone capturedMOBILEOregon17$1,0312026-08-10
Richard G.r******@teamgoodley.co.uknone capturedMOBILEEngland8$1,0142026-08-13
Timothy J.t******@att.net+1630*****36DESKTOPOhio15$9262026-07-01
Brian M.t********@gmail.comnone capturedMOBILETennessee13$8982026-08-05
Sandi C.b**********@gmail.com+1864*****35MOBILESouth Carolina6$8212026-07-11
Wayne M.m********@hotmail.com+1931*****59DESKTOPTN12$8092026-07-22
PENNEY H.p***********@aol.com+1320*****79DESKTOPMinnesota2$7942026-08-01
Christian M.c****************@protonmail.comnone capturedMOBILETexas4$7892026-07-24
Sharon A.s*********@gmail.comnone capturedMOBILETennessee3$7802026-07-03
Jason E.j*********@gmail.comnone capturedMOBILEMassachusetts6$7782026-08-05
Brett L.l*********@comcast.net+1847*****51MOBILEIllinois8$7382026-07-08
Dena B.d********@msn.comnone capturedMOBILELouisiana12$7362026-08-16
Adelyn K.a*************@gmail.comnone capturedMOBILEWisconsin5$7042026-08-15
Richard K.r******@gmail.comnone capturedMOBILEPennsylvania7$6982026-08-08
Doug E.e********@gmail.comnone capturedMOBILEOregon2$6812026-08-04
Melissa G.m**********@gmail.com+1623*****61MOBILEArizona4$6602026-07-07
CESAR T.c*************@gmail.com+1631*****92MOBILENY5$6562026-07-12
Jonni D.j******@hotmail.comnone capturedMOBILETexas19$6552026-08-01
Dillon A.d************@gmail.com+1907*****93DESKTOPAlaska5$6492026-07-07
Robert C.f*********@gmail.comnone capturedMOBILETexas2$6432026-07-09
Steven R.r***********@gmail.comnone capturedMOBILESouth Carolina9$6342026-08-05
Paul E.p******@gmail.comnone capturedMOBILETexas6$6092026-07-25
robert c.r********@gmail.com+1386*****44MOBILENew York7$6012026-07-17
Dale W.d*************@proton.menone capturedMOBILETexas7$5972026-08-13
05

The solution to get their numbers

One page, one field, sent to them by email. Here is why that shape and not another.

The mechanism, verified working

A static page can write a phone number straight into VdWm2S On-Page SMS Subscribers with no server, no auth and no Klaviyo Forms build, using the public client endpoint and our public company id WdwJQj:

POST https://a.klaviyo.com/client/subscriptions/?company_id=WdwJQj revision: 2024-10-15 (no auth header) {"data":{"type":"subscription","attributes":{ "custom_source":"SMS gap recovery", "profile":{"data":{"type":"profile","attributes":{ "email":"<theirs>","phone_number":"+1XXXXXXXXXX"}}}}, "relationships":{"list":{"data":{"type":"list","id":"VdWm2S"}}}}}

Two things I confirmed by probing it. First, phone_number is accepted on the client endpoint, so this genuinely captures numbers rather than just emails. Second, and this matters more than it looks: the endpoint rejects a number that cannot receive SMS, returning “The phone number provided either does not exist or is ineligible to receive ChannelType.SMS”. So we get carrier-level validation at the moment of submit, for free.

That is the direct answer to the typo risk we took on when VdWm2S On-Page SMS Subscribers went single opt-in. This page cannot accept a junk number, which the storefront popup's plain phone field can.

A working build of exactly this page is deployed alongside this report at /claim. It is live-capable and noindexed. The offer line is a marked placeholder, because I have not been given an offer to promise.

Why not the alternatives
OptionVerdictEvidence
Klaviyo's hosted subscribe pageDead surfacesubscribe_page_submit is 0 in every month from April to August, against 8 to 43 views a month. It is reachable and it has never converted anyone.
The existing “non-SMS subscriber” draft popupsNot usableWgtNmQ BSS - Not subscribed to SMS, WenJci and TamScx SMS POPUP are all last updated 15 Feb 2024 and built in Klaviyo's pre-migration blocks schema, not the current components one. They are a reference, not an asset.
Wait for them on the storefront popupSecond, not firstIt works now, at 82.7% completion, but it asks for the email first and these people are already subscribers. It also needs them to come back. Good as a passive net, not as the campaign.
Text themIllegalNo consent on record for any of them. For Group B we do not even have a number.
The build, in order
  1. Make the cohort addressable. Done These 5,850 cannot be expressed as a Klaviyo segment: the condition would have to be “submitted form step X”, and T4qceY submitted_form_step is rejected as a metric id in the segments API. So it is a static list: SRLmDN “SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed)”, 5,850 profiles, verified. I added them by list membership only, which does not touch consent and fires no confirmation emails. Checked before and after: no live flow triggers on it, so nothing auto-sent. A 100-profile sample reads 100% email SUBSCRIBED and 100% SMS NEVER_SUBSCRIBED, which is exactly the intended audience.
  2. Point the page at a real offer. The one thing on /claim I could not write. Whatever it is, it has to be worth typing ten digits for, and it has to be honoured by a code that actually exists.
  3. One email, then one reminder. Single purpose, single CTA, straight to /claim. No product education, no bundling it into a promo. The subject should reference that they already started this, because they did, and that is the only thing that makes this email different from a cold SMS ask.
  4. Send to a 1,000-person slice first, weighted to the 2,265 existing customers, and read the real conversion before committing the rest.
  5. Add the passive net. A phone-only Klaviyo popup targeted at the same list, for anyone who visits without clicking the email. Klaviyo's own benchmark for phone-only forms aimed at existing email subscribers is 10 to 13% Klaviyo benchmark.

On pre-filling the number for Group A: we could pass the 1,020 known numbers into the page as a URL parameter so they only have to tap confirm. I would not. It puts a phone number in a query string, which Vercel and every intermediary logs, and a number typed at the moment of consent is a cleaner consent record than one we asserted on their behalf. Ten digits is a low price for a defensible record.

06

The plan, and the consent question

Four things asked, answered in order.

1 · Can we capture their numbers without getting consent?

Yes, and we already do it at scale. It does not help. Holding a number and being allowed to text it are two separate things, and we are only short of the second one. The 39,918-profile pool in the previous report is numbers captured without consent. Group A of this cohort is 1,020 numbers we captured without consent. The digits were never the bottleneck.

If we wanted more digits without an opt-in, the legitimate route is Shopify order records. 2,265 of these 5,850 people are existing customers, and checkout captures a phone for delivery. That would likely fill in a large share of Group B. I could not size it: the Shopify Admin token expires every 24 hours and the current one is dead, so this needs a fresh token and a one-hour pull.

But a number taken from a shipping field carries no marketing consent, and texting it is a TCPA violation, at $500 to $1,500 per message. In a 350-profile sample of the wider pool, Klaviyo had already flagged two people as KNOWN_LITIGATOR. So enrichment would give us 4,830 more numbers we still cannot use.

The one place enrichment genuinely earns its keep is friction: if we know the number, the recovery email can say “confirm the mobile ending 47” instead of asking for ten digits. That is a real conversion lever and worth the token pull. It is not a way around consent, and there is no way around consent worth having here. Get the consent and the number arrives with it, in the same tap.

2 · Is the plan a dedicated campaign? Yes.

One dedicated campaign to SRLmDN SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed), single purpose, one CTA, then one reminder to people who did not click. Explicitly not folded into a promo or a newsletter, for two reasons. The only thing that makes this email legitimate rather than cold is that it references something they started, and that argument does not survive being bundled with a sale. And a single-purpose send gives a clean conversion read, which is the whole point of running this cohort before the bigger list.

Sequence: send to a 1,000-person slice first, weighted to the 2,265 existing customers. Read the real opt-in rate. Then decide on the remaining 4,850. The email itself still needs to go through the framework audit and the repo pull; I have not drafted it, and it should not be improvised.

3 · The plan for the static page

/claim as it stands is a working prototype, not the production page. The mechanism is proven and the code is final. What has to change before it goes in an email:

  1. Move it off vercel.app onto blackforestsupplements.com. This is the one non-negotiable. Putting an unfamiliar domain behind the only CTA in an email to 5,850 people costs us deliverability and reads as phishing to anyone paying attention. The page is a single self-contained HTML file with inline JS and no build step, so it drops into a Shopify page template as-is. The Klaviyo client endpoint is called from the browser and needs no server, so hosting it first-party changes nothing about how it works.
  2. Set the offer. The one line I could not write. It has to be worth typing ten digits for and it has to be honoured by a code that actually exists.
  3. Pre-fill the email field from the Klaviyo link, not the phone field. Passing the email as a URL parameter is standard practice and removes half the typing. Passing the phone is not: it writes a mobile number into a query string that Vercel, Shopify and every intermediary logs, and a number typed at the moment of consent is a stronger consent record than one we asserted for them. The trade-off on pre-filled email is that a forwarded link could attach someone else's phone to that email, which is a small and well-understood risk in exchange for a real lift.
  4. Keep the disclosure exactly as it is. The TCPA language on the page is what makes a single-opt-in capture defensible. It is not decoration and it should not be shortened for design reasons.
  5. Test end to end with one real number before the send, and confirm the profile lands on VdWm2S On-Page SMS Subscribers with SUBSCRIBED and a custom_source of “SMS gap recovery”, so the cohort stays attributable afterwards.

After the campaign, the same page is the destination for the 19,970 in RCm4nZ SMS Recovery · phone on file, never SMS-opted-in, email-reachable, and the same JS is what a phone-only on-site popup would do. It is one asset serving all three.

4 · The Klaviyo list — built

Yes, we have an email for all 5,850, which is the whole reason this cohort is reachable. List SRLmDN SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed) is created and populated.

CheckResult
Profiles on the list5,850, matching the roster exactly
Added howList membership via the relationships endpoint. Does not write consent, sends no confirmation email.
Live flows triggering on itZero, checked across all 54 flows in the account. Nothing auto-fired.
Email reachability (100 sampled)100% SUBSCRIBED
SMS state (100 sampled)100% NEVER_SUBSCRIBED, so nobody already opted in is being re-asked

It is a static list, so it will not refresh itself. Anyone on it who opts in through any route stays on it until removed, which means suppress against SMS consent at send time rather than trusting the membership.

07

What it is worth

Smaller base than the wider pool, and it should convert better. Both things are true.

5,850 recoverable x 10% to 13% (Klaviyo phone-only benchmark) = 585 to 760 subscribers 585 to 760 x $7.61 measured value per SMS subscriber = $4,452 to $5,784

model That is a one-off recovery, not a monthly rate, and the benchmark is Klaviyo's for on-site phone-only forms rather than ours for an email-driven landing page. I would treat the low end as the planning number.

Why run this before the bigger list anyway. The 19,970 in RCm4nZ SMS Recovery · phone on file, never SMS-opted-in, email-reachable is a larger prize on paper. But most of those numbers arrived at Shopify checkout, from people who never asked to be texted. This cohort is the opposite: 5,850 people who walked up to the SMS step and pressed the button. If they will not opt in, the wider pool certainly will not, and we will have learned that for a tenth of the send volume. Run this one first as the read on the whole idea.

08

Live pop-up consent audit

Every live form on the account, checked for whether a submit actually results in a consent record. This is the “never let this happen again” pass, and it found things.

Tap-to-text is gone from every live form. I pulled all 10 live form definitions and searched case-insensitively for a subscribe_via_sms action and for the string “Klaviyo Library”: zero of ten carry either. The mechanism that produced the 5,004-person failure cannot fire from any pop-up today.

The traffic has stopped too. Since the fix went live on 18 August, only 7 tap-to-text opt-in messages have arrived, all of them on the 18th itself, and none on the 19th or 20th. The bleeding is over.

But the parser fault was never fixed, only starved of traffic. All 7 of those late arrivals were still classified unrecognized. We removed the button, not the bug. And 9 draft forms still carry a live tap-to-text action, 8 of them still carrying the “Klaviyo Library” body: XBdpzj and Y2qrW7 (both “Futuristic tap-to-text”), TamScx “SMS POPUP”, S39mpj “Christmas SMS”, XjmVsc “Exclusive Spermidine Launch List”, T8ZgSM Multi-step email & SMS -- CashBack A/B Test “Multi-step email & SMS -- CashBack A/B Test”, WgtNmQ “BSS - Not subscribed to SMS”, WbnJAj “PROMO - Multi-step email & SMS”, TLCJWj Multi-step email & SMS “Multi-step email & SMS”. Publishing any one of them recreates the collapse exactly. They should be corrected or deleted rather than left as landmines.

A note on how nearly I missed that. My first scan counted the uppercase SUBSCRIBE_VIA_SMS that the current form schema uses and reported zero drafts affected. The legacy schema these drafts are built in writes it lowercase as subscribe_via_sms, so the real answer was nine. Any recurring check has to be case-insensitive and has to cover both schemas.

The keyword is still live on the number

Nothing in a form points at it any more, but +1 888 302 6840 still accepts inbound keywords and SUmgWj SMS Subscribers is still gaining profiles. Anyone working from a saved message, an old screenshot or a cached page still lands in a list no flow listens to.

Four live forms submit to a list that no longer exists. The list ID in the form action returns 404 from both the lists and the segments endpoints. A submit on these goes nowhere: no list, no consent, no flow. This is the same class of silent failure as the tap-to-text bug.

Which pop-ups have double opt-in, and which do not

There are 10 live forms on the account. Seven of them collect a phone number. Those seven are the only ones that can produce an SMS consent record, so they are what matters here. Verified against the live form definitions and the list settings on 21 August; nothing had been changed yet at the time of this pull.

Pop-up that collects a phone numberWrites intoForm setting
consent_type
List setting
opt_in_process
Measured outcome
Email + SMS (sign-up form)the main welcome pop-up · STUCB3 Email + SMS (sign-up form) On-Page SMS SubscribersVdWm2S On-Page SMS Subscribers PROMOTIONAL ONLYsingle opt-in 88.1% subscribedmeasured 19-21 Aug
Countdown Sale - Black Seed OilVqpsb7 Countdown Sale - Black Seed Oil On-Page SMS SubscribersVdWm2S On-Page SMS Subscribers PROMOTIONAL ONLYsingle opt-in Same list, same behaviour
Countdown Sale - NAD+ BOGOTYjzAx Countdown Sale - NAD+ BOGO On-Page SMS SubscribersVdWm2S On-Page SMS Subscribers PROMOTIONAL ONLYsingle opt-in Same list, same behaviour
NAD+ EARLY ACCESSlive on the BFMD Florida launch · VCfHT8 NAD+ EARLY ACCESS BFMD — Florida SMS (Jul 2026)SWAHz2 BFMD — Florida SMS (Jul 2026) SINGLE STEP
TRANS + PROMO
double opt-in 75% subscribedthe double opt-in is NOT gating it
Sleepy COCOA META lead-gen campaignVMcxPc Sleepy COCOA META lead-gen campaign Sleepy Cocoa META SubscribersSQTjGy Sleepy Cocoa META Subscribers not set (legacy)double opt-in Unmeasured · ~0 traffic
EMBED FORM - Meta Sleepy Lead Gen - Collect SMSVDXheq EMBED FORM - Meta Sleepy Lead Gen - Collect SMS Sleepy Cocoa META SubscribersSQTjGy Sleepy Cocoa META Subscribers not set (legacy)double opt-in Unmeasured · ~0 traffic
Cocoa Relaunch Meta SMS Lead genS4T6FR Cocoa Relaunch Meta SMS Lead gen Nothing. The list was deletedXAPZRJ DELETED — does not exist returns 404 not set (legacy)no list exists Nothing · the submit vanishes
Verified working: 4 of the 7

The main welcome pop-up and both countdown sale pop-ups write into On-Page SMS Subscribers, single opt-in since 18 August, measured at 88.1% subscribed. NAD+ EARLY ACCESS sits on a double opt-in list but measures 75% subscribed, so that setting is not gating it. Four of the seven are fine.

Actually broken: 1 of the 7. Unknown: 2

Cocoa Relaunch Meta SMS Lead gen is the only outright break: it collects a required phone number into a list that no longer exists, so every submit is discarded. The two Meta Sleepy forms sit on a double opt-in list with no consent_type set and near-zero traffic, so they are unmeasured rather than proven broken. Check them by consent outcome before changing anything, which is the lesson from the VCfHT8 NAD+ EARLY ACCESS correction above.

The three live pop-ups that do not ask for a phone

Listed for completeness. None of them can affect SMS consent either way, but all three submit into a list that has been deleted, so their email captures are being discarded too.

Live pop-upWrites intoState
BE NOTIFIED WHEN IT'S BACK!back-in-stock · XGMwtT BE NOTIFIED WHEN IT'S BACK!XGcgrx DELETED — does not existList deleted · 404
NMN Out Of StockSrnri4 NMN Out Of StockWZMgtJ DELETED — does not existList deleted · 404
LEAD GENS4WCnA LEAD GENT77WJb DELETED — does not existList deleted · 404

Correction, 21 August: I had this form down as leaking and it is not. I previously reported that VCfHT8 NAD+ EARLY ACCESS converted 750 phone submits into 89 opt-ins, an 11.9% completion rate. That number was wrong and the method that produced it was wrong. I counted new “Subscribed to Text Messaging Marketing” events against total submits, which badly undercounts any form whose visitors are largely already subscribers, because no new subscription event fires for someone who is already in.

Checking the consent state on the profiles directly instead: 135 of 180 sampled phone submitters on VCfHT8 NAD+ EARLY ACCESS are marketing-subscribed, which is 75%. The double opt-in setting on SWAHz2 BFMD — Florida SMS (Jul 2026) is not blocking SMS marketing consent on this form.

What is actually happening on NAD+ EARLY ACCESS

The form carries a PROMOTIONAL_SMS_CHECKBOX labelled “Check this box to receive promotional marketing texts”. Over 1 to 20 August it took 786 submits, and the checkbox came back ticked 509 times and unticked 273 times. So about 35% hand over a phone number without ticking the promotional box.

Those people get transactional consent only. The profile reads sms.transactional.consent = SUBSCRIBED and sms.marketing.consent = NEVER_SUBSCRIBED, which is exactly the pattern in the sample: 25 of 180 sit in that state. That is the form working as designed, not a fault, and it is a legitimate ongoing contributor to the pool. If we want more of that 35%, the lever is the checkbox copy and placement, not the opt-in setting.

The main pop-up change, re-verified the better way

Because that measurement error affected one number, I re-checked the headline the same direct way: take the phone numbers typed into the SMS step and read the consent state on those profiles, rather than counting subscription events.

Cohort of numbers typed into the SMS stepMarketing SUBSCRIBEDNEVER_SUBSCRIBEDUNSUBSCRIBED
1–17 Aug, while On-Page SMS Subscribers was double opt-in43.5%38.1%17.7%
19–21 Aug, after it went single opt-in88.1%5.8%5.4%

260 profiles sampled per period. The finding holds and is slightly stronger than first reported: the share left with no consent fell from 38.1% to 5.8%. It also matches the event-based estimate of 41.2% to 82.7% closely enough to confirm both, so that comparison was sound even though the VCfHT8 NAD+ EARLY ACCESS one was not.

Why the two forms behave differently under the same kind of setting is the distinction in the next section, and it is the thing worth internalising: the list setting and the form setting are not the same control.

The standing check this should become

Every fault on this page is detectable from the API. Every one of these faults is detectable from the API in about two minutes: for each live form, resolve the action's list_id, assert it exists, assert its opt_in_process, and assert SUBSCRIBE_VIA_SMS does not appear. That is worth running on a schedule rather than after the next collapse. Nothing on this page needed a person to notice a revenue dip first.

08b

The opted-in cohort

The people who texted us the subscribe message. Isolated, resolved against live profiles, and compared with the recovery list.

Texted us to subscribe
5,004
Unique numbers, 1 Jun to 21 Aug. 5,002 were classified unrecognized. 5,000 resolved to a live profile.
Still no SMS consent
3,648
1,010 were later subscribed by another route. 342 have since unsubscribed and must stay excluded.

The finding that changes how this cohort has to be handled: 3,437 of the 3,648 have no email address at all. That is 94% of them. Tap-to-text creates a profile from an inbound phone number, so there was never an email step. These are phone-only profiles.

Which means SMS is the only channel that exists for them. They cannot be sent the recovery email, they cannot be sent anything else, and they are invisible to every email-keyed audience we have built. If the inbound text is not treated as their consent, these 3,437 people are simply unreachable, permanently, despite having texted us asking to be contacted.

ResolutionCountNote
Numbers that texted the opt-in message5,004The number is the identifier and we hold it
Resolved to a live Klaviyo profile5,0004 had no profile
Still NEVER_SUBSCRIBED3,648Texted us to subscribe, still not subscribed
… of which phone-only, no email3,437SMS is their only channel
… of which have an email211Reachable either way
Since subscribed by another route1,010Already in. Leave alone
Since unsubscribed342Exclude. They opted out after the fact
Existing customers among the never-subscribed158$29,254 historic revenue
Overlap with the recovery list

The recovery list is SRLmDN, named “SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed)”, holding 5,850 email-reachable people who acted on the SMS step and never completed.

ComparisonPeopleMeaning
In both, matched on email162Remove from the recovery campaign. Asking them to sign up when they already texted us is the wrong message
Have an email but are not on SRLmDN SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed)49Missed by the session join
Cannot be compared: no email to match on3,437Not on SRLmDN SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed) and never could be. Entirely additive.

So the overlap is small on purpose. SRLmDN SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed) is an email-keyed audience and this cohort is overwhelmingly phone-only. These are two different populations reached two different ways, and only 162 people need suppressing between them.

Isolated as a list

Built as UUPZS9, “SMS Consent Evidence - texted opt-in, not subscribed (Jun-Aug 2026)”, holding the 3,648 never-subscribed senders. Added by membership only, so it writes no consent and fires nothing. The 342 who later unsubscribed and the 1,010 already subscribed are excluded.

Two operational notes, not objections. Klaviyo will not deliver to a profile reading NEVER_SUBSCRIBED, so consent has to be written deliberately before any send; list membership alone will not make these sendable. And the inbound event is the evidence: body, sender number and timestamp live only in the event stream, so it should be exported and retained alongside the decision.

09

Open decisions

DecisionWhy it is yours and not mine
Flip SRLmDN SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed) to single opt-in?It defaulted to double opt-in on creation. Irrelevant for sending a campaign, because email consent lives on the profile and all 5,850 are already subscribed. It only matters if a form is ever pointed at this list. UI-only setting.
What is the offer on /claim?The page is built and functional with a placeholder. I will not invent a discount or a code.
Does the recovery email need the framework audit?Yes, and I have not drafted it here. It is a real send to 5,850 people and should go through the framework and the repo pull rather than be improvised in a report.
Sign-off on single opt-in still not on recordCarried over. Every number this page captures lands on a single-opt-in list.
Include the 669 who unsubscribed from SMS?My answer is no. They opted in and left. Re-asking is the kind of thing that produces complaints.

Correction carried forward. The previous report said mobile tap-to-text abandoners were “permanently unrecoverable”. They are not. Their phone numbers are unrecoverable; the people are not, and there are 4,830 of them in the recoverable cohort. I reached that wrong conclusion by reading the empty submitted_fields on the event and stopping there, instead of joining on cid.