1. Inquiry Capture and Speed to Lead
Trigger: Training Inquiry form submitted, inbound SMS to the studio number, web chat started, or a new Instagram or Facebook message from an unknown contact.
Branches: if the contact already carries pt-active, exit immediately and route the message to the assigned trainer instead; this workflow is for new inquiries only.
- Action 1, immediate: create or update the contact, apply pt-lead, write the source, open an opportunity in PT Packages at New Inquiry.
- Action 2, immediate: BO replies in the originating channel. "Hi {{first_name}}, thanks for reaching out to {{business_name}}. Quick one so I point you the right way. What are you training for at the moment, and which days usually work for you?"
- Action 3, wait 5 minutes: if no reply, send SMS. "It's BO at {{business_name}}. Easiest next step is a free 45-minute assessment. We look at where you're at and map out a plan, no obligation. Here are the next openings: {{assessment_link}}"
- Action 4, wait 1 hour: if still no reply and the inquiry arrived during staffed hours, create a task for the duty trainer: "Call {{first_name}}, inquired {{time}} via {{source}}, no response to two messages."
- Action 5, wait 1 day: email with a short note on how the studio works and the assessment link.
- Action 6, wait 3 days: final SMS. "Last one from me, {{first_name}}, if now isn't the right time I'll leave you be. The assessment link stays open whenever you're ready: {{assessment_link}}"
Exit: assessment booked, any inbound reply (hands to BO conversation flow), pt-lead removed, opportunity moved to Lost, or STOP received.
2. Assessment Confirmation, Reminders and No-Show Recovery
Trigger: appointment booked on the Free Assessment calendar.
- Action 1, immediate: move opportunity to Assessment Booked, apply pt-assessment-booked, write Assigned Trainer from the round-robin result.
- Action 2, wait 2 minutes: SMS and email the Readiness and Intake form. "You're booked in with {{assigned_trainer}} on {{appointment_time}}. Two minutes on this before you come in and we can use the whole session on you: {{intake_link}}"
- Action 3, 24 hours before the appointment: SMS. "Tomorrow at {{appointment_time}} with {{assigned_trainer}}. We're at {{address}}, parking is {{parking_note}}. Need to move it? {{reschedule_link}}"
- Action 4, 2 hours before: SMS. "See you at {{appointment_time}}, {{first_name}}. Reply Y to confirm."
- Action 5, 30 minutes before, branch on intake: if Readiness Form Complete is not yes, notify the assigned trainer internally so they take the questions verbally rather than assuming they have them.
- Action 6, 15 minutes after the slot ends, branch on outcome: if marked attended, exit to workflow 3. If marked no-show, apply pt-no-show, increment No Show Count, and send: "Sorry we missed you today, {{first_name}}. Things come up: want to grab another slot? {{assessment_link}}" Then wait 2 days and send one more. If still nothing, move the opportunity to Lost with reason no-show, no re-book.
Exit: attended, re-booked, moved to Lost, or STOP received.
3. Proposal Delivery and Payment Follow-Up
Trigger: assessment appointment marked attended, or opportunity moved manually to Assessment Completed.
- Action 1, immediate: apply pt-assessment-attended.
- Action 2, wait 30 minutes: long enough for the trainer to finish and note the goal, short enough to catch the decision warm. Send the Package Selection page by SMS and email. "Great session, {{first_name}}. Based on what you said about {{primary_goal}}, here are the options we talked through, including what's covered and how long each block runs: {{package_link}}. Any questions, just reply here."
- Action 3, wait 1 day: if the page was opened but not submitted, SMS. "Saw you had a look, {{first_name}}, anything you want me to talk through before you pick? Happy to jump on a quick call."
- Action 4, wait 2 days: if not opened at all, email with subject "Your plan for {{primary_goal}}" and the same link.
- Action 5, wait 3 days: task for the assigned trainer to make one personal call. No automated message on this step: at this point a human lands better than a sequence.
- Action 6, wait 7 days: SMS. "No pressure either way, {{first_name}}. If the timing's off, tell me roughly when and I'll check back then instead of pestering you." Branch: if the reply contains a timeframe, BO sets a follow-up date and the contact drops into the nurture list until then.
- Action 7, wait 14 days: move the opportunity to Lost with reason no decision and add the contact to the monthly newsletter.
Exit: Package Selection submitted, payment received, opportunity moved to Lost, or STOP received.
4. Package Activation and First-Block Booking
Trigger: payment succeeded webhook from the payment processor, or first installment captured on a plan.
Conditions: match the payment to the product to decide which block was bought.
- Action 1, immediate: move opportunity to Package Purchased, write Package Type, Sessions Total, Sessions Used = 0, Sessions Remaining = Sessions Total, Package Purchase Date = today, Package Expiry Date = today plus the block's validity window, Payment Method, and clear Renewal Offer Sent.
- Action 2, immediate: apply pt-active, remove pt-lapsed, pt-low-balance, pt-renewal-offered and pt-winback-active if present.
- Action 3, immediate: send receipt by email and SMS. "You're in, {{first_name}}. {{sessions_total}} sessions with {{assigned_trainer}}, valid until {{package_expiry_date}}. Book your first three here so they're locked in: {{session_booking_link}}"
- Action 4, wait 1 hour: notify the assigned trainer internally with the intake answers and the stated goal.
- Action 5, wait 2 days: if zero appointments exist on a session calendar, SMS. "Noticed you haven't picked your first slots yet. Want me to suggest three that fit the days you said worked? {{session_booking_link}}"
- Action 6, wait 5 days: if still no booking, task the trainer to call. An unbooked paid block is the single most reliable predictor of a refund request.
- Action 7, installment branch: on a failed installment, pause pt-active after a 3-day grace period, notify the owner, and send: "{{first_name}}, the last payment didn't go through: can you update the card here? {{payment_update_link}} Your slots are held until {{grace_end}}."
Exit: first session attended, or refund issued (which reverses the balance and removes pt-active).
5. Session Burn-Down and Attendance Logging
Trigger: appointment status changed on any PT Session or Semi-Private calendar.
Branches by status:
- Attended: increment Sessions Used by 1, decrement Sessions Remaining by 1, write Last Session Date = appointment date. Then wait 2 hours and send: "Nice work today, {{first_name}}. {{sessions_remaining}} left in this block. Next one booked? {{session_booking_link}}"
- Canceled more than 24 hours out: no balance change, no count increment. Send: "Canceled, no problem. Grab another slot whenever: {{session_booking_link}}" Then notify the trainer that the slot is free.
- Canceled inside 24 hours: increment Late Cancel Count, apply the studio's configured balance rule, and route to workflow 7.
- No-show: increment No Show Count, apply pt-no-show, apply the balance rule, and route to workflow 7.
- Threshold action: when Sessions Remaining changes, evaluate it. At 2 or below, trigger workflow 6. At 0, remove pt-active, move the opportunity to Lapsed unless it is already Renewed, and send the End of Block Review.
- Gap check, runs daily: if pt-active and Last Session Date is more than 14 days ago and no future appointment exists, SMS. "{{first_name}}, it's been a couple of weeks: you've still got {{sessions_remaining}} sessions and they run out {{package_expiry_date}}. Want me to find you a slot?" Then task the trainer.
Exit: this workflow is event-driven and always on for contacts tagged pt-active.
6. Low-Balance Renewal Sequence
Trigger: Sessions Remaining drops to 2 or below, or Package Expiry Date is 21 days away, whichever comes first.
Conditions: only run if Renewal Offer Sent is empty for this block, so the sequence fires once per block and not once per decrement.
- Action 1, immediate: move opportunity to Renewal Window, apply pt-low-balance, write Renewal Offer Sent = today, notify the assigned trainer: "{{first_name}} is at {{sessions_remaining}} sessions. Have the conversation in the next session."
- Action 2, wait 1 hour: SMS. "Heads up {{first_name}}, you're down to {{sessions_remaining}} sessions, and they expire {{package_expiry_date}}. You've been working on {{primary_goal}}; worth keeping the momentum. {{assigned_trainer}} will go through next-block options with you, or book a 15-minute call here: {{renewal_call_link}}"
- Action 3, wait 3 days: if no renewal and no call booked, email. Subject: "{{sessions_remaining}} sessions left: what's next for {{primary_goal}}". Body recaps session count delivered to date, Last Session Date, and the options page link.
- Action 4, on the final session of the block, 2 hours after it is marked attended: SMS. "That was your last one in this block, {{first_name}}. Want to carry straight on? {{package_link}}"
- Action 5, wait 2 days from the final session: task the trainer for a personal call, with the client's goal and total sessions delivered shown on the task.
- Action 6, wait 5 days: if no renewal, remove pt-low-balance, apply pt-lapsed, move opportunity to Lapsed, send the End of Block Review and hand to workflow 8.
Exit: new payment received (routes to workflow 4), renewal call booked, or Lapsed reached.
7. Cancellation and No-Show Policy Enforcement
Trigger: Late Cancel Count or No Show Count incremented by workflow 5, or Cancellation Request form submitted inside the notice window.
Branches on combined count:
- First occurrence: SMS, no escalation. "No problem {{first_name}}, that one's inside our {{notice_window}} window so it counts against the block, per the policy on your booking page. Here's the link to pick a replacement slot: {{session_booking_link}}" Notify the trainer that the slot is free.
- Second occurrence: apply pt-policy-warning. SMS. "That's the second short-notice change, {{first_name}}. Totally understand life happens, but it does leave a slot unused that someone else wanted. If the day or time isn't working, tell me and we'll move your regular slot properly." Task the trainer to raise it in person.
- Third occurrence: no further automated message to the client. Notify the owner and the assigned trainer with the full history (dates, counts, sessions remaining) and create a task to decide whether to restrict self-booking for that contact. The system stops talking and a human takes over, because a third breach is a relationship question rather than a messaging question.
- Released-slot offer, immediate on any cancellation: query contacts tagged pt-active with Sessions Remaining greater than 0, no appointment in the next 7 days, and stated availability matching the released slot. Send to at most three of them: "A slot just opened with {{assigned_trainer}} at {{slot_time}}, first to book takes it: {{session_booking_link}}" Stop after the first booking.
Exit: replacement slot booked, counts reset at the start of a new block, or owner closes the escalation task.
8. Lapsed Client Win-Back
Trigger: pt-lapsed applied, or Package Expiry Date passes with Sessions Remaining greater than 0.
Conditions: suppress entirely if the contact has an active opportunity in any other pipeline, or if pt-policy-warning escalated to the third occurrence and the owner marked the contact as not to be re-marketed.
- Action 1, immediate: apply pt-winback-active, remove pt-active, lock the session calendars.
- Action 2, wait 14 days: SMS, branching on the End of Block Review answer. If they said they would continue: "{{first_name}}, you said you were planning to carry on: want me to set up the next block? {{package_link}}" If they flagged something to change: "You mentioned {{review_note}}. {{assigned_trainer}} has ideas on that: worth a 15-minute call? {{renewal_call_link}}" If no review was submitted: "{{first_name}}, your block finished a couple of weeks ago. How's training going on your own?"
- Action 3, wait 21 days: email with a check-in offer. "Come in for a single session, no block required: {{assigned_trainer}} will see where you're at against {{primary_goal}} and tell you straight whether you need us."
- Action 4, wait 30 days: final SMS. "Last nudge, {{first_name}}. Door's open whenever. I'll stop messaging about it now."
- Action 5, wait 7 days: remove pt-winback-active, add to the monthly newsletter list, and stop all sequences.
Exit: any purchase, any appointment booked, any inbound reply (hands the thread to the trainer), STOP received, or the sequence completes.