Back to the build library
Fitness & wellness
Advanced

Membership Onboarding & Retention

Convert trials into members, onboard them on rails, and catch churn risk from attendance data before the cancellation arrives.

Industry
Fitness & wellness
Build effort
Advanced
Typical time to launch
4–6 weeks, phased: trial conversion first, then onboarding, then the churn engine
On this page
The problemWhat gets builtHow it runsAutomations in detailWhat changesBefore you start
Want this built for you?

Bring your stack to a call and we will scope it against how your business actually runs.

Book a call
01

The problem

A membership business has two numbers that decide whether it survives: how many trials become paying members, and how long those members stay. Almost every studio, gym, clinic and wellness business measures the first badly and the second not at all until it is too late. The trial is sold on the floor by whoever happens to be at the desk, so conversion depends on who was working that day. The onboarding is a tour and a handshake. And retention is a conversation that only happens when a member emails to cancel, which is to say, after the decision has already been made.

The money leaks in a specific sequence. First, in the trial window: a seven-day trial where nobody notices that the member came once on day one and never came back is a trial that was lost on day three, not on day seven. Second, in the first thirty days: members who do not establish a habit in their first month churn at a rate that dwarfs every other cohort, and that window closes quietly. Third, in the silent lapse: a member stops attending in week six, keeps paying for three months out of inertia or guilt, then cancels. The business recorded three months of revenue and read it as retention. It was actually a churn it failed to see. Fourth, in failed payments: a declined card that nobody chases is an involuntary cancellation, and in most membership books involuntary churn is a meaningful share of total churn and the easiest kind to prevent. Fifth, in the win-back that never happens. A canceled member is the warmest list the business owns and it usually sits untouched.

None of this is a motivation problem or a staffing problem. It is an instrumentation problem. Attendance data exists, payment data exists, and nobody has joined them to a trigger. This build joins them. It converts trials on a scripted cadence, onboards every new member through a fixed first-thirty-days sequence, scores engagement from actual attendance, intervenes while the member is still a member, saves the cards that fail, and runs a win-back on the people who leave.

02

What gets built

Pipelines

Pipeline A: Trials

  1. Trial Inquiry: form or walk-in captured, trial not yet started
  2. Trial Booked: first session on the calendar
  3. Trial Active: Day 1 to 3
  4. Trial Active: Day 4 to 7
  5. Trial At Risk: no attendance in 48 hours or only one visit by day 4
  6. Conversion Conversation: offer presented, decision pending
  7. Converted: membership started; exits to Pipeline B
  8. Trial Lapsed: trial ended without a decision
  9. Declined: requires decline_reason

Pipeline B: Member Lifecycle

  1. Week 1: Orientation
  2. Week 2 to 4: Habit Forming
  3. Established: past day 30, engagement score healthy
  4. Watch: engagement score slipping
  5. At Risk: engagement score low or attendance gap breached
  6. Save Attempt: human intervention in progress
  7. Cancellation Requested
  8. Paused: freeze accepted instead of cancellation
  9. Canceled: requires churn_reason
  10. Win-Back Nurture
  11. Reactivated

Pipeline C: Billing Recovery

  1. Payment Failed: Attempt 1
  2. Payment Failed: Attempt 2
  3. Card Update Requested
  4. Recovered
  5. Involuntary Cancellation

Custom fields

Trial

  • trial_start_date, trial_end_date: dates
  • trial_type: dropdown: Single class / 7-day / 14-day / Intro pack
  • trial_sessions_attended: number, incremented on each check-in
  • trial_goal: long text, captured at booking ("what would make this worth it for you?")
  • trial_constraint: long text ("what has stopped this working before?")
  • trial_coach_assigned: user reference
  • decline_reason: dropdown: Price / Schedule / Location / Not ready / Chose competitor / Injury or health / No response

Membership

  • member_since: date
  • membership_tier: dropdown, matching your plan names
  • billing_cycle: dropdown: Monthly / Quarterly / Annual / Paid in full
  • next_billing_date: date
  • contract_end_date: date, where terms apply
  • onboarding_stage: dropdown: Not started / Orientation booked / Orientation done / Goal set / Week 4 review done
  • goal_primary and goal_target_date

Engagement

  • last_checkin_date: date, written on every check-in
  • days_since_last_visit: number, recalculated nightly
  • visits_last_7, visits_last_14, visits_last_30: numbers, recalculated nightly
  • baseline_weekly_visits: number, the member's own average across their established period
  • engagement_score: number 0 to 100, recalculated nightly
  • engagement_band: dropdown: Healthy / Watch / At Risk / Dormant
  • risk_flag_reason: dropdown: Attendance gap / Pace drop / Never established / Payment failure / Stated intent
  • last_intervention_date and last_intervention_type: prevents stacking interventions
  • save_offer_made: dropdown: None / Freeze / Tier change / Coaching session / Buddy pass
  • churn_reason: dropdown: Price / Moved / Schedule / Injury or health / Results / Service / Switched provider / Life change / Involuntary / Unknown
  • reactivation_date

Calendars

  • Trial Session: the first booked visit, assigned to a named coach, with a 10-minute pre-session buffer so the coach can read trial_goal and trial_constraint.
  • Onboarding Orientation: 30 min: booked inside the first 72 hours of membership. Goal setting, plan walk-through, app and booking setup.
  • Week 4 Review: 20 min: auto-offered on day 24. This is the single most load-bearing appointment in the retention engine.
  • Save Conversation: 20 min: only surfaced to members in At Risk or Cancellation Requested. Never advertised publicly.
  • Quarterly Check-In: 20 min: offered to Established members every 90 days.

Forms and surveys

  • Trial Booking: contact details, trial_goal, trial_constraint, any injury or health note the coach must know, consent checkbox.
  • Goal Setting: completed in the orientation, writes goal_primary and goal_target_date.
  • Week 4 Review: four questions: progress against goal, what is working, what is in the way, one thing we could change.
  • Cancellation Form: mandatory before cancellation completes. Captures churn_reason in the member's own words plus the picklist, and presents the freeze and tier-change options once, without a dark pattern.
  • Win-Back Survey: sent 30 days after cancellation, two questions, used to improve the product rather than to sell.

Memberships and content

  • A member area holding the onboarding path as a short course: five lessons, released on a schedule rather than all at once, each under four minutes.
  • Lesson release schedule: day 0 how to book and cancel, day 2 your first week, day 5 the three things that make this stick, day 10 nutrition or recovery basics as applicable, day 21 how to read your own progress.
  • Content completion is tracked and feeds engagement_score as a minor component, so a member who is quiet but consuming content is not flagged as hard as one who is quiet and absent.

Tags

trial-active, trial-at-risk, trial-converted, trial-lapsed, member-active, onboarding-complete, wk4-review-done, risk-watch, risk-high, save-attempted, save-succeeded, frozen, canceled, winback-nurture, reactivated, payment-failed, do-not-sms.

BO, the AI assistant

  • Role: handle booking and cancellation of classes, answer schedule and facility questions, chase trial bookings, collect the Week 4 review by conversation when the form goes unanswered, and run the first touch of a low-grade attendance nudge.
  • Guardrails: never quote membership prices or discounts. It says "the plans depend on how often you want to train, so let me get you in front of a coach for two minutes"; never give medical, injury, nutrition or rehabilitation advice; never process a cancellation; never make a save offer. A member who says they want to cancel, mentions an injury or a health condition, mentions pain, or expresses frustration with a coach or the facility is handed to a human immediately.
  • Handoff: moves the opportunity to Save Attempt or Cancellation Requested, posts to the studio channel with the exact member words, and stops its own sequence.
  • Tone instruction: short messages, no exclamation marks, no motivational cliche, always one concrete next action.

Permissions

  • Front-desk staff: read and write contacts, check-ins, class bookings. No access to churn_reason reporting or billing recovery.
  • Coaches: see their own assigned trials and members, read trial_goal, goal_primary, engagement_band and health notes. No billing access.
  • Manager: full pipelines, save offers, freeze approvals, billing recovery.
  • Health and injury notes restricted to coaches and the manager, and excluded from any outbound message template.
03

How it runs, step by step

  1. Day 0, Saturday 10.12am. A prospect submits the Trial Booking form from an ad. trial_goal: "get back to training three times a week without wrecking my knees." trial_constraint: "I join in January and quit by March, every year." Opportunity created in Trial Inquiry, tagged trial-active and the source tag.
  2. 10.12am. Trial Session calendar link sent by email and SMS. She books Monday 6.30pm. Stage moves to Trial Booked, trial_start_date set to Monday, trial_end_date to the following Monday, trial_coach_assigned set by round-robin.
  3. Monday 6.20pm. The coach gets a pre-session notification with both free-text fields. He opens the session by asking about the January-to-March pattern, which is the only thing she actually cares about.
  4. Monday 7.35pm. She checks out. trial_sessions_attended = 1, last_checkin_date set. Stage moves to Trial Active: Day 1 to 3. A post-session SMS goes at 8.10pm with one line referencing her goal and the booking link for her second session.
  5. Tuesday 8.00am. She has not booked a second session. Nudge email naming two specific class times rather than a generic link.
  6. Wednesday 6.45pm. Second visit. trial_sessions_attended = 2. Stage moves to Trial Active: Day 4 to 7.
  7. Friday 9.00am. Two days without a visit triggers Trial At Risk briefly; she books Saturday within the hour and the flag clears without a human touching it.
  8. Saturday 9.30am. Third visit. The conversion workflow fires because trial_sessions_attended has reached 3. The threshold where conversion probability is highest. The coach gets a task: "Conversion conversation today, before she leaves." Stage moves to Conversion Conversation.
  9. Saturday 10.15am. She joins on a monthly plan. member_since, membership_tier, billing_cycle, next_billing_date written. Stage moves to Converted; the Trials opportunity closes and a Member Lifecycle opportunity opens in Week 1: Orientation. Tags trial-converted and member-active.
  10. Saturday 10.16am. Welcome email with the member area login, lesson one released, and the Onboarding Orientation calendar link. SMS confirms the membership in one line.
  11. Monday. Orientation booked for Wednesday. onboarding_stage = Orientation booked.
  12. Wednesday 5.00pm. Orientation runs. The Goal Setting form is completed on a tablet in the room: goal_primary = "three sessions a week through March", goal_target_date = end of March. onboarding_stage = Goal set. Her baseline_weekly_visits target is set to 3.
  13. Days 2, 5, 10, 21. Lessons release on schedule. Each release is a short email, not a notification she has to go looking for.
  14. Day 14. Nightly recalculation gives her visits_last_14 = 5, engagement_score 81, engagement_band Healthy. Stage is Week 2 to 4: Habit Forming. No intervention.
  15. Day 24. Week 4 Review offered automatically. She books it for day 27.
  16. Day 27. Review happens. Progress is good, one complaint about the 6.30pm class being full. The manager adds her to a waitlist rule. onboarding_stage = Week 4 review done, tags onboarding-complete and wk4-review-done. Stage moves to Established.
  17. Day 68. She travels for work. visits_last_14 drops to 1, engagement_score falls to 44, engagement_band becomes Watch, risk_flag_reason = Pace drop. Stage moves to Watch. BO sends the light-touch nudge, she replies that she is away until the 14th, and the system sets a snooze until the 15th rather than escalating.
  18. Day 83. Back and training. Score recovers to 72, band returns to Healthy, stage returns to Established. The save machinery never fired, because the data said it did not need to.
  19. Day 112. Her card expires and the monthly charge fails. A Billing Recovery opportunity opens in Payment Failed: Attempt 1, tag payment-failed. Email and SMS go out within the hour with a card-update link. She updates it that evening. Stage Recovered, tag removed, membership untouched. She never spoke to a human and never stopped attending.

The branch that matters most. Had her score stayed low for nine consecutive days, stage would have moved to At Risk, a coach task would have been created with a scripted opening, and the Save Conversation calendar would have been offered: all before any cancellation email existed. If she had canceled anyway, the cancellation form would have forced a churn_reason, the freeze option would have been offered once, and she would have entered Win-Back Nurture with a 30-day survey and a 90-day return offer.

04

Automations in detail

Workflow 1: Trial Booking Push

Trigger: Trial Booking form submitted, or a contact tagged trial-active with no trial appointment.

  1. Create the opportunity in Trial Inquiry; set trial_type; apply trial-active and the source tag.
  2. Immediately: email with the Trial Session calendar: "You said you want to {{trial_goal}}. Here is when we can start: {{calendar_link}}. Bring trainers and a water bottle, nothing else."
  3. Wait 15 minutes. Condition: no appointment booked. SMS: "{{first_name}}, it's {{business_name}}. Grab your trial session here: {{calendar_link}}. Reply STOP to opt out."
  4. Wait 6 hours. Condition: no appointment booked. BO opens a chat and offers the next three specific class times by name and day.
  5. Wait 1 day. Condition: no appointment booked. Email: "Two of our quietest classes this week are {{slot_a}} and {{slot_b}}, easier for a first visit. Either one: {{calendar_link}}."
  6. Wait 2 days. Condition: no appointment booked. Front-desk call task, 24-hour due date.
  7. Wait 4 days. Condition: no appointment booked. Move to Trial Lapsed, apply trial-lapsed, send one stand-down email, enter the slow monthly nurture.

On booking: set trial_start_date and trial_end_date, assign trial_coach_assigned, move to Trial Booked, send confirmation plus a 24-hour and 2-hour reminder, and notify the coach 10 minutes before with trial_goal, trial_constraint and any health note.

Stop conditions: appointment booked; membership started; opt-out; decline_reason set.

Workflow 2: Trial Momentum Engine

Trigger: check-in recorded on a contact with trial-active.

  1. Increment trial_sessions_attended; write last_checkin_date.
  2. Wait 40 minutes (post-session, not during). SMS: "Good first session. Next one is where the habit starts: {{slot_a}} or {{slot_b}}: {{booking_link}}."
  3. Branch on trial_sessions_attended:
    • 1 visit: stage Trial Active: Day 1 to 3. Next-day email naming two specific times.
    • 2 visits: stage Trial Active: Day 4 to 7. Email referencing their goal and what the coach observed, if the coach left a note.
    • 3 or more visits: fire Workflow 3 immediately. Three visits is the conversion trigger, not the end of the trial window.
  4. Attendance gap check, runs every 12 hours: if days_since_last_visit is 2 or more and trial_end_date has not passed, move to Trial At Risk, apply trial-at-risk, and send: "Two days is where trials quietly end. {{slot_a}} tomorrow: shall I hold you a spot?" Then create a coach task if no booking within 12 hours.
  5. Clear condition: any new booking or check-in returns the stage to the correct Trial Active stage and removes trial-at-risk.

Stop conditions: membership started; decline_reason set; opt-out.

Workflow 3: Conversion Conversation

Trigger: trial_sessions_attended reaches 3, or trial_end_date is 2 days away: whichever comes first.

  1. Move to Conversion Conversation. Create a task for trial_coach_assigned: "Conversion conversation before they leave the building. Their goal: {{trial_goal}}. Their stated blocker: {{trial_constraint}}." Due: end of their next booked session.
  2. Immediately: email: "Three sessions in. Here is what we would do with the next twelve weeks given you want to {{goal_primary_or_trial_goal}}. {{coach_first_name}} will walk you through the options after your next class: takes five minutes." No prices in the email; the plan conversation happens with a human.
  3. Wait until the day after trial_end_date. Condition: no membership started and no decline_reason. Email: "Your trial finished yesterday. The honest question is whether this fits your week, not whether you enjoyed it. Fifteen minutes with {{coach_first_name}} to work that out: {{calendar_link}}."
  4. Wait 2 days. Condition: unchanged. SMS plus a manager call task.
  5. Wait 3 days. Condition: unchanged. Move to Trial Lapsed, apply trial-lapsed, and send one last message asking only for the reason: "No pitch. Just tell me what stopped it: price, schedule, or it was not for you? One word is enough and it genuinely helps." Route any reply to set decline_reason.
  6. On membership started: write member_since, membership_tier, billing_cycle, next_billing_date, contract_end_date; move to Converted; apply trial-converted and member-active; remove trial-active and trial-at-risk; open the Member Lifecycle opportunity in Week 1: Orientation; fire Workflow 4.

Stop conditions: membership started; decline_reason set; opt-out.

Workflow 4: First Thirty Days Onboarding

Trigger: Member Lifecycle opportunity created in Week 1: Orientation.

  1. Immediately: welcome email: member area login, lesson one, and the Onboarding Orientation calendar. SMS: "You're in. Book your 30-minute orientation here and we will build your first four weeks: {{calendar_link}}." Set onboarding_stage = Not started.
  2. Wait 24 hours. Condition: orientation not booked. SMS reminder.
  3. Wait 48 hours. Condition: orientation not booked. Front-desk task: book it by phone. Members who skip orientation are a distinct risk cohort: do not let this step fail silently.
  4. Day 2: release lesson two. Email subject references their goal field.
  5. Day 3. Condition: visits_last_7 = 0. SMS: "Haven't seen you since you joined. {{slot_a}} tonight has space: want it?" This is the highest-value message in the entire build; a member with zero visits in their first three days is the steepest churn curve you will ever see.
  6. On orientation completed: set onboarding_stage = Orientation done, then on Goal Setting form submission set Goal set, write goal_primary, goal_target_date and baseline_weekly_visits.
  7. Day 5: release lesson three.
  8. Day 7: email: "One week in. You have been {{visits_last_7}} times. Your target was {{baseline_weekly_visits}}." Branch: at or above target, congratulate and name next week's sessions; below target, offer a 10-minute call with the coach.
  9. Day 10: release lesson four.
  10. Day 14: two-week check email, same branch logic as day 7. If visits_last_14 is 2 or fewer, escalate to a coach task immediately rather than another email.
  11. Day 21: release lesson five. Move stage to Week 2 to 4: Habit Forming if not already there.
  12. Day 24: offer the Week 4 Review calendar: "Twenty minutes to look at what has actually happened versus what you said you wanted. It is the conversation that decides whether month two looks like month one." Nudge at day 26 and day 28 if unbooked; create a manager task at day 30 if still unbooked.
  13. On Week 4 Review completed: set onboarding_stage = Week 4 review done, apply onboarding-complete and wk4-review-done, move stage to Established, and hand the member to Workflow 6.
  14. Day 35. Condition: no Week 4 review and no onboarding-complete tag. Move to Watch with risk_flag_reason = Never established, regardless of attendance. An unonboarded member is a risk even when they are showing up.

Stop conditions: cancellation requested; stage reaches Canceled or Paused; opt-out (email lesson releases continue as transactional member content only if your policy genuinely treats them that way: otherwise stop them too).

Workflow 5: Nightly Engagement Scoring

Trigger: schedule, every night at 2am, across all contacts tagged member-active.

  1. Recalculate days_since_last_visit, visits_last_7, visits_last_14, visits_last_30.
  2. Compute engagement_score out of 100. Suggested components: recency. 0–2 days since last visit 40 points, 3–5 days 30, 6–9 days 18, 10–14 days 8, over 14 days 0. Pace: visits_last_14 as a proportion of twice baseline_weekly_visits, scaled to 35 points. Consistency. Visits in each of the last two weeks, 15 points, one week only 7, neither 0. Content and engagement. Lesson completion or a reply to any message in the last 30 days, 10 points.
  3. Write engagement_band: 70 and above Healthy; 45 to 69 Watch; 20 to 44 At Risk; under 20 Dormant.
  4. Write risk_flag_reason using the dominant deficit: no visit in 10 or more days → Attendance gap; pace under half of baseline with recent visits → Pace drop; no onboarding-complete past day 35 → Never established; open Billing Recovery opportunity → Payment failure.
  5. Move the stage to match the band, except: never move a member out of Save Attempt, Cancellation Requested, Paused or Canceled automatically, and never move a member who is inside an active snooze.
  6. Suppression rules: skip any member whose last_intervention_date is within 5 days; skip members in a Paused state; skip members with an active travel or injury snooze; skip the first 14 days of membership, which Workflow 4 owns.
  7. Write the day's band movements to a report object for Workflow 9.

Workflow 6: Risk Intervention Ladder

Trigger: engagement_band changes, or stage enters Watch or At Risk.

  1. Band becomes Watch (first rung. Light, automated, no human):
    1. Immediately: SMS from BO: "{{first_name}}, noticed it's been {{days_since_last_visit}} days. No lecture. {{slot_a}} or {{slot_b}} this week?"
    2. Wait 2 days. Condition: no visit, no reply. Email: "Weeks get away from people. If your schedule has changed, we can move you to a plan that matches it, or freeze for a month. Reply with 'schedule' and I will sort it."
    3. Wait 3 days. Condition: no visit, no reply. Set last_intervention_type = Watch ladder complete and let Workflow 5 re-band the member.
    4. On any reply naming travel, illness or a fixed-term reason: set a snooze to the stated return date, write it to risk_flag_reason notes, exit the ladder without escalating. This single branch prevents most of the false positives that make retention automation feel robotic.
  2. Band becomes At Risk (second rung. Human):
    1. Move to At Risk. Create a task for the member's coach, due in 24 hours: "Call, do not text. Their goal was {{goal_primary}}. They have been {{visits_last_30}} times in 30 days against a target of {{baseline_weekly_visits}} a week. Ask what changed. Do not pitch."
    2. Wait 24 hours. Condition: task not completed. Escalate to the manager channel with the member's name and score.
    3. On call completed: the coach records an outcome: Re-engaged / Needs plan change / Needs freeze / Injury or health / Intends to cancel / No contact. Each outcome routes: plan change and freeze go to the manager with save_offer_made set; injury or health routes to the coach lead and suspends all attendance nudges; intends to cancel moves to Save Attempt; no contact runs rung three.
    4. Offer the Save Conversation calendar in the follow-up message, once only.
  3. Band becomes Dormant (third rung. Honest):
    1. Immediately: email from the manager, plain text, no design: "You have been paying for {{membership_tier}} and have not been in for {{days_since_last_visit}} days. I would rather you either came back or stopped paying us than quietly resented the charge. Three options: pick up where you left off with a session on me, freeze for 60 days, or cancel and I will make it painless. Which one?"
    2. Wait 3 days. Condition: no reply. One SMS, then stop.
    3. Wait 7 days. Condition: no reply. Move to At Risk permanently flagged, create a manager task for a final call, and do not send further automated attendance messages. Continuing to message a dormant payer is how a refund request becomes a chargeback and a review.

Stop conditions for the whole ladder: any check-in (returns member to the correct stage and clears flags); any reply (pauses automation and notifies the owner); active snooze; stage moves to Paused, Cancellation Requested or Canceled; last_intervention_date within 5 days; opt-out.

Workflow 7: Cancellation and Save

Trigger: Cancellation Form submitted, or a member tells BO or a human they want to cancel.

  1. Move to Cancellation Requested. Notify the manager channel immediately with churn_reason, engagement_score, membership_tier and tenure.
  2. Immediately: acknowledgement email, no friction: "Got it. Your cancellation is logged and I will confirm the effective date today. Before I do. One question, and 'no' is a complete answer: would a 60-day freeze work better than canceling outright? Your rate stays locked either way until {{freeze_expiry}}."
  3. Branch on churn_reason:
    • Price → manager task to offer a lower tier or lower frequency, once. Set save_offer_made = Tier change.
    • Schedule → offer the class times they have never been shown, plus off-peak plan. save_offer_made = Tier change.
    • Injury or health → offer a freeze, not a discount. Route to the coach lead. Never send an attendance nudge again until the freeze lifts. save_offer_made = Freeze.
    • Moved → no save attempt. Cancel cleanly, ask for a review, and offer a referral to a provider near them if you know one.
    • Results → manager task for a programming review with a coach. save_offer_made = Coaching session.
    • Service → manager calls personally within 24 hours. No offer until they have heard the complaint. This is the branch that protects the brand, not the revenue.
    • Life change or Unknown → freeze offer only.
  4. Wait 24 hours. Confirm the effective date in writing regardless of whether a save was attempted. Never let a cancellation go unconfirmed while a save is being pursued. That is the behavior that generates complaints.
  5. On save accepted: move to Paused or back to Established as applicable, apply save-succeeded, log save_offer_made, and schedule a check-in at 14 days and at the end of any freeze.
  6. On save declined or no response: move to Canceled, apply canceled, remove member-active, stop every member sequence, confirm the final billing date, and hand to Workflow 8.

Stop conditions: cancellation confirmed; opt-out; member asks not to be contacted about it again (honor immediately, log it, and never re-offer).

Workflow 8: Win-Back

Trigger: stage enters Canceled.

  1. Wait 3 days: exit email, no offer: "Your membership ended on {{end_date}}. Door is open, no pressure. If you want your program notes to take elsewhere, reply and I will send them." Move to Win-Back Nurture, apply winback-nurture.
  2. Wait 30 days: Win-Back Survey, two questions, framed as product improvement rather than a pitch. Route answers to refine churn_reason.
  3. Wait 60 days (day 90 total). Return offer, once: "Ninety days since you stopped. If the reason was {{churn_reason}}, here is what has changed since: {{one_concrete_change}}. Come back for a week on us and decide properly: {{calendar_link}}." Suppress entirely if churn_reason is Moved or Service unresolved.
  4. Wait 90 days (day 180). One re-engagement message tied to a seasonal reset if you run one.
  5. Then: move to the general monthly newsletter audience only. No more win-back sequence. A list you keep pitching is a list that unsubscribes.
  6. On any booking or reply: move to Reactivated if membership restarts, set reactivation_date, apply reactivated, and run them through Workflow 4 from the start. Returning members get onboarded again; assuming they remember how it works is why second churns are faster than first ones.

Stop conditions: reactivated; opt-out; churn_reason = Moved; unresolved service complaint.

Workflow 9: Billing Recovery

Trigger: payment failure webhook from the payment processor.

  1. Open a Billing Recovery opportunity in Payment Failed: Attempt 1; apply payment-failed; set risk_flag_reason = Payment failure on the member record. Do not suspend access yet.
  2. Within 1 hour: email: "Your {{membership_tier}} payment did not go through: almost always an expired card. Update it here and nothing else changes: {{card_update_link}}." SMS the same, short, with the link.
  3. Wait 2 days. Condition: unresolved. Move to Payment Failed: Attempt 2; retry the charge; send a second message.
  4. Wait 3 days. Condition: unresolved. Move to Card Update Requested; front-desk task to catch them at check-in, which recovers more cards than any message does.
  5. Wait 4 days. Condition: unresolved. Manager call task. Final notice email naming the access-suspension date.
  6. Wait 3 days. Condition: unresolved. Move to Involuntary Cancellation, set churn_reason = Involuntary, and hand to Workflow 8, but tag the win-back as involuntary so the day-90 message leads with the card, not with a pitch.
  7. On payment recovered at any point: move to Recovered, remove payment-failed, clear the risk reason, and send a one-line confirmation. Never mention it again.

Stop conditions: payment recovered; member cancels deliberately; opt-out (email continues: billing notices are transactional).

Workflow 10: Renewal and Expiry Watch

Trigger: schedule, daily, reading contract_end_date and next_billing_date.

  1. 45 days before contract_end_date: internal report to the manager listing every member coming up for renewal with their current engagement_band. Healthy members get a renewal email; Watch and At Risk members get a coach conversation first. Never auto-renew a disengaged member without a conversation; that is the charge that becomes a dispute.
  2. 30 days before: renewal email for healthy members, framed on progress against goal_primary.
  3. 14 days before: reminder, plus manager task for anyone unresolved.
  4. 7 days before: final notice with the exact renewal date and amount reference, and a clear route to change or cancel.
  5. On renewal: reset contract_end_date, send confirmation, and offer a Quarterly Check-In.

Workflow 11: Weekly Retention Report

Trigger: schedule, Monday 7am.

  1. Trial funnel: inquiries, trial bookings, started, 3-visit rate, conversions, conversion rate, decline_reason counts.
  2. Onboarding: orientation booking rate within 72 hours, Week 4 review completion rate, share of members past day 35 without onboarding-complete.
  3. Engagement: band distribution and week-on-week movement; count of members who moved Healthy to Watch and Watch to At Risk; intervention completion rate by coach.
  4. Churn: cancellations by churn_reason, voluntary versus involuntary split, save attempt rate and save success rate by save_offer_made, net membership change.
  5. Billing: failures opened, recovered, recovery rate, days to recovery.
  6. Flag every member in At Risk for more than 7 days with no completed intervention, every coach task overdue by 48 hours, and every cancellation without a churn_reason.
05

What changes

What is different

  • Trials convert on a cadence rather than on whoever is at the desk. The three-visit trigger replaces the end-of-trial scramble, which means the conversion conversation happens at the point of peak enthusiasm instead of after it has faded.
  • Every new member goes through the same first thirty days. Orientation booked inside 72 hours, a goal written down, five short lessons, and a Week 4 review that happens because the system offers it, not because someone remembered.
  • Attendance becomes an input, not a report. A member who stops coming is flagged in days, intervened with while they are still paying and still reachable, and, critically, not flagged at all when they told you they were traveling.
  • Interventions escalate from automated to human to honest. The dormant-payer email is uncomfortable to write and it is the one that protects you from chargebacks and bad reviews.
  • Cancellations capture a reason, every time, and the freeze option is offered once rather than buried. Saves get logged by offer type so you learn which ones actually work.
  • Failed payments stop being silent churn. Most are expired cards, and most are recoverable within 48 hours if anybody asks.
  • Canceled members enter a finite win-back with a hard end, instead of being pitched forever or forgotten entirely.

Metrics to watch

  • Trial-to-member conversion rate, and separately the three-visit rate: the share of trials who attend three times. The second predicts the first, and it is the one you can actually move.
  • Orientation-within-72-hours rate and Week 4 review completion rate. Track 90-day retention split by whether each happened. These two cohorts will diverge, and the gap tells you what onboarding is worth.
  • Engagement band distribution week on week, and the migration matrix: how many moved Healthy to Watch, Watch to At Risk, At Risk back to Healthy. A healthy book shows real traffic back up the ladder, not just down it.
  • Intervention completion rate by coach, and recovery rate after intervention: the share of At Risk members back in Healthy within 21 days. If that number is low, the problem is the script or the timing, not the member.
  • Voluntary versus involuntary churn split. If involuntary is above a few percent of total churn, Workflow 9 is the highest-return thing to fix.
  • Save attempt rate and save success rate, broken down by save_offer_made. Freeze and tier change usually perform very differently; you need to know which.
  • churn_reason distribution monthly. Price-led churn is a packaging problem, schedule-led churn is a timetable problem, results-led churn is a programming problem. They have nothing in common and conflating them is how businesses discount their way into worse margins.
  • Median tenure by joining cohort, and day-30, day-90 and day-180 retention. Cohort the figures by join month so a good month does not hide a bad one.
  • False-positive rate on risk flags: the share of Watch and At Risk flags that resolve with a travel or injury snooze. If this climbs, loosen the pace thresholds in Workflow 5 before members start finding the messages annoying.
06

Before you start

Prerequisites

  • Check-in data has to reach the platform. This is the hard dependency and the one that kills builds. Whatever records attendance (door system, class booking app, front-desk scan, coach marking a roster) must write a check-in event against the contact record, same day, reliably. Without it, Workflow 5 scores everyone the same and the entire retention half of the build is decoration. Confirm the integration before anything else is configured.
  • Plan and tier names agreed and frozen before membership_tier is built, including off-peak and lower-frequency options, because Workflow 7's save branches depend on there being something to move a member to.
  • A written freeze policy: duration, how often, whether the rate stays locked, who approves. Workflow 7 offers a freeze in writing, so the policy must be real.
  • Coach capacity for intervention calls. The ladder creates calls. If nobody will make them, build the automated rungs only and say so, rather than generating tasks that rot.
  • Agreed churn_reason and decline_reason picklists, short, and nobody adds "other".
  • Baseline figures captured before launch: current trial conversion, current 90-day retention, current involuntary churn share. Without a before, you cannot show an after, and six weeks from now nobody will remember what it was.

Integrations

  • Attendance or access control → check-in events. Two-way if possible so a class booking made in the platform appears on the roster.
  • Payment processor and subscription billing: webhooks for payment succeeded, payment failed, subscription canceled, card updated, subscription renewed. Test every one in live mode with a real card before launch, including a deliberate decline.
  • Calendar sync for every coach, two-way, so orientation and save conversations cannot double-book.
  • Member area and content hosting for the five onboarding lessons, with completion tracking exposed to the scoring workflow.
  • Email authentication: SPF, DKIM and DMARC on the sending domain. A membership business sends a lot of lifecycle email; poor authentication puts the day-3 message in spam, and the day-3 message is the one that matters.
  • Review platform connected, so the post-save and post-onboarding review requests go to the profile you actually care about.

Number provisioning

  • Provision one dedicated local number per physical location. Members recognize the number and reply to it; a shared or shortcode sender kills reply rates, and replies are how the snooze branch works.
  • Enable inbound and route replies to a monitored inbox during staffed hours. Workflow 6's travel and injury branch depends entirely on somebody reading replies.
  • Configure keyword handling on the number before the first send: STOP family, HELP, and ideally BOOK and PAUSE as member conveniences.

Consent and compliance

  • A2P 10DLC registration completed and approved before any SMS step is enabled. Register the brand under the legal entity with its EIN, then the campaign. The use case here is mixed: appointment reminders, account notifications and customer care. Supply the trial booking page URL, a screenshot of the consent checkbox with its wording, and sample messages for each category you will send, including the attendance nudge, which reviewers scrutinize most. Allow one to three weeks. Build and test every SMS step with it disabled, then enable on approval. Unregistered traffic gets filtered, and a retention engine whose messages silently fail is worse than no engine.
  • Express written consent at trial booking and at membership signup: unticked checkbox, its own line, naming the business, stating that messages cover class reminders, account and billing notices and check-ins about your membership, that message and data rates may apply, and how to stop. Store timestamp, IP and the exact wording shown. Capture it again on paper or tablet for walk-in trials. A verbal "sure, text me" is not a record you can produce later.
  • Opt-out handling: STOP, UNSUBSCRIBE, CANCEL, END, QUIT suppress all SMS immediately and apply do-not-SMS, which every workflow in this build checks as a stop condition. Note the collision: a member replying "CANCEL" may mean their membership, not their messages. Suppress the SMS, and route the message to a human the same hour, because treating a cancellation intent as an opt-out is how you lose a save and a member in one move.
  • Quiet hours: no SMS before 8am or after 9pm in the member's time zone, enforced centrally, tighter if your jurisdiction requires. Queue rather than drop. Exception worth considering: early-morning class reminders for members whose own booked class is at 6am, only with that consent captured explicitly.
  • Frequency caps: maximum one lifecycle SMS per member per 48 hours and three per week across all workflows, class reminders excluded. The intervention ladder plus the content schedule plus billing notices can collide badly; cap centrally rather than hoping the stop conditions catch it.
  • Health information: injury notes, health conditions and anything a member discloses to a coach sit in restricted fields, are never merged into an outbound template, and are excluded from exports. Any risk flag with risk_flag_reason = injury or health suppresses every automated attendance message until a human clears it. If your jurisdiction or your plan brings this data under a health privacy regime, confirm the platform's handling and your staff training before you store a single note.
  • Billing and cancellation law: auto-renewal disclosure, cancellation route and notice periods vary by jurisdiction and several require a cancellation path as easy as the signup path. Workflow 7 confirms every cancellation in writing within 24 hours regardless of save attempts, and no save offer may delay the confirmation. Have the cancellation form and the renewal notices reviewed against your local rules before launch.
  • Record retention: keep consent records, message logs and cancellation confirmations for the period your regulator, insurer or payment processor requires, and check the platform's retention settings match.

Phasing and launch checks

  • Phase 1: trial pipeline and Workflows 1 to 3. Measurable within two weeks.
  • Phase 2: onboarding, member area and Workflow 4, plus Workflow 9 billing recovery, which pays for itself fastest.
  • Phase 3: scoring, the intervention ladder and the cancellation and win-back workflows. Run Workflow 5 in silent mode for two full weeks first: score everyone, send nothing, and review the bands against what staff already believe about those members. Tune the thresholds against that, then switch on Workflow 6.
  • Test the full cancellation path as a real member, including the freeze offer and the written confirmation timing.
  • Force a payment decline with a test card and watch Workflow 9 run end to end.
  • Verify that an injury note never appears in any sent message, by sending yourself one of every template with a test record that has one.

Scope, phasing and what your attendance system can actually feed us are worked out on a call. Book one and bring your current retention numbers.

Build it with us.

Every build on this page is something we configure, test and hand over with the SOPs your team needs to run it.

Book a call