Black Forest Supplements · 12 October 2026
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.
All figures read live from Klaviyo on 12 Oct 2026. Cohort audit covers all 792 candidates, not a sample. Currency USD.
Question 1 · Can we write consent for SRLmDN on the August basis?
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
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?
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.
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 profile | SMS consent | Email consent | Profiles | What it means |
|---|---|---|---|---|
| None | Never subscribed | Subscribed | 4,161 | No number was ever captured. Consent cannot be written. Emailable. |
| None | Never subscribed | Unsubscribed | 299 | No number, no email channel. Unreachable by any means. |
| Yes | Never subscribed | Subscribed | 741 | The only cohort where a write is technically possible. Emailable. |
| Yes | Never subscribed | Unsubscribed | 51 | Write technically possible, no email fallback. |
| Yes | Subscribed | Subscribed | 488 | Already textable. In the standing audience today. |
| Yes | Subscribed | Unsubscribed | 13 | Already textable. |
| Yes | Unsubscribed | Subscribed | 53 | Opted out. Never re-subscribe. |
| Yes | Unsubscribed | Unsubscribed | 11 | Opted out of both. |
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.
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.
* 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.
Fourteen messages across thirteen profiles, out of 792. This is the whole evidence base for a write.
| Date | Klaviyo intent | Message body | Qualifies? |
|---|---|---|---|
| 2026-07-04 | Say yes | / Yes | Yes |
| 2026-07-27 | Say yes | Yea | Yes |
| 2026-07-17 | Other | Send this text to subscribe to recurring automated personali… | Yes |
| 2026-08-13 | Other | Send this text to subscribe to recurring automated personali… | Yes |
| 2025-03-24 | Other | Send this text to subscribe to recurring automated personali… | Stale, 19 months old |
| 2026-08-03 | Say no | No | Refusal |
| 2026-08-05 | Say no | No | Refusal |
| 2026-07-04 | — | Help | No |
| 2026-08-06 | — | Help | No |
| 2026-08-18 | — | Help | No |
| 2026-07-20 | Other | Ayuda | No |
| 2026-08-06 | Ask for coupon | whre is my first time buy discount | No |
| 2026-08-17 | Other | Play Solitaire Grand Harvest with me! Download here… | Wrong number |
| 2026-08-18 | Other | Purchase. Cruise shippers in the first Seattle's gone… | No |
| X4KUdE — the August write | SRLmDN — this cohort | |
|---|---|---|
| Artefact | An inbound text from the person's own handset, stating consent | A completed SMS step on pop-up form STUCB3, then our confirmation text, unanswered |
| Direction of evidence | They wrote to us | We wrote to them |
What consented_at would point to | The timestamp of their own message | Nothing. There is no moment they agreed |
| Has a phone number | All rows | 1,357 of 5,817 |
| Last recorded decision | Affirmative | Silence, 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.
The number in the brief, roughly 4,900, is real. It is just not a consent-write population. It is an email population.
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.
The ten Protein Coffee SMS sends, 23 September to 9 October, each named a union of seven audiences.
| Audience | Type | Size | Gated on | Problem |
|---|---|---|---|---|
| QUmxvtBFMD — Rest of USA · SMS (Jul 2026) | Segment, dynamic | 61,620 | SMS consent | Excludes everyone in Y6cq5E and VTSaRh |
| XEKi5TEVERYONE ✅ | Segment, dynamic | 461,564 | Email consent | An SMS subscriber who is not email-marketable falls out |
| XiNVKGALL SMS CUSTOMERS (August 28th, 2025) | List, static | 46,724 | Frozen membership | Nobody who consented after 28 Aug 2025 is in it |
| VTSaRhBFMD — Approved Launch States (Jul 2026) | List, static | 156,688 | Frozen membership | Email list, frozen 30 Jun 2026 |
| Spxq7dBFMD — Approved Launch States SMS (Jul 2026) | List, static | 31,379 | Frozen membership | Frozen 30 Jun 2026 |
| SWAHz2BFMD — Florida SMS (Jul 2026) | List, static | 7,422 | Frozen membership | Frozen 1 Jul 2026 |
| RunR7EAncestral Coffee Launch SMS Opt-In | List, static | 1,286 | Frozen membership | Frozen 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.
XEKi5T "EVERYONE ✅",
despite being gated on email, catches almost everyone.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:
| Segment | Profiles |
|---|---|
| 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 + overseas | 96,710 vs 96,709, one profile of live drift during the reads |
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.
The reconciliation does not come out clean. Running it is what found this, and the control is what explained it.
| Step | Profiles | Note |
|---|---|---|
| Standing audience, TnYp6E | 94,049 | Consented, US/CA, textable |
| Received zero texts from 5 Oct onward | 8,314 | Across all seven launch sends over five days |
| … of which consented after 5 Oct | 107 | Never eligible. Correctly excluded |
| Unexplained residual | 8,207 | 8.7% of the audience. Should be zero. |
| Recovered by switching to TnYp6E | 182 | 2.2% of the residual |
| Still unreachable after the fix | 8,025 | Already inside the lists the campaigns targeted |
Eighty of the residual were sampled and their list memberships read directly.
<phone>@postscriptapp.com email, which makes these Postscript migration artefacts. The job is deduping, not recovery.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.
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.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.
| Line | Clean result | What a non-zero value means |
|---|---|---|
| Partition check | exact | The standing audience and the overseas exclusion have drifted apart. One of the two definitions was edited |
| Zero texts since window | Small | Raw count, before eligibility. Not yet a problem |
| Opted in during/after | Any | Correctly excluded. These were never eligible |
| Unexplained residual | 0 | Consented, 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 |
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)".
/pages/texts, landing in VdWm2S "On-Page SMS Subscribers". Needs the incentive-line decision that is still open from to-do #11.@postscriptapp.com twins. Do NOT clear consent flags: these are real subscribers who already receive our texts on their other record.