Work · Retention & payment recovery · Recurring membership offer
Subscription Funnel
Cards decline and the membership just ends, silently
A 3-tier membership was silently losing members to failed payments with no upsells and no drop-off visibility. Stripe-triggered recovery and multi-channel flows lifted retention 35%.
- GoHighLevel
- Stripe
- Funnel design
- Role · sole designer & builder
- 4 min
- retention
- +35%Measured
- churn revenue recovered
- AutoMeasured
- conditional-access offer
- 3-tierMeasured
- System size
- System flow · 5 stages · 15 components reconstructed from the build record
The situation
The offer was a three-tier recurring membership. Members joined, paid monthly, and some of them stopped paying without ever deciding to leave. Their card expired, or a charge was declined, and the subscription simply ended.
Nothing chased those payments. There was no dunning, no retry messaging, and no notification to anyone that a paying member had just become a former one.
There was no route up, either. Moving between tiers required a conversation, so members who had outgrown their tier stayed on it or left. And the owner had no view of which tier people were dropping off at, which made the whole thing unfixable by inspection.
What was broken
- Failed payments ended subscriptions silently, with no retry and no recovery message.
- There was no upsell path at all, so an upgrade depended on someone having a conversation.
- Content access was not tied to live payment state, so the gate and the billing were two separate truths.
- The owner had zero visibility into which tier members dropped off at, or why.
- Retention messaging, where it happened, ran on a shared calendar rather than on each tier's own billing clock.
Constraints
- Billing lives in Stripe, so recovery had to be driven by real subscription events rather than by a guessed schedule.
- The three tiers differ in timing and in what they include, not in mechanism, so one machine had to serve all three.
- Every retention send had to be opt-out aware. A save sequence is exactly where an unsubscribed member gets messaged by accident.
- Nothing in the build could depend on the owner noticing a failed payment.
FIG 01 · System Flow
How the system actually runs
Every component below is reconstructed from the project’s own build records. Nothing is added to make it look bigger.
- components
- 15
- components
- stages
- 5
- stages
- decisions & guards
- 3
- decisions & guards
- AI
- 0
- AI
- human handoffs
- 0
- human handoffs
- platforms
- 4
- platforms
- Stage 1, Billing event: A charge fails, or a member reaches a tier boundary.
- Payment fails (Trigger, Stripe). A recurring charge is declined on any of the three tiers. Connects to Stripe dunning.
- Tier boundary hit (Trigger, GoHighLevel). A member reaches the edge of what their current tier includes. Connects to Conditional access gate.
- Stage 2, Conditional access: What a member can see is decided by their live subscription state, not by a manual list.
- Conditional access gate (Guard, GoHighLevel). Gates content across the three membership tiers by live subscription state. Connects to Dynamic pricing table when tier limit reached; Drop-off visibility when tier state.
- Dynamic pricing table (CRM record, GoHighLevel). Shows the tier options in context, priced against what the member already has. Connects to One-click upsell.
- One-click upsell (Workflow, GoHighLevel). Moves a member up a tier without leaving the flow they are already in. Connects to Member upgraded.
- Stage 3, Payment recovery: The failed charge gets retried and chased before anyone calls it churn.
- Stripe dunning (Payment, Stripe). Retries the failed charge and sends the payment-recovery messaging alongside it. Connects to Recovered?.
- Recovered? (Decision, Stripe). Checks whether the retry actually took the money. Connects to Subscription saved when yes; Retention flow starts when not yet.
- Stage 4, Retention flows: If money does not come back on its own, the member is worked — on their own billing clock.
- Retention flow starts (Workflow, GoHighLevel). Opens the multi-channel save sequence for a member the retry did not rescue. Connects to Billing-cycle timing.
- Billing-cycle timing (Scheduled job, GoHighLevel). Times each send against that tier’s own billing cycle rather than a shared calendar. Connects to SMS save sequence when per-tier send window; Email save sequence when per-tier send window.
- SMS save sequence (Message, SMS). Texts the member about the lapsed payment on the fastest channel available. Connects to Subscription saved when member pays; Drop-off visibility when no answer.
- Email save sequence (Message, Email). Runs the same save in email for members who do not answer a text. Connects to Subscription saved when member pays; Drop-off visibility when no answer.
- Opt-out guard (Guard, GoHighLevel). Suppresses retention sends for anyone who has opted out of the channel. Connects to SMS save sequence when opted out — stop; Email save sequence when opted out — stop.
- Stage 5, Outcome: Saved, upgraded, or at least visible instead of a silent disappearance.
- Subscription saved (Outcome). The member keeps paying — either the retry landed or the sequence brought them back. Connects to Drop-off visibility when aggregated.
- Member upgraded (Outcome). The member moves up a tier through the upsell rather than out of the product.
- Drop-off visibility (Report). Shows which tier a member left at, and at which step of the save.
A member on the middle tier has their card declined on the monthly charge.
0/8A member on the middle tier has their card declined on the monthly charge.
Read this system as text
Stage 01
Billing event
A charge fails, or a member reaches a tier boundary.
- Payment fails · Trigger · Stripe — A recurring charge is declined on any of the three tiers. → Stripe dunning
- Tier boundary hit · Trigger · GoHighLevel — A member reaches the edge of what their current tier includes. → Conditional access gate
Stage 02
Conditional access
What a member can see is decided by their live subscription state, not by a manual list.
- Conditional access gate · Guard · GoHighLevel — Gates content across the three membership tiers by live subscription state. → Dynamic pricing table (tier limit reached), Drop-off visibility (tier state)
- Dynamic pricing table · CRM record · GoHighLevel — Shows the tier options in context, priced against what the member already has. → One-click upsell
- One-click upsell · Workflow · GoHighLevel — Moves a member up a tier without leaving the flow they are already in. → Member upgraded
Stage 03
Payment recovery
The failed charge gets retried and chased before anyone calls it churn.
- Stripe dunning · Payment · Stripe — Retries the failed charge and sends the payment-recovery messaging alongside it. → Recovered?
- Recovered? · Decision · Stripe — Checks whether the retry actually took the money. → Subscription saved (yes), Retention flow starts (not yet)
Stage 04
Retention flows
If money does not come back on its own, the member is worked — on their own billing clock.
- Retention flow starts · Workflow · GoHighLevel — Opens the multi-channel save sequence for a member the retry did not rescue. → Billing-cycle timing
- Billing-cycle timing · Scheduled job · GoHighLevel — Times each send against that tier’s own billing cycle rather than a shared calendar. → SMS save sequence (per-tier send window), Email save sequence (per-tier send window)
- SMS save sequence · Message · SMS — Texts the member about the lapsed payment on the fastest channel available. → Subscription saved (member pays), Drop-off visibility (no answer)
- Email save sequence · Message · Email — Runs the same save in email for members who do not answer a text. → Subscription saved (member pays), Drop-off visibility (no answer)
- Opt-out guard · Guard · GoHighLevel — Suppresses retention sends for anyone who has opted out of the channel. → SMS save sequence (opted out — stop), Email save sequence (opted out — stop)
Stage 05
Outcome
Saved, upgraded, or at least visible instead of a silent disappearance.
- Subscription saved · Outcome — The member keeps paying — either the retry landed or the sequence brought them back. → Drop-off visibility (aggregated)
- Member upgraded · Outcome — The member moves up a tier through the upsell rather than out of the product.
- Drop-off visibility · Report — Shows which tier a member left at, and at which step of the save.
Platforms · GoHighLevel · Stripe · SMS · Email
What I built
Two events start the same machine: a declined charge, and a member reaching the edge of what their tier includes. Recovery and upsell are the same funnel viewed from two directions, which is why they share the access gate underneath.
The conditional access gate
Content across the three tiers is gated on live subscription state rather than on a manual list. This is the quiet load-bearing piece. Access that is not tied to payment state keeps serving people who stopped paying, and it also makes dunning pointless, because nothing changes when the money stops.
Dunning that runs itself
A declined charge goes straight into Stripe dunning: the retry, plus the payment-recovery messaging alongside it. Churn revenue recovers itself instead of walking out unnoticed. A branch then checks whether the retry actually took the money, because "we sent a retry" and "we got paid" are different states.
The save sequence
If the retry did not rescue the member, a multi-channel save sequence opens. It runs on SMS and on email, so a member who ignores a text still gets a route back. Sends are timed against that tier's own billing cycle rather than a shared calendar, since a member three days from renewal and one three weeks out need different urgency.
The upgrade path
A dynamic pricing table shows the tier options in context, priced against what the member already has. A one-click upsell then moves them up without leaving the flow they are in. That path did not exist before, which is why upgrades used to require a conversation.
Drop-off visibility
Every outcome, saved or lost, is written back against the tier and the step of the save where it happened. The original diagnosis was a measurement failure rather than a marketing one, so the build ends in a reporting surface rather than a send.
Edge cases and failure handling
- A retry that succeeds: the member is marked saved and never enters the retention sequence, so nobody gets chased for money that already cleared.
- A retry that fails because the card is genuinely dead: the save sequence opens instead of the subscription just ending.
- A member who has opted out of a channel: the guard suppresses the retention send on that channel rather than letting a save sequence override consent.
- A member who never answers: the non-response is logged against their tier and their step, so a silent loss still produces information.
- A member at a tier boundary rather than a billing failure: the same gate routes them to the pricing table and the upsell instead of to dunning.
How I verified it
The verification evidence for this build is thin, and I will not dress it up. There is no test suite or read-back record in the material I hold for it. The system does provide its own check. The recovered-or-not branch after dunning distinguishes an attempted retry from a successful one, and the drop-off reporting shows where members actually leave. Both were built so the owner could see the machine working rather than take my word for it.
What changed
+35% membership retention, measured. Churn revenue recovers automatically instead of walking out the door, because the failed charge is now retried and chased without anyone noticing it first.
The owner also has something they did not have before. A clear view of drop-off across all three tiers, showing which tier a member left at and at which step of the save. That is the part that keeps paying off, because it turns the next retention decision into a reading rather than a guess.
Before / after
- Before
- ✕ Failed payments silently ending subscriptions
- ✕ No dunning, no recovery, no upsells
- ✕ Zero visibility into which tier members dropped off at
- After
- ✓ +35% membership retention
- ✓ Churn revenue recovered automatically
- ✓ Clear drop-off visibility across all three tiers
MeasuredOutcome figures on this page were measured before and after the build.
Related systems
Not a one-off.
Subscription accountability app
AI Accountability Platform
The same payment-recovery lifecycle, on the same subscription-retention brief.
+40%re-engagementMeasured
Digital publishing product · sibling of CS-04
AI book-writing application
Trials, offer selection and checkout instrumented for a recurring product.
100API endpoints across the product’s two servicesScope
Aesthetics clinic · single-treatment programme, via agency
Deposit-gated booking architecture
Both make a payment actually landing the thing that unlocks access.
24hslot hold — confirmed now means paidScope
Have something close to this? Book a call. I’ll tell you if I’ve already built it.
One Manila business day to reply. All client work is under NDA; what you see here is redrawn architecture with real metrics.