Customer.io workspace 199348 · reviewed 7 July 2026

Campaign review: action board

All 75 campaigns audited. 12 safe fixes are already live. Everything left that needs a human is below, sorted by how you action it: clicks in Customer.io, 2 messages to send, one-word approvals for Claude, and 4 bigger calls. Ticks save in this browser.

About 25 minutes of clicks, plus 2 messages

Do in Customer.io

Deep links open the campaign in a new tab

Fix the day-14 test that sends nothing

1 click

Campaign 50, reverse trial. The day-14 A/B still splits 50/50 but the variant (action 529, "tomorrow frame") is a draft, so half that arm gets nothing. Enable 529, or set the split to 100/0.

Decide the 2 parked wrap-up emails

2 clicks

Campaign 73's E2 pair (engaged and disengaged, actions 479 and 480) and campaign 1's action 410 were built, QA'd and never enabled. Everyone passes through unsent. Enable them or delete them; either beats the current silent skip.

Make 5 body edits the API would not let me make

10 min

Customer.io blocks agent edits to Bee-editor bodies. Open each template's text block and swap the string. Copy buttons give you the exact before and after.

Template 271, welcome email (campaign 1):
ready to go — SOAP notesready to go: SOAP notes
Template 272, setting up your workspace:
your practice — all in one placeyour practice, all in one place
Template 273, a better way to work (2 swaps):
automatically — so you stop chasing no-showsautomatically, so you stop chasing no-shows
clinical templates — SOAP notesclinical templates: SOAP notes
Template 277, trial ends in less than a week:
Hi {{customer.first_name}},Hi {{customer.first_name | default: "there"}},
Template 109, cancellation save offer (campaign 12):
Hey {{customer.first_name}},Hey {{customer.first_name | default: "there"}},

Pause or accept the 47% bounce on lost-signup recovery

1 toggle

Campaign 85's first cohort: 19 sent, 9 bounced. Either flip Email 1 (action 680) to draft until addresses pass a MillionVerifier check, or accept the burn while volume is small (115 matched).

Stop the dead post-trial survey

1 click

Campaign 7: one send ever, no conversion goal, 49 people matching but nobody entering. Stop it.

Clear 3 vestigial conversion goals

3 clicks · low priority

Router campaigns 69, 72 and 86 carry a conversion flag with no event behind it, which muddies any goal audit. Turn conversion tracking off on each. Do it in the UI; the API path risks resetting their exit rules.

Send these 2 messages

Copy, adjust names if needed, paste into Slack

To Julian: Stripe promo codes

message

This is the live revenue leak. Evidence.

Hey Julian, two Stripe things from the campaign audit: 1. JUL1 doesn't exist, and the post-trial drip's offer links have pointed at it since Jul 1 (13 people clicked through, 0 redemptions; JULY4 redeems fine, so checkout itself is healthy). Can you create promo code JUL1 today on the $1-for-3-months coupon (the one JUN1 and JUNE1 sit on), with a 31 Jul expiry? And AUG1 with a 31 Aug expiry while you're there. 2. JUNE1 and JUN1 are still redeeming (4 since Jul 1) because they never had expiries. Stripe won't let us add one after creation, so can you flip both to inactive? Longer term I want to move the drip to one evergreen code so this stops recurring. Will bring a proposal.

To engineering: 3 data checks

message
Three quick checks from the CIO campaign audit: 1. create_event_task and create_client_event_task both increment the appointments_count attribute (campaigns 41/42), at ~180/day vs ~3,500/day. Should both feed one counter, or is one of them not really "an appointment"? 2. The invoice-paid trial nudges (campaigns 82/83) have sent almost nothing in 13 days. I suspect the "Paying customers" segment includes active trialers (billing_status goes Active during trial), which would wipe their audience. What sets billing_status during trial? 3. FYI: CIO still maps signup_goal and is_using_existing_platform from track_onboarding_completion, but signup v4 dropped those questions on Jun 12, so new profiles get blanks. Worth deciding if those fields come back or the consumers get retired.

One word to Claude

Say it in any session and it happens, verified, reversible

"Fix the campaign 87 delays"

Claude does it

Both waits are named "Wait 7 days" but set to 1 day and 2 days, so the "day 7" SMS fires around day 3. I set both to 604,800 seconds. People parked mid-wait keep the new timer.

"Debug the voicedrops with me"

Claude session

Two n8n failures: campaign 80's webhook is 0 for 425 with 2,199 failed attempts, and campaign 3 never receives voicedrop_delivered (its voicemail follow-up SMS has zero sends ever). It is your n8n rig, so this is a joint session: we trace both flows, then fix. While we are in there we confirm what the flow keys on, and I repair the invalid holdout (both arms currently send identical payloads saying action_id 481; template 393 should say 482).

"Delete the empty drafts"

Claude does it

15 untitled empty shells (oldest untouched since November 2025) plus campaign 34, Essentials onboarding, for a plan that no longer exists. None has ever sent anything. I delete them and list what went.

Bigger calls

No clicks needed today, but they shape the next quarter

Which offer owns July?

decide

The drip sells $1 a month for 3 months while the July broadcasts sell 50% off 12 months, to overlapping audiences in the same week. Pick one as July's offer; I re-time or pause the other on your word.

Should every signup get cold sales outreach?

decide

Campaigns 1 and 3 have identical triggers, so every new admin gets the onboarding series plus a voicemail, SMS and sales emails in week one. Proposal: campaign 3 only for high-intent segments (team size, insurance interest, tier-1 phone), starting day 2. Say yes and I draft the exact trigger change for review.

Launch order for the 5 finished drafts

decide

Ready to go: Plus onboarding (35), Advanced onboarding (36), monthly to annual (37, 7,798 people match), insurance upsell (39), and the accepting_insurance backfill trio (75 to 77, start then stop when drained). Rank them and I prepare each for your enable click.

Green-light the dunning build

decide

Nothing emails people whose payment fails (billing_status Unpaid). A recovery sequence protects the net-subscriber number the June plan cares about. Say go and I build it as drafts on the standing rule.

The evidence

7 live problems behind the queue

1

The winback drip's July promo code does not redeem

Campaign 73 · revenue leak, live since 1 July

Campaign 73 computes the current month's code in Liquid (JAN1 to DEC1). All 5 live emails and the SMS now emit JUL1. PostHog shows 13 people arriving at checkout with promoCode=JUL1 since 3 July and zero JUL1 redemptions, while JULY4 redeems normally through the same checkout. JUNE1 also never got its expiry: redemptions kept landing until 4 July. The rotation has failed twice in 3 months (MAY1 in the Outlook links in June, JUL1 now).

2

Two conflicting offers are hitting the same people

Campaign 73 and the July broadcasts · same audiences, same week

The same expired-trial population can receive "$1 a month for 3 months" from campaign 73 and "50% off 12 months" from the July broadcasts in the same week. Nothing suppresses one when the other fires.

3

Payments activation runs a 3-day cadence labelled as 14 days

Campaign 87 · live

Both wait steps are named "Wait 7 days". The first is set to 86,400 seconds (one day), the second to 172,800 (2 days). The SMS named "day 7, non-bookers" fires around day 3, before most people have had a chance to book. The stopped twin (campaign 84) has the same values, so the bug came from the original build.

4

The voicedrop channel is broken in 2 places

Campaigns 80, 3 and 72 · failing silently

Campaign 80's live voice-drop webhook has 425 sends, 0 delivered and 2,199 failed attempts with no HTTP status recorded, which reads as connection failures to the n8n endpoint. Separately, campaign 3 never hears back: the SMS that says "following the voicemail I just left" has zero sends ever, because voicedrop_delivered never arrives inside its 10-minute wait. The receiver (campaign 72) shows 5,822 of 7,133 journeys never activating.

5

The voicedrop holdout test is invalid

Campaign 3 · lift numbers unusable

The live arm and the 20% holdout arm send byte-identical webhook payloads. Both declare action_id 481. I verified the 2 templates directly. Unless n8n suppresses on some other signal, the holdout receives real voicemails and the test measures nothing.

6

A live A/B arm sends nothing

Campaign 50 · day-14 test

The day-14 test in the reverse-trial journey still splits 50/50, but the variant action (529) is in draft. Half the people randomised into that arm receive nothing, and have since the test went live. The same built-but-never-enabled pattern sits in campaign 1 (action 410) and campaign 73 (both E2 variants).

7

Lost-signup recovery is bouncing at 47%

Campaign 85 · 4 days old

First cohort: 19 sent, 9 bounced. Abandoned signups are typo-prone by nature, but at this rate the campaign damages sender reputation for a tiny audience (115 matched so far).

Already fixed on 7 July, live and verified

Grammar on both trial-end SMS templates. Preheaders on the 10 emails that had none or had a wrong one (272 to 277, 396, 397, 109, and campaign 70's cancellation email, which promised a reschedule link the body does not have). Capterra review link verified working; the June 404 concern is closed. No sending states, triggers, delays, splits or goals were changed.

The numbers

Deliverability has recovered; long sequences decay

Weekly email health, 12 weeks to 5 July

Human opens and bounce as a share of delivered emails. Hover for each week's detail. The final week is partial.

Human opens Bounce
Week startingDeliveredHuman opensBounce

Human engagement by campaign, lifetime

Opens and clicks as a share of delivered, across each campaign's email sends. Campaigns under a 20% open rate need work.

Human open rate
Human click rate
CampaignHuman openHuman click

Week one for a new signup

Campaigns 1 and 3 share identical entry triggers, and campaign 50 starts the same day. Up to 15 touches land in the first 8 days, with no frequency cap anywhere in the workspace.

Email SMS or voicemail In-app
After this week

The rest of the 90-day plan

This week's work is the queue above. These phases follow.

Weeks 1 to 2 · make results measurable
  1. Add conversion goals to campaigns 74 and 63, and filter campaign 87's goal to the payments call type.
  2. Stand up the offer holdout from the June plan; without it the offer-volume debate stays unresolvable.
  3. Roll SMS hygiene everywhere: segment 159 negation plus a tier-1 country gate on every SMS action. Campaign 1's first SMS alone wasted 766 sends at a 41.8% bounce.
Weeks 3 to 6 · orchestrate the lifecycle
  1. Split new-signup traffic deliberately (the campaign 1 and 3 decision above), and add per-person spacing across the paid motions: payments first, managed billing second, reviews after week 2.
  2. Consolidate post-trial into one coordinated sequence with one offer, and patch the campaign 9 dead-end cohort (up to 468 people permanently blocked from campaign 73).
  3. Launch the finished drafts in your chosen order, and build the dunning sequence.
  4. Archive campaign 1's dead legacy actions (18 zero-traffic actions and a branch that routes both outcomes to the same step).
Weeks 7 to 12 · rebuild the testing and creative engine
  1. Replace manual cohort splits with native 2-arm tests that have activation dates, sample rules and a written decision at the end. Conclude the flat $1-against-50%-off trial-end test.
  2. Rewrite the bottom quartile by engagement: campaign 1's back half, campaign 73's E3 to E6, the case-study email, campaign 80's emails 3 and 4. The payments in-app modal converts 86% of viewers while its matching email clicks at 0.7%: offers are fine, email creative is the gap.
  3. Make the cancellation test honest: same offer in both arms, and record the branch and outcome on the profile.
  4. Watch deliverability weekly against the all-metrics series and Google Postmaster.