Back to the build library
Healthcare & clinics
Standard

New Patient Intake & Booking Engine

Capture every new patient inquiry, answer it in seconds, verify coverage, book the visit and finish intake before they arrive.

Industry
Healthcare & clinics
Build effort
Standard
Typical time to launch
3–4 weeks
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 new patient inquiry is the most fragile thing a clinic handles. It arrives on a phone line while the front desk is checking in a patient standing at the counter, or through a web form at 9:40 on a Saturday night, or as a direct message on a page nobody has opened since Tuesday. Each of those channels has a different owner, a different response time, and no shared record. The person who called at 11am and left a voicemail has, by 3pm, already called two other practices. Nobody at the clinic knows that happened, because the only trace of the inquiry is a voicemail light and a sticky note.

The leak compounds after the first contact. A patient who does get through still has to be matched to a provider, screened for whether the practice is in network, told what to bring, and sent paperwork. Every one of those steps is usually a phone call placed by a person who is also doing three other things. Coverage checks sit in a pile. Intake packets go out as a PDF attached to an email that is never opened, so the patient arrives and fills out eight pages on a clipboard, which pushes the schedule back twenty minutes and compresses the visit. Reminders either do not go out or go out once, so the chair sits empty at a slot that another patient would have taken.

The money does not leak in one dramatic place. It leaks in the gap between inquiry and first contact, in the gap between booking and arrival, and in the no-show rate that nobody attributes to the absence of a reminder ladder. The clinic experiences this as "we are busy" and "people just do not show up." What is actually happening is that a measurable share of acquired demand. Demand the practice already paid for in marketing, referral relationships and reputation. Never converts into a seen patient, and no system is counting the loss. This build makes the whole path from inquiry to seen patient a single tracked object, so the gaps become visible and then closeable.

02

What gets built

Pipeline: New Patient Intake

One pipeline, one card per inquiry, from first touch to seen. Stages move forward only on an observable event, never on a feeling.

  • New Inquiry: created the moment any channel fires. Nothing has been attempted yet.
  • Attempted Contact: at least one outbound touch sent, no reply yet.
  • Two-Way Conversation: the patient has replied. This is the stage where a human or BO is actively working the inquiry.
  • Coverage Check: practice is confirming network status, plan, or self-pay path.
  • Ready to Book: coverage resolved, patient wants a time.
  • Appointment Booked: a calendar slot exists.
  • Intake Pending: booked, forms and consents not yet complete.
  • Intake Complete: forms, consents and demographics in before arrival.
  • Arrived / Seen: the win condition. Only this stage counts as conversion.
  • No-Show: Recovery: booked and did not arrive; worked by a dedicated workflow.
  • Referred Out / Not a Fit: out of network, out of scope, or wrong geography. Closed with a reason.
  • Lost: No Response: the full outreach ladder completed with no reply.

Calendars

  • New Patient Consult: one calendar per provider, longer slot length than an established visit, buffered on both sides. Minimum scheduling notice set so the front desk is never ambushed.
  • Same-Day / Acute: short slots, same-day booking only, capped per day so acute demand cannot swallow a provider's whole panel.
  • Telehealth New Patient: separate calendar so virtual and in-office capacity are planned separately, with a location field that routes the patient to the correct link.
  • Coordinator Callback: a staff-facing calendar for scheduled outbound calls, so "we will call you back" becomes a real booked event with a real owner.

Custom fields

Field names as built. Keep them identical across forms, the pipeline and the automations so no workflow has to guess.

  • Identity and routing: preferred_name, preferred_language, needs_interpreter, preferred_location, preferred_provider, preferred_contact_method, assigned_coordinator
  • Clinical routing only, not clinical detail: reason_for_visit_category (a short option list such as annual, acute, procedure consult, follow-up transfer, program enrollment. A category, never free-text symptoms)
  • Coverage: coverage_type (commercial, managed plan, public program, self-pay, unknown), insurance_carrier_name, member_id_on_file (yes/no switch. The identifier itself lives in the practice record, not here), coverage_status (not started, in progress, in network, out of network, needs auth, self-pay), coverage_checked_by, coverage_checked_date
  • Consent: sms_consent, sms_consent_timestamp, sms_consent_source, email_consent, communication_consent_signed, consent_document_id
  • Intake: intake_forms_status (not sent, sent, partial, complete), intake_forms_sent_date, portal_account_created, id_and_card_uploaded
  • Appointment: first_appointment_datetime, first_appointment_type, first_appointment_provider, reschedule_count, no_show_count
  • Attribution: inquiry_channel, inquiry_source_campaign, referral_source_name, first_touch_timestamp, first_response_timestamp, first_reply_timestamp

Tags

  • Channel and state: new-patient, after-hours-inquiry, missed-call, web-form, chat-inquiry, phone-inquiry
  • Consent state: sms-ok, sms-stop, email-only, call-only
  • Handling: needs-human-now, interpreter-needed, self-pay, out-of-network, telehealth-pref
  • Outcome: booked, seen, no-show-1, no-show-2, referred-out

Forms and surveys

  • Appointment Request (public, on the site and the funnel). Name, phone, email, preferred location, reason category, preferred times, coverage type, and the SMS and email consent checkboxes with their own explicit language. This form collects no symptoms, no conditions and no medication history.
  • Communication Consent: a standalone, signable consent covering what the practice may send by SMS and email, what it will not send, and how to opt out. Writes communication_consent_signed and consent_document_id.
  • Demographics & Coverage: delivered after booking through the practice's secure intake path rather than as a plain SMS reply, so insurance identifiers and any health history are captured inside the clinical system.
  • Referral-Out: an internal form the coordinator fills when the practice cannot serve the patient, which captures the reason and the referral given so the closed card still produces a clean statistic.

Funnels and landing pages

  • One new-patient page per service line, each with its own campaign parameter so inquiry_source_campaign populates without anyone typing it.
  • A self-schedule page that shows live availability from the New Patient Consult calendar, for patients who prefer not to talk to anyone.
  • A confirmation page that does real work: it restates the appointment, lists what to bring, and links the intake path, so the first instruction is delivered before the first reminder.

BO's role and guardrails

BO is the first responder on web chat and inbound SMS, and the after-hours responder on every channel. BO's job is scheduling logistics and nothing else.

  • BO does: acknowledge the inquiry immediately, confirm which location and service line the patient wants, collect name and callback number, offer open slots from the correct calendar, book or hold a slot, capture consent for SMS, set preferred_language, and hand off cleanly with a written summary on the card.
  • BO never: gives clinical advice, interprets symptoms, triages urgency, confirms what a condition means, discusses test results, quotes a price or an out-of-pocket estimate, or asks the patient to send clinical or insurance identifiers over SMS.
  • Hard escalation triggers: BO stops the scripted path, posts needs-human-now, and notifies the on-duty staff channel: any wording suggesting an emergency, severe pain, bleeding, chest pain, difficulty breathing, pregnancy complication, or self-harm; any mention of a lawyer, a complaint or a records request; any request for results; any third party calling about a patient; a patient who asks twice for a human.
  • Emergency response is fixed copy, not generated: "If this is an emergency, please call 911 or go to your nearest emergency room now. I am not able to give medical advice. I am flagging this for our team right away."
  • Containment: BO answers from the practice's own published service, location and hours content. If the answer is not in that content, BO says so and books a callback rather than improvising.

Voice and call routing

  • A tracking number per inquiry channel so inquiry_channel is set by the number that called, not by recall.
  • Business-hours routing to the front desk with a ring timeout, then a voicemail that triggers the missed-call text-back workflow.
  • After-hours routing to a recorded greeting that states the emergency instruction first, then offers a text-back or a self-schedule link.
  • Every call, answered or not, creates or updates the pipeline card. There is no inquiry that exists only as a voicemail.

Reporting

One dashboard, built on the timestamp fields above: inquiries by channel, median time from first_touch_timestamp to first_response_timestamp, reply rate, inquiry-to-booked rate, booked-to-seen rate, no-show rate by appointment type and provider, intake-complete-before-arrival rate, and stage-level drop-off showing exactly which stage loses the most cards.

03

How it runs, step by step

One patient, end to end

  1. A prospective patient searches for the practice's service line on a Saturday evening, lands on the new-patient page, and submits the Appointment Request form. She checks the SMS consent box. The page's campaign parameter writes inquiry_source_campaign; the form writes inquiry_channel = web-form, sms_consent = true and sms_consent_timestamp.
  2. A card is created in New Inquiry with first_touch_timestamp stamped. Tags new-patient, web-form, after-hours-inquiry and sms-ok are applied.
  3. Within seconds she receives an SMS from the practice's number acknowledging the request by name, naming the location, and asking one question: which of two offered windows works better. first_response_timestamp is stamped. The card moves to Attempted Contact.
  4. She replies choosing a window. first_reply_timestamp is stamped and the card moves to Two-Way Conversation. Because it is outside business hours, BO is handling the thread.
  5. BO confirms the service line and location against the practice's published content, asks for coverage type from a short list, and sets coverage_type = commercial and insurance_carrier_name. BO does not ask for a member ID over SMS and says so plainly: the identifier is collected later in the secure intake.
  6. Because coverage_type is not self-pay, the card moves to Coverage Check and a task is created for the coordinator for the next business morning. BO tells her what happens next and when, then stops.
  7. Monday morning the coordinator works the Coverage Check queue, confirms in-network status in the practice's own systems, and sets coverage_status = in network, coverage_checked_by and coverage_checked_date. The card moves to Ready to Book.
  8. Moving to Ready to Book sends her a booking link scoped to the New Patient Consult calendar for her chosen location, filtered to her stated window. She books. The calendar writes first_appointment_datetime, first_appointment_type and first_appointment_provider; the card moves to Appointment Booked and the booked tag is applied.
  9. Booking fires the confirmation: an SMS with date, time, location and the parking instruction, plus an email containing the same detail, the what-to-bring list, and the link into the secure intake path. intake_forms_sent_date is written and the card moves to Intake Pending.
  10. She completes demographics, uploads her card and ID, and signs the Communication Consent inside the secure path. Those completions write intake_forms_status = complete, id_and_card_uploaded = true and communication_consent_signed = true. The card moves to Intake Complete, and the intake-chase sequence exits without sending another nudge.
  11. The reminder ladder runs off first_appointment_datetime: a confirmation request five days out, a reminder the day before, and a short arrival reminder on the morning of. Each reminder carries the appointment time and location and no clinical content.
  12. She replies C to confirm. The reminder ladder's remaining nudges still send, but the front desk's day-before call list no longer includes her, because her confirmation is on the card.
  13. She arrives. The front desk moves the card to Arrived / Seen, which is the only stage the dashboard counts as a conversion. The whole path: channel, campaign, response time, coverage path, booking, intake, reminders, arrival: is one object with timestamps.
  14. Two hours after the visit ends, a short satisfaction question goes out. A positive answer routes her to a public review; anything else routes to the practice manager as a private service recovery task, with no review request sent.

The same path when it goes wrong

  1. If she never replies, the no-response ladder runs across SMS, email and one scheduled human call attempt, then closes the card to Lost: No Response with the channel and campaign intact, so the loss is attributable rather than invisible.
  2. If coverage comes back out of network, the card moves to Referred Out / Not a Fit only after the coordinator has offered the self-pay path and the referral, both captured on the Referral-Out form.
  3. If she does not arrive, the card moves to No-Show: Recovery, no_show_count increments, and a same-day rebooking attempt runs before the slot loss becomes permanent.
04

Automations in detail

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:

  1. Create or match the contact on phone number first, then email. Never create a duplicate on a near-match name.
  2. Create the pipeline card in New Inquiry. Write first_touch_timestamp, inquiry_channel, inquiry_source_campaign, preferred_location, reason_for_visit_category.
  3. Apply new-patient plus the channel tag. If the local time is outside posted hours, also apply after-hours-inquiry.
  4. 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.
  5. 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.
  6. 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."
  7. Write first_response_timestamp. Move card to Attempted Contact.
  8. 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.

  1. Wait 60 seconds: long enough that the text does not land while the person is still dialling back.
  2. 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."
  3. Apply missed-call. Create or update the card; if new, set inquiry_channel = phone-inquiry from the tracking number that called.
  4. 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.
  5. 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.

  1. Day 0, +2 hours. SMS: "{{first_name}}, still happy to get you booked at {{location}}. Here are our next open times: {{booking_link}}"
  2. Day 0, +4 hours. If no reply, create a call task for assigned_coordinator. Attempt 1 of 3.
  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.
  4. Day 1, 2:00pm. Call task, attempt 2. Coordinator logs outcome on the card.
  5. 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.
  6. 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.
  7. 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.
  8. 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.

  1. Create a task for assigned_coordinator: "Verify network status, {{insurance_carrier_name}}, {{patient_name}}", due in 4 business hours.
  2. 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."
  3. 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.
  4. 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?"
  5. On coverage_status = in network: move to Ready to Book. Fires Workflow 5.
  6. 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.
  7. 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.

  1. 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}}"
  2. Send the same link by email for patients who will not tap a text link.
  3. 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?"
  4. Wait 1 day. If not booked, create a call task so a human books it with them on the phone.
  5. 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.

  1. Move card to Appointment Booked, apply booked, write the three appointment fields.
  2. 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."
  3. 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.
  4. Write intake_forms_sent_date, set intake_forms_status = sent, move card to Intake Pending.
  5. 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}}"
  6. 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."
  7. 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.
  8. 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.

  1. 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.
  2. T-2 days, 9:00am. Email with the full detail block, directions, and the cancellation policy in plain language.
  3. T-1 day, 4:00pm. SMS: "See you tomorrow at {{appointment_time}}, {{first_name}}, {{location_address}}. Reply R if you need a different time."
  4. 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.
  5. 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.

  1. Move card to No-Show: Recovery, increment no_show_count, apply no-show-1 or no-show-2.
  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.
  3. Wait 3 hours. If not rebooked, create a call task for the same coordinator who booked the original visit.
  4. Wait 1 day, 10:00am. Email: subject "Let's get you rescheduled", with two concrete slots and the self-schedule link.
  5. Wait 4 days. If not rebooked, SMS once: "Still want to see {{provider}}? Reply YES and I'll grab you a slot."
  6. 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.
  7. 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.

  1. Wait 2 hours after the appointment end time.
  2. 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.
  3. 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.
  4. No reply after 2 days: send one email version, then exit. Never a third ask.
  5. 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.

  1. 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.
  2. Inbound START or UNSTOP: remove sms-stop, set sms_consent = true, write a fresh sms_consent_timestamp and sms_consent_source = patient reply.
  3. Inbound HELP: reply with the practice name, the phone number, and the opt-out instruction.
  4. 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.
  5. 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.
  6. 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.

05

What changes

What is different afterwards

  • Every inquiry, on every channel, exists as one card with one owner and a timestamped history. "Did anyone call her back?" becomes a question the system answers rather than a question staff ask each other.
  • First response stops depending on whether the front desk happened to be free. Nights and weekends get the same acknowledgement speed as Tuesday at 10am.
  • Coverage verification is a queue with a due date and an escalation, not a pile. Patients hear from the practice while they wait, so silence stops reading as rejection.
  • Intake moves off the clipboard and in front of the visit, which gives the provider the whole appointment instead of the back two-thirds of it.
  • No-shows become a worked stage with a recovery path, so a missed slot gets one more chance at being filled before it is simply lost.
  • Marketing spend becomes judgeable. Because inquiry_source_campaign survives all the way to Arrived / Seen, the practice can tell the difference between a channel that produces inquiries and a channel that produces patients.

Metrics to watch

  • Median time to first response, by channel and by hour of day. Watch the after-hours cohort separately. That is where the build does its heaviest lifting.
  • Inbound reply rate to the first outbound message. If this is weak, the first message is wrong, not the channel.
  • Inquiry-to-booked rate and booked-to-seen rate, tracked as two separate numbers. They fail for completely different reasons and averaging them hides both.
  • Stage-level drop-off. The stage that loses the most cards is the next thing to fix; usually it is Coverage Check or Intake Pending.
  • Coverage check cycle time, median and 90th percentile. The long tail is where patients quietly leave.
  • Intake-complete-before-arrival rate, and the clinic-time consequence: average minutes from check-in to provider in the room.
  • No-show rate by appointment type, provider and day of week, plus no-show recovery rate: the share of no-shows rebooked within 14 days.
  • Confirmation reply rate on the T-5 day message, which is the earliest leading indicator of a no-show.
  • Opt-out rate per 1,000 sends. A rising number means the cadence is too aggressive and should be trimmed before carrier filtering does it for you.
  • Cost per seen new patient by campaign, which is the only acquisition number worth making decisions on.

Set a baseline for each of these in the first two weeks before changing cadence, so later improvements are attributable to a change rather than to the season.

06

Before you start

Decide these before anything is built

  • Which service lines take new patients, at which locations, and the real appointment length for each. Calendar slot lengths that do not match reality create a booking engine that books unusable appointments.
  • Who owns the inquiry queue by name, and who covers them. Round robin to an unstaffed seat is worse than no automation.
  • Your posted hours, your quiet-hours window, and what the after-hours path is allowed to promise.
  • Your cancellation and no-show policy in plain language, because the reminder emails will state it.

Integrations and data

  • Calendar connection for each provider, so the platform never offers a slot the provider has personally blocked.
  • Practice management or EHR path. Decide explicitly what lives where: the platform holds inquiry, consent, scheduling logistics and attribution; the clinical system holds the chart, the insurance identifiers and the health history. The secure intake path writes to the clinical system, not to the platform's custom fields.
  • Secure intake and e-signature for the Demographics & Coverage form and the Communication Consent, with an audit trail of who signed what and when.
  • Review platform connection for the post-visit workflow.
  • Website and funnel access to place forms, tracking numbers and campaign parameters.

Numbers and messaging registration

  • Provision a dedicated messaging number per location, plus tracking numbers per inquiry channel. Do not send patient messaging from a number patients cannot call back.
  • Complete A2P 10DLC registration: brand registration, then a campaign per use case. Register the appointment-reminder and care-coordination use cases separately from any marketing use case; mixing them in one campaign invites filtering of the messages you can least afford to lose.
  • Submit the real opt-in flow in the registration: a screenshot of the Appointment Request form showing the consent checkbox and its exact wording, and the wording itself. Registration is approved or rejected on the evidence of consent, so build the form before you register.
  • Expect a registration lead time and start it on day one of the build, not at launch.
  • Verify the sending domain for email (SPF, DKIM, DMARC) before the first email send.
  • Confirm STOP, START and HELP handling end to end with a live test on each number before any patient traffic.

Consent capture

  • Consent must be explicit, unbundled and logged. A single checkbox that also accepts the privacy policy is not consent to text. Separate checkboxes for SMS and email, each with its own language naming the sender, the message types, the frequency expectation and the opt-out instruction.
  • Log sms_consent_timestamp, sms_consent_source and the form or recording the consent came from. If you cannot produce the evidence of consent for a given contact, you cannot defend the send.
  • Capture consent for verbal opt-ins too: the coordinator reads the disclosure, and the workflow writes sms_consent_source = verbal with the call record attached.
  • Re-consent is required when the channel or message type changes materially. Appointment reminders are not permission to send a promotion.

Protected health information: operational practice

This section describes how practices commonly operate this build. It is not legal advice. Confirm every decision below with your own practice's compliance counsel and your own risk assessment before you launch.

  • Get the business associate agreement signed first. Any vendor that stores, transmits or touches patient information on the practice's behalf. The platform, the messaging carrier path, the form and e-signature tool, the storage layer. Needs an executed BAA in place before real patient data enters it. No BAA, no patient traffic. Keep the executed agreements where the compliance officer can produce them.
  • Minimum necessary, applied to message copy. An outbound SMS carries the date, the time, the location, the provider's name and a link. That is the whole permitted payload. Keep out of SMS: diagnoses, symptoms, test or lab results, medication names, procedure names, program names that reveal a condition, the reason_for_visit_category value, and anything a person reading over the patient's shoulder should not learn.
  • Never solicit health information or identifiers by reply. Patients will sometimes volunteer clinical detail in a text thread anyway. Plan for it: the thread is treated as part of the record, staff do not continue the clinical conversation in that channel, and the standard reply moves it: "I'm not able to discuss medical details here. I'm sending you a secure link so you can tell your care team directly."
  • Keep the clinical and logistical stores separate on purpose. Insurance identifiers and health history go to the clinical system through the secure intake path. The platform's custom fields hold switches and statuses: member_id_on_file, coverage_status: not the underlying data.
  • Constrain the AI agent in writing. BO's instructions name what BO may discuss, name the escalation triggers, and fix the emergency response as literal copy rather than something generated in the moment. Review the full prompt with the compliance officer, re-review it whenever it changes, and sample real transcripts weekly for the first month.
  • Access, audit and retention. Least-privilege roles so the front desk sees what it needs and no more; two-factor on every account; a periodic access review when staff change; logging on who viewed and exported conversations; and a decided retention and deletion period for message threads, call recordings and form submissions.
  • Call recording needs its own disclosure and its own consent treatment, and the rules differ by state. Decide whether you record at all before you turn it on.
  • Breach and incident path. Know in advance who is told, in what order, when a message goes to the wrong number or a thread is exposed. Test it once so it is not being invented during the incident.

Scope and pricing

The number of locations, providers, service lines, calendars and integrations changes the build substantially, so this build is scoped per practice rather than priced off a list. Book a call and we will walk your actual intake path, your clinical system and your compliance constraints before quoting anything.

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