Workflow 1: Inquiry Capture & Instant Response
Trigger: any of: Appointment Request form submitted, web chat conversation started, inbound SMS to a practice number from an unknown contact, inbound call answered and tagged as new patient, or inbound social message.
First actions, in order:
- Create or match the contact on phone number first, then email. Never create a duplicate on a near-match name.
- Create the pipeline card in New Inquiry. Write first_touch_timestamp, inquiry_channel, inquiry_source_campaign, preferred_location, reason_for_visit_category.
- Apply new-patient plus the channel tag. If the local time is outside posted hours, also apply after-hours-inquiry.
- Branch on consent. If sms_consent = true, go to step 5. If false or empty, skip SMS entirely and send the email version, then create a task to call.
- Branch on hours. Inside business hours: notify the front desk channel and assign assigned_coordinator by round robin, then send the SMS below. Outside business hours: hand the thread to BO and send the SMS below.
- Send SMS, no wait: "Hi {{first_name}}, this is {{practice_name}}, we got your request for {{location}}. I can get you on the schedule. Which works better, a morning or an afternoon? Reply STOP to opt out."
- Write first_response_timestamp. Move card to Attempted Contact.
- Wait 5 minutes. If no reply and it is inside business hours, place an outbound call task marked urgent. If outside hours, do nothing. The no-response ladder picks it up in the morning.
Exit conditions: patient replies on any channel (hand to Workflow 3), card reaches Appointment Booked, sms-stop applied, or card closed.
Workflow 2: Missed Call Text-Back
Trigger: inbound call to any practice number ends with status missed, abandoned or voicemail.
Conditions: the calling number is mobile-capable and does not carry sms-stop. Suppress if an outbound SMS to this number was already sent in the last 20 minutes, so a patient calling three times does not get three texts.
- Wait 60 seconds: long enough that the text does not land while the person is still dialling back.
- Send SMS: "Sorry we missed your call. This is {{practice_name}}. You can reply right here and I'll help you get scheduled. If this is a medical emergency, please call 911. Reply STOP to opt out."
- Apply missed-call. Create or update the card; if new, set inquiry_channel = phone-inquiry from the tracking number that called.
- Wait 15 minutes. If no reply and inside business hours, create a callback task on the Coordinator Callback calendar in the next open staff slot.
- Wait 2 hours. If still no reply, send one email if an address is known: subject "We missed you: here's our schedule", body naming the location and linking the self-schedule page.
Exit conditions: any inbound reply, call answered on callback, sms-stop, or 24 hours elapsed with the card handed to Workflow 3.
Workflow 3: No-Response Ladder
Trigger: card has been in Attempted Contact for 2 hours with no inbound reply.
Global conditions: every step is gated on quiet hours. Nothing sends before 8:00am or after 8:00pm in the contact's time zone; a step that comes due inside quiet hours queues to 8:05am. Every step is gated on sms-stop and on stage, and the whole workflow exits the instant the patient replies.
- Day 0, +2 hours. SMS: "{{first_name}}, still happy to get you booked at {{location}}. Here are our next open times: {{booking_link}}"
- Day 0, +4 hours. If no reply, create a call task for assigned_coordinator. Attempt 1 of 3.
- Day 1, 9:15am. Email: subject "Getting you scheduled at {{practice_name}}". Body restates the service line, names the provider, lists the two nearest open slots and links the self-schedule page.
- Day 1, 2:00pm. Call task, attempt 2. Coordinator logs outcome on the card.
- Day 3, 10:30am. SMS: "Hi {{first_name}}, did you still want that appointment, or should I close out your request? Just reply YES or NO." A YES reply moves the card to Two-Way Conversation and notifies staff. A NO reply closes the card to Lost: No Response with reason patient declined.
- Day 5, 9:30am. Call task, attempt 3, this one scheduled as a real event on the Coordinator Callback calendar so it is not optional.
- Day 7, 11:00am. Final email: subject "Closing your request. The door stays open". Body contains the self-schedule link and nothing else to do.
- Day 8. Move card to Lost: No Response. Remove from active queues. Keep inquiry_channel and inquiry_source_campaign so the loss reports against the campaign that produced it.
Exit conditions: any inbound SMS, email reply, inbound call, booking event, sms-stop, or manual stage change by staff.
Workflow 4: Coverage Check Loop
Trigger: card enters Coverage Check.
Branch on coverage_type: self-pay skips this workflow entirely and moves straight to Ready to Book. Unknown is treated as commercial until the coordinator corrects it.
- Create a task for assigned_coordinator: "Verify network status, {{insurance_carrier_name}}, {{patient_name}}", due in 4 business hours.
- Send the patient an SMS so silence does not read as neglect: "Thanks {{first_name}}, we're confirming your coverage with {{insurance_carrier_name}} now. I'll text you as soon as I have an answer, usually within one business day."
- Wait 4 business hours. If coverage_status is still "not started" or "in progress", notify the practice manager. This is the escalation that keeps verification piles from forming.
- Wait 1 business day. If still unresolved, send the patient a holding message and offer a provisional slot: "{{first_name}}, still waiting on {{insurance_carrier_name}}. I can hold a time for you now and we'll confirm coverage before the visit: want me to?"
- On coverage_status = in network: move to Ready to Book. Fires Workflow 5.
- On coverage_status = needs auth: keep the card in Coverage Check, apply a prior-auth task with its own due date, and tell the patient the visit can be held but not confirmed until authorization lands.
- On coverage_status = out of network: apply out-of-network, create a task to call the patient and walk the self-pay path and the referral by voice, never by text, then move to Referred Out / Not a Fit once the Referral-Out form is submitted. No price or estimate is sent in any automated message; the conversation is a call, and the card records that it happened.
Exit conditions: coverage_status set to a terminal value, card moved manually, or patient withdraws.
Workflow 5: Booking Offer
Trigger: card enters Ready to Book.
- Send SMS with a booking link scoped to the correct calendar by preferred_location, first_appointment_type and preferred_provider: "Good news {{first_name}}, you're all set to book at {{location}}. Pick any time that works: {{booking_link}}"
- Send the same link by email for patients who will not tap a text link.
- Wait 3 hours. If not booked, SMS: "{{first_name}}, {{provider}}'s next two openings are {{slot_1}} and {{slot_2}}, want me to hold one?"
- Wait 1 day. If not booked, create a call task so a human books it with them on the phone.
- Wait 2 days. If not booked, return the card to Workflow 3 at step 5.
Exit conditions: appointment booked on any calendar, or card closed.
Workflow 6: Confirmation & Intake Chase
Trigger: appointment booked on a New Patient Consult, Same-Day or Telehealth calendar.
- Move card to Appointment Booked, apply booked, write the three appointment fields.
- Send SMS immediately: "You're booked, {{first_name}}, {{appointment_day}} at {{appointment_time}}, {{location_address}}. I'll text you a short checklist. Reply STOP to opt out."
- Send email immediately: date, time, address, parking, provider name, what to bring, and the link into the secure intake path. The email carries the detail; the SMS carries the time and place only.
- Write intake_forms_sent_date, set intake_forms_status = sent, move card to Intake Pending.
- Wait 24 hours. Branch: if intake_forms_status = complete, exit. Otherwise SMS: "{{first_name}}, your forms take about five minutes and save you twenty in the waiting room: {{intake_link}}"
- Wait 48 hours. If still not complete, SMS: "Quick reminder. Your forms for {{appointment_day}} aren't finished yet: {{intake_link}}. Reply HELP and someone will walk you through it."
- At 72 hours before first_appointment_datetime, if intake_forms_status is not complete, create a call task for the front desk and apply a paper-intake-likely flag so the schedule can absorb the extra time.
- At 24 hours before the appointment, if id_and_card_uploaded = false, send: "Please bring your ID and insurance card to your {{appointment_time}} visit. It's the fastest way to get you checked in."
Exit conditions: intake_forms_status = complete, appointment canceled, or sms-stop. No intake nudge ever contains clinical questions or asks the patient to reply with health information or an insurance identifier; every nudge is a link into the secure path.
Workflow 7: Reminder Ladder
Trigger: scheduled relative to first_appointment_datetime.
Global conditions: appointment status is still booked; sms-stop absent; quiet hours enforced; messages contain date, time, location and provider name only. Never the reason for visit, never a service or program name that discloses a condition.
- T-5 days, 10:00am. SMS confirmation request: "{{first_name}}, confirming your visit with {{provider}} on {{appointment_day}} at {{appointment_time}}. Reply C to confirm or R to reschedule." A C reply writes a confirmed flag on the card. An R reply sends the reschedule link and moves the card to a reschedule branch that increments reschedule_count.
- T-2 days, 9:00am. Email with the full detail block, directions, and the cancellation policy in plain language.
- T-1 day, 4:00pm. SMS: "See you tomorrow at {{appointment_time}}, {{first_name}}, {{location_address}}. Reply R if you need a different time."
- T-2 hours. SMS: "We're ready for you at {{appointment_time}} today. {{parking_note}}" Telehealth branch sends the visit link instead of the address.
- T-30 minutes, telehealth only. SMS with the link again, because the first one is already buried.
Exit conditions: appointment canceled, patient marked arrived, or sms-stop. If the patient confirms, later steps still send but the day-before staff call list drops them.
Workflow 8: No-Show Recovery
Trigger: appointment status set to no-show, or 20 minutes past start with no arrival mark.
- Move card to No-Show: Recovery, increment no_show_count, apply no-show-1 or no-show-2.
- Wait 20 minutes. SMS: "{{first_name}}, we had you down for {{appointment_time}} today and missed you. Want me to find you another time? {{booking_link}}" Tone is deliberately neutral. A shaming message loses the patient permanently.
- Wait 3 hours. If not rebooked, create a call task for the same coordinator who booked the original visit.
- Wait 1 day, 10:00am. Email: subject "Let's get you rescheduled", with two concrete slots and the self-schedule link.
- Wait 4 days. If not rebooked, SMS once: "Still want to see {{provider}}? Reply YES and I'll grab you a slot."
- Branch on no_show_count: if 2 or more, route to the practice manager instead of auto-rebooking, with a task to decide whether the next booking requires a confirmed call or a different appointment type. This is a policy decision the practice makes, not one the automation makes.
- Wait 14 days. If not rebooked, move card to Lost: No Response with reason no-show not recovered.
Exit conditions: new appointment booked, patient asks to stop, or manager closes the card.
Workflow 9: Post-Visit Feedback and Review
Trigger: card moves to Arrived / Seen.
- Wait 2 hours after the appointment end time.
- Send a single-question SMS: "Thanks for coming in today, {{first_name}}. How was your visit: 1 to 5?" The question is about the visit experience and invites no clinical detail.
- Branch on reply. 4 or 5: send the public review link with one line of thanks. 1 to 3: send "Thank you for telling us: our practice manager will reach out personally." and create an urgent task for the manager. No review link is ever sent on a low score.
- No reply after 2 days: send one email version, then exit. Never a third ask.
- Write the response onto the card so the satisfaction signal sits next to inquiry_source_campaign and the dashboard can show which channels bring patients who are happy, not just patients who book.
Exit conditions: reply received, 2 days elapsed after the email, or sms-stop.
Workflow 10: Consent, Opt-Out and Quiet Hours Guard
Trigger: runs ahead of every outbound message in every workflow above.
- Inbound message matching STOP, STOPALL, UNSUBSCRIBE, CANCEL, END or QUIT: apply sms-stop, set sms_consent = false, remove the contact from every active SMS step, and send the single confirmation the carrier framework requires.
- Inbound START or UNSTOP: remove sms-stop, set sms_consent = true, write a fresh sms_consent_timestamp and sms_consent_source = patient reply.
- Inbound HELP: reply with the practice name, the phone number, and the opt-out instruction.
- Before any send: if sms_consent is not true, suppress and fall back to email or a call task. There is no "send anyway" branch.
- Before any send: if local time is outside 8:00am–8:00pm, queue to 8:05am next allowed day. Appointment-day reminders inside the window are the only time-sensitive exception and they are already scheduled inside it.
- Before any send: run the PHI check. The message template must be drawn from the approved library, must not contain reason_for_visit_category, a program name, a medication, a diagnosis or a result, and must not request health information or an insurance identifier by reply. Anything beyond appointment logistics is a link into the secure path, not message body.
Exit conditions: none. This guard never turns off.