Black Forest Supplements · 12 October 2026

SMS reachability: the consent write, and the gap that was not the audience

Two questions were on the table. Can we write SMS consent for the 5,817 in SRLmDN "SMS Gap Recovery - tried Jun-Aug 2026 (never confirmed)" the way we did in August, and can we build a campaign audience that cannot silently drop a consented profile.

The first answer is no, and not narrowly: three quarters of that list has no phone number at all, and of the 792 who do, five hold the artefact the August write rested on. The second answer is yes, the audience is built and exact, but it recovers 182 people, not thousands. The missing 8,207 are inside the audience already and are being skipped at send.

5 of 792
hold the August consent artefact
4,460
of 5,817 have no phone number
4,902
recoverable by email instead
94,049
standing audience, built today
~7,300
duplicate records, not lost people

All figures read live from Klaviyo on 12 Oct 2026. Cohort audit covers all 792 candidates, not a sample. Currency USD.

00

Verdict

Question 1 · Can we write consent for SRLmDN on the August basis?

No  The artefact is not the same one, and for most of them there is no artefact at all.

The August write against X4KUdE "SMS Consent Write - opt-in artefact (Aug 2026)" was defensible because every row traced to one inbound text from that person's own handset, and was backdated to that text. SRLmDN is the opposite case. 4,460 of 5,817 have no phone number on the profile, so there is nothing to write consent against. Of the 792 who have a number and are not already subscribed, 503 were sent the confirmation text and never answered it, and 2 answered "No". Five hold a qualifying inbound text. Writing consent here would not be backfilling a record, it would be overriding one.

Question 2 · A standing audience that cannot silently drop a consented profile

Built  TnYp6E "[BFS] SMS — Standing Campaign Audience (US/CA consented)", 94,049 profiles.

Defined as the exact complement of the overseas exclusion, so consented minus standing audience equals overseas, permanently, with no per-campaign discipline required. It is not attached to any campaign yet. It replaces a union of seven audiences, five of which are static lists frozen between August 2025 and September 2026.

Question 2, continued · Does the reconciliation come out clean?

No, and the residual is duplicates  8,207 consented profiles received none of the launch's seven sends — because they are duplicate records.

Switching audiences recovers 182. The rest share a phone number with another profile: 89% of them, against a 16% control, and in 94% of those pairs the twin did receive the text. Klaviyo sends once per number, so the duplicate logs nothing while the actual person is reached. Nobody is missing our texts. The count is inflated by roughly 7,300 duplicate records, so the real base is about 86,700, not 96,709.

01

What SRLmDN actually contains

The brief described roughly 4,900 people who gave us a number and receive nothing. The first half of that is wrong, and it changes the whole question.

Phone on profileSMS consentEmail consentProfilesWhat it means
NoneNever subscribedSubscribed4,161No number was ever captured. Consent cannot be written. Emailable.
NoneNever subscribedUnsubscribed299No number, no email channel. Unreachable by any means.
YesNever subscribedSubscribed741The only cohort where a write is technically possible. Emailable.
YesNever subscribedUnsubscribed51Write technically possible, no email fallback.
YesSubscribedSubscribed488Already textable. In the standing audience today.
YesSubscribedUnsubscribed13Already textable.
YesUnsubscribedSubscribed53Opted out. Never re-subscribe.
YesUnsubscribedUnsubscribed11Opted out of both.
76.7% of the list has no phone number. These are people who reached the SMS step of the pop-up on mobile and never submitted a number. There is no consent decision to make about them, because there is nothing to text. The candidate pool for any write is 792, not 4,900.

Measured count of never-subscribed is 5,252 of 5,817, or 90.3%, rather than the 85% in the brief. The list is SRLmDN, a static list created 20 Aug 2026.

02

The artefact, for all 792 candidates

Every candidate's own event stream was read and classified on the direction of its SMS evidence. Inbound, from their handset, is consent. Outbound, our confirmation request, is a question they did not answer. This is a full census of the 792, not a sample.

Asked to confirm, never replied
503 · 63.5%
No SMS evidence in the last 100 events *
208 · 26.3%
Typed a number, no confirmation ask on record
54 · 6.8%
Confirmation text never delivered
14 · 1.8%
Inbound text, not a yes or a no
9 · 1.1%
Confirmed by inbound text
2 · 0.3%
Refused in writing
2 · 0.3%

* The events endpoint returns the most recent 100 events, which truncates a June opt-in for an active profile. Re-querying 60 of this bucket by metric directly found 41 of 60 (68%) did receive the confirmation ask and 2 of 60 had an inbound text. Corrected, roughly four in five of the full 792 were asked by text and did not answer.

Every inbound text in the cohort

Fourteen messages across thirteen profiles, out of 792. This is the whole evidence base for a write.

DateKlaviyo intentMessage bodyQualifies?
2026-07-04Say yes/ YesYes
2026-07-27Say yesYeaYes
2026-07-17OtherSend this text to subscribe to recurring automated personali…Yes
2026-08-13OtherSend this text to subscribe to recurring automated personali…Yes
2025-03-24OtherSend this text to subscribe to recurring automated personali…Stale, 19 months old
2026-08-03Say noNoRefusal
2026-08-05Say noNoRefusal
2026-07-04—HelpNo
2026-08-06—HelpNo
2026-08-18—HelpNo
2026-07-20OtherAyudaNo
2026-08-06Ask for couponwhre is my first time buy discountNo
2026-08-17OtherPlay Solitaire Grand Harvest with me! Download here…Wrong number
2026-08-18OtherPurchase. Cruise shippers in the first Seattle's gone…No
Four usable artefacts, and two explicit refusals. The three "Send this text to subscribe to recurring automated personalised marketing messages" rows are the real keyword opt-in and would qualify on the August basis, but one is from March 2025. Backdating consent for four people is not worth an operational run, and the other 788 do not have what those four have.

Why this is not the August cohort

X4KUdE — the August writeSRLmDN — this cohort
ArtefactAn inbound text from the person's own handset, stating consentA completed SMS step on pop-up form STUCB3, then our confirmation text, unanswered
Direction of evidenceThey wrote to usWe wrote to them
What consented_at would point toThe timestamp of their own messageNothing. There is no moment they agreed
Has a phone numberAll rows1,357 of 5,817
Last recorded decisionAffirmativeSilence, after being asked directly

Klaviyo's double opt-in worked exactly as designed here. It asked, and it did not get an answer. A profile in that state is not a gap in the record, it is the record.

On the 0.10% complaint ceiling. It would not have survived this send anyway. Writing consent for ~790 never-texted numbers and warming them permits one complaint at that ceiling before we are over it. Two of the thirteen people in this cohort who did reply, replied "No".
03

The route that does work, and it is bigger

The number in the brief, roughly 4,900, is real. It is just not a consent-write population. It is an email population.

No phone, email-marketable
4,161
Has phone, not subscribed, email-marketable
741
Reachable by email today
4,902

Send them the SMS-ask email already built for to-do #11 and link it to the opt-in page at /pages/texts. Anyone who submits a number there lands in VdWm2S "On-Page SMS Subscribers", which is single opt-in, so the submission itself is the consent, timestamped to the moment they gave it.

This produces consent that is genuinely theirs, needs no backdating, carries no legal exposure, and the first text they receive is the welcome flow they triggered by their own action. There is no cold send and therefore no complaint-ceiling risk to manage.

93.3% of the no-phone group is email-marketable. The population the brief wanted to recover is recoverable, through a channel we already hold permission for, with an asset that is already built.
04

The standing audience

What the campaigns target today

The ten Protein Coffee SMS sends, 23 September to 9 October, each named a union of seven audiences.

AudienceTypeSizeGated onProblem
QUmxvtBFMD — Rest of USA · SMS (Jul 2026)Segment, dynamic61,620SMS consentExcludes everyone in Y6cq5E and VTSaRh
XEKi5TEVERYONE ✅Segment, dynamic461,564Email consentAn SMS subscriber who is not email-marketable falls out
XiNVKGALL SMS CUSTOMERS (August 28th, 2025)List, static46,724Frozen membershipNobody who consented after 28 Aug 2025 is in it
VTSaRhBFMD — Approved Launch States (Jul 2026)List, static156,688Frozen membershipEmail list, frozen 30 Jun 2026
Spxq7dBFMD — Approved Launch States SMS (Jul 2026)List, static31,379Frozen membershipFrozen 30 Jun 2026
SWAHz2BFMD — Florida SMS (Jul 2026)List, static7,422Frozen membershipFrozen 1 Jul 2026
RunR7EAncestral Coffee Launch SMS Opt-InList, static1,286Frozen membershipFrozen 15 Sep 2026

Five of the seven are static lists. The only SMS-gated dynamic member, QUmxvt, excludes anyone in Y6cq5E "BFMD — Florida Launch (May 2026)" (26,195) and in VTSaRh. That is a structure held together by remembering to re-add lists, and it is what prompted the question.

What it actually costs us

182 people. A segment built to hold exactly the consented profiles outside all seven audiences returns 182, of whom 3 are not reachable by any of them on any channel. The union is untidy and fragile, but it is not where thousands of people are being lost. XEKi5T "EVERYONE ✅", despite being gated on email, catches almost everyone.

The replacement

TnYp6E   "[BFS] SMS — Standing Campaign Audience (US/CA consented)"      94,049

  SMS marketing consent  =  SUBSCRIBED
  AND  phone_number      contains "+1"

The second condition is the exact inverse of XrWsJK "Overseas SMS Subscribers (non +1) — exclude from SMS", which is defined as consented and phone not containing "+1". The two partition the consented population with no overlap and no remainder:

SegmentProfiles
ViLa8z "All SMS Subscribers"96,709
TnYp6E "[BFS] SMS — Standing Campaign Audience (US/CA consented)"94,049
XrWsJK "Overseas SMS Subscribers (non +1) — exclude from SMS"2,661
Standing + overseas96,710 vs 96,709, one profile of live drift during the reads
Use TnYp6E alone, with no exclusions. Overseas is outside it by construction, so there is no per-campaign exclusion to remember and no way to forget one. A profile that consents tomorrow is in it tomorrow.

Worth noting, because it was a reasonable thing to suspect: the ten Protein Coffee campaigns carry no exclusions at all, XrWsJK included, where earlier campaigns excluded it 56 times. Checked directly, 0 of 80 sampled overseas profiles received the 5 October text. They are already out through the account's regional sending limits, so no overseas numbers were charged for. The missing exclusion is untidy, not costly.

05

The residual: 8,207 duplicate records

The reconciliation does not come out clean. Running it is what found this, and the control is what explained it.

StepProfilesNote
Standing audience, TnYp6E94,049Consented, US/CA, textable
Received zero texts from 5 Oct onward8,314Across all seven launch sends over five days
… of which consented after 5 Oct107Never eligible. Correctly excluded
Unexplained residual8,2078.7% of the audience. Should be zero.
Recovered by switching to TnYp6E1822.2% of the residual
Still unreachable after the fix8,025Already inside the lists the campaigns targeted

They were in the audience, and they are duplicates of people who were reached.

Eighty of the residual were sampled and their list memberships read directly.

In at least one targeted static list
49 of 74 · 66%
  · VTSaRh "BFMD — Approved Launch States"
33
  · Spxq7d "BFMD — Approved Launch States SMS"
33
  · XiNVKG "ALL SMS CUSTOMERS (Aug 2025)"
29
  · SWAHz2 "BFMD — Florida SMS"
6
In none of them
25 of 74 · 34%
They are duplicate profile records, not people missing our messages. 89% of them share a phone number with another profile against a 16% control, and in 94% of those pairs the twin received the text. Klaviyo sends once per number. Around 56% of the pairs include a synthetic <phone>@postscriptapp.com email, which makes these Postscript migration artefacts. The job is deduping, not recovery.

What they look like

LIST_IMPORT
5,084 · 61%
KLAVIYO_FORM
1,125 · 14%
TEXT
931 · 11%
SHOPIFY
866 · 10%
API
301 · 4%

How consent was recorded, for the 8,314.

61% came in through a list import, peaking in August 2025 with 1,762 profiles. That is a correlate of the Postscript migration, not a cause: the import is what created the second profile per phone.

Only 24% carry a delivery failure, and 51% last received a text between July and October 2026. These are working numbers attached to a redundant record.

This changes the denominator. Every per-message and per-subscriber figure computed against ViLa8z's 96,709 is overstated. The base that resolves to a distinct reachable person is about 86,700. Note also that SMS consent ran net negative in the week to 12 Oct: 1,858 subscribed against 2,226 unsubscribed.
Read this against the 0.10% ceiling before switching audiences. Moving to TnYp6E is correct, but it puts the full consented base into every send, including stale imported numbers that have not received anything in months. Complaint risk sits with the people who are reachable but have not heard from us in a long time, not with the dead numbers. Send once to the standing audience and read the complaint rate before making it the default.
06

The post-send check

Run after every SMS campaign. It answers one question: did anyone who should have been texted get nothing, and if so, why.

python3 scripts/sms_audience_reconcile.py --since 2026-10-05 --diagnose

It compares the standing audience against profiles with zero WKY8He "Received Text Message" events in the window, filters each one on its own consent timestamp so growth is never mistaken for a gap, and separates audience exclusion from delivery failure. A clean run prints a residual of zero. Today's run prints 8,207.

LineClean resultWhat a non-zero value means
Partition checkexactThe standing audience and the overseas exclusion have drifted apart. One of the two definitions was edited
Zero texts since windowSmallRaw count, before eligibility. Not yet a problem
Opted in during/afterAnyCorrectly excluded. These were never eligible
Unexplained residual0Consented, textable, eligible, and sent nothing. Investigate every one
Carry a delivery failure—High share means bad numbers, not a bad audience. An audience change will not fix it
One implementation note worth keeping. The obvious version of this check, paging both populations and subtracting, needs about a thousand calls against Klaviyo's profile endpoints and runs for over two hours. Asking Klaviyo the same question as a segment costs two calls and returns in about twenty-five seconds. The paged version was written first and abandoned.

A standing segment holds the current residual so it can be watched without re-running anything: RakHHs "[BFS] SMS — Consented but UNREACHABLE (no text received since Oct 5)".

07

To do

  1. Do not write consent for SRLmDN.Decision · Juan The four qualifying rows are not worth a run, and the 503 documented non-replies are a record we should not override.
  2. Send the SMS-ask email to the 4,902 email-marketable members of SRLmDN.Build · mine Links to /pages/texts, landing in VdWm2S "On-Page SMS Subscribers". Needs the incentive-line decision that is still open from to-do #11.
  3. Send one campaign to TnYp6E "[BFS] SMS — Standing Campaign Audience (US/CA consented)" alone, with no exclusions, and read the complaint rate.Klaviyo UI · Juan Do not make it the default until that number is in. It adds about 8,200 profiles who have not been texted in months.
  4. Dedupe the ~7,300 duplicate profiles.Decision · Juan Merge or clear the @postscriptapp.com twins. Do NOT clear consent flags: these are real subscribers who already receive our texts on their other record.
  5. Re-baseline the SMS figures that use 96,709 as the denominator.Mine The reachable base is about 86,700. This touches the SMS baseline page and anything quoting cost per subscriber.
  6. Retire XiNVKG "ALL SMS CUSTOMERS (August 28th, 2025)" from campaign audiences.Klaviyo UI · Juan Frozen 13 months ago. Superseded entirely by TnYp6E once step 3 clears.