Convert trials into members, onboard them on rails, and catch churn risk from attendance data before the cancellation arrives.
Bring your stack to a call and we will scope it against how your business actually runs.
Book a callA 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.
Pipeline A: Trials
decline_reasonPipeline B: Member Lifecycle
churn_reasonPipeline C: Billing Recovery
Trial
trial_start_date, trial_end_date: datestrial_type: dropdown: Single class / 7-day / 14-day / Intro packtrial_sessions_attended: number, incremented on each check-intrial_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 referencedecline_reason: dropdown: Price / Schedule / Location / Not ready / Chose competitor / Injury or health / No responseMembership
member_since: datemembership_tier: dropdown, matching your plan namesbilling_cycle: dropdown: Monthly / Quarterly / Annual / Paid in fullnext_billing_date: datecontract_end_date: date, where terms applyonboarding_stage: dropdown: Not started / Orientation booked / Orientation done / Goal set / Week 4 review donegoal_primary and goal_target_dateEngagement
last_checkin_date: date, written on every check-indays_since_last_visit: number, recalculated nightlyvisits_last_7, visits_last_14, visits_last_30: numbers, recalculated nightlybaseline_weekly_visits: number, the member's own average across their established periodengagement_score: number 0 to 100, recalculated nightlyengagement_band: dropdown: Healthy / Watch / At Risk / Dormantrisk_flag_reason: dropdown: Attendance gap / Pace drop / Never established / Payment failure / Stated intentlast_intervention_date and last_intervention_type: prevents stacking interventionssave_offer_made: dropdown: None / Freeze / Tier change / Coaching session / Buddy passchurn_reason: dropdown: Price / Moved / Schedule / Injury or health / Results / Service / Switched provider / Life change / Involuntary / Unknownreactivation_datetrial_goal and trial_constraint.trial_goal, trial_constraint, any injury or health note the coach must know, consent checkbox.goal_primary and goal_target_date.churn_reason in the member's own words plus the picklist, and presents the freeze and tier-change options once, without a dark pattern.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.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.
churn_reason reporting or billing recovery.trial_goal, goal_primary, engagement_band and health notes. No billing access.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.trial_start_date set to Monday, trial_end_date to the following Monday, trial_coach_assigned set by round-robin.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.trial_sessions_attended = 2. Stage moves to Trial Active: Day 4 to 7.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.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.onboarding_stage = Orientation booked.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.visits_last_14 = 5, engagement_score 81, engagement_band Healthy. Stage is Week 2 to 4: Habit Forming. No intervention.onboarding_stage = Week 4 review done, tags onboarding-complete and wk4-review-done. Stage moves to Established.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.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.
Trigger: Trial Booking form submitted, or a contact tagged trial-active with no trial appointment.
trial_type; apply trial-active and the source tag.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.
Trigger: check-in recorded on a contact with trial-active.
trial_sessions_attended; write last_checkin_date.trial_sessions_attended: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.trial-at-risk.Stop conditions: membership started; decline_reason set; opt-out.
Trigger: trial_sessions_attended reaches 3, or trial_end_date is 2 days away: whichever comes first.
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.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}}."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.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.
Trigger: Member Lifecycle opportunity created in Week 1: Orientation.
onboarding_stage = Not started.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.onboarding_stage = Orientation done, then on Goal Setting form submission set Goal set, write goal_primary, goal_target_date and baseline_weekly_visits.visits_last_14 is 2 or fewer, escalate to a coach task immediately rather than another email.onboarding_stage = Week 4 review done, apply onboarding-complete and wk4-review-done, move stage to Established, and hand the member to Workflow 6.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).
Trigger: schedule, every night at 2am, across all contacts tagged member-active.
days_since_last_visit, visits_last_7, visits_last_14, visits_last_30.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.engagement_band: 70 and above Healthy; 45 to 69 Watch; 20 to 44 At Risk; under 20 Dormant.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.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.Trigger: engagement_band changes, or stage enters Watch or At Risk.
last_intervention_type = Watch ladder complete and let Workflow 5 re-band the member.risk_flag_reason notes, exit the ladder without escalating. This single branch prevents most of the false positives that make retention automation feel robotic.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.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.
Trigger: Cancellation Form submitted, or a member tells BO or a human they want to cancel.
churn_reason, engagement_score, membership_tier and tenure.churn_reason:save_offer_made = Tier change.save_offer_made = Tier change.save_offer_made = Freeze.save_offer_made = Coaching session.save-succeeded, log save_offer_made, and schedule a check-in at 14 days and at the end of any freeze.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).
Trigger: stage enters Canceled.
winback-nurture.churn_reason.churn_reason is Moved or Service unresolved.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.
Trigger: payment failure webhook from the payment processor.
payment-failed; set risk_flag_reason = Payment failure on the member record. Do not suspend access yet.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.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).
Trigger: schedule, daily, reading contract_end_date and next_billing_date.
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.goal_primary.contract_end_date, send confirmation, and offer a Quarterly Check-In.Trigger: schedule, Monday 7am.
decline_reason counts.onboarding-complete.churn_reason, voluntary versus involuntary split, save attempt rate and save success rate by save_offer_made, net membership change.churn_reason.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.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.churn_reason and decline_reason picklists, short, and nobody adds "other".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.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.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.
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