1. Task Intake, Classification and Acknowledgement
Trigger: inbound SMS to the front desk number; Patient Request form submitted; Task Intake form submitted by staff; email arriving in the monitored shared inbox; inbound fax landing in the document drop; a call ending with no appointment booked and no outcome logged; web chat conversation closed without resolution.
Conditions and branches, in strict order:
- Urgency and clinical screen, before anything else. If the content matches the clinical lexicon. Chest pain, tight chest, cannot breathe, shortness of breath, bleeding, severe pain, fever, fainted, overdose, suicidal, self-harm, contractions, water broke, head injury, numbness, slurred speech, allergic reaction, emergency, 911, then: tag needs-clinician, set contains_clinical_detail true, route the item to the clinical queue and not to this board, notify the clinical line immediately, and send the fixed patient response: "I cannot help with medical questions by text. If this is an emergency, call 911 or go to your nearest emergency room now. For an urgent clinical question, call us on {{custom_values.clinical_line}}, a member of our clinical team will speak with you." End the workflow. No classification, no assessment, no appointment offer.
- Duplicate check. If an open task of the same task_type exists on the same contact created inside the last 72 hours, do not create a second one. Append a note to the existing task, increment a repeat counter, tag patient-waiting, and notify the current owner: "Patient has asked again about an open item. Call today." This single branch removes most of the practice's repeat-caller volume.
- BO proposes task_type from the content against the controlled list. If confidence is low, or the content maps to no type, file in Inbox with task_type Other and flag for human classification rather than guessing.
- Write sla_hours from the task type table and compute due_at in business hours only, skipping closures, weekends and practice holidays.
- Match to a patient record by phone, email or name plus date of birth where the inbound channel is authenticated. If no confident match, create the task against a placeholder and tag it for identity confirmation: never merge records on a guess.
- Branch on regulatory_clock. If the task type is Records Request, Complaint Intake, Amendment Request, Accounting of Disclosures or Subpoena: set regulatory_clock true, tag regulatory, move to the Records and Requests pipeline, notify the privacy officer, and suppress every automated patient message and chase. End.
- Otherwise, send the acknowledgement on the inbound channel with the SLA-derived timeframe: "Got it, {{contact.first_name}}. This is with our team and we will come back to you by {{task.due_at}}. If this is a medical question instead, please call {{custom_values.clinical_line}}." Stamp patient_informed_at.
- File in Inbox and start workflow 2.
Stop and exit conditions: clinical or urgency match, which exits to the clinical path; duplicate found, which updates rather than creates; regulatory type, which exits to the regulated pipeline. Nothing created by this workflow is ever auto-closed.
2. Assignment and Load Routing
Trigger: task enters Inbox, or a scheduled sweep every 15 minutes during opening hours.
Conditions and branches:
- Read the Front Desk Shift Calendar for the task's location at the current time to build the candidate pool. If the pool is empty, outside opening hours, leave the task in Inbox, set due_at from the next opening time, and exit.
- Filter the pool by role capability for the task type: billing items to staff with the billing role, authorizations to the authorization owner, records to the records owner. A task type with no capable staff on shift routes to the front-desk lead with the note "No capable owner on shift: assign or defer."
- Count each candidate's open items in Assigned - Today, weighting Urgent Administrative at three and Same Day at two. Assign to the lowest weighted count; break ties by who was last assigned, so the rotation is fair rather than alphabetical.
- Set owner, move to Assigned - Today if due_at is today or earlier, otherwise Assigned - Scheduled.
- Send one notification to the owner: "New item: {{task.task_type}}, due {{task.due_at}}, record {{contact.id}}." Task type, due time and record identifier only. No clinical content, no narrative.
- Every morning at 07:30, promote every task in Assigned - Scheduled whose due_at falls today into Assigned - Today, and send each owner a single digest rather than one notification per item.
- Reassignment branch: if an owner's shift ends with items still in Assigned - Today, those items are picked up by workflow 6 rather than silently expiring on an absent person's name.
Stop and exit conditions: task assigned; no staff on shift, which defers; task manually claimed by a staff member, which overrides the routing and logs who claimed it.
3. SLA Clock and Escalation Ladder
Trigger: scheduled, every 30 minutes during opening hours, across every task not in Done Today or Closed.
Conditions and branches:
- At 75 percent of the SLA window with first_touch_at still empty: tag sla-at-risk and nudge the owner: "{{task.task_type}} due in {{time_remaining}} and not started. Record {{contact.id}}."
- At due_at with the task incomplete: tag sla-breached, set escalation_level to 1, move to Escalated, and notify the front-desk lead: "SLA breached: {{task.task_type}}, owner {{task.owner}}, {{hours_over}} hours over."
- Four business hours past due_at: escalation_level 2, notify the practice manager, and reassign to the front-desk lead so the item has a fresh owner rather than a stale one.
- One business day past due_at: escalation_level 3, notify the practice manager and the practice owner, and create a review task "Why did this sit for a day?" The escalation is on the process, not the person; a high level-3 count means the SLA table is wrong or the desk is understaffed.
- Patient-update branch, independent of the SLA: if patient_informed_at is more than 3 business days ago and the task is not complete, send one status message: "Quick update, {{contact.first_name}}: your {{task.task_type_patient_label}} is still in progress. We are waiting on {{task.blocked_reason_patient_label}}. I will update you again by {{next_update_due}}." Use a patient-facing label from an approved non-clinical list, never the raw internal note. Restamp patient_informed_at.
- Urgent Administrative branch: SLA window is four business hours, the at-risk nudge fires at two, and escalation goes straight to level 2 on breach.
- Regulatory branch: items with regulatory_clock true do not use this ladder. They get their own countdown against the deadline in the practice's documented procedure, with notifications to the privacy officer at the intervals that procedure specifies, and they are never auto-messaged or auto-reassigned.
Stop and exit conditions: task completed; task moved to a Waiting stage, which pauses the SLA clock and starts the chase clock instead; task closed by the manager with a documented reason. The SLA clock must pause while genuinely blocked or the breach figures become meaningless and staff stop trusting the board.
4. Third-Party and Patient Chase Cadence
Trigger: task enters Waiting on Third Party, Waiting on Patient or Waiting on Clinician.
Conditions and branches by blocked_reason:
- Awaiting Payer: wait 2 business days from blocked_since. BO drafts a call script with external_party, external_reference and the patient record identifier prefilled, and creates a task on the owner: "Chase {{task.external_party}}, ref {{task.external_reference}}." On Blocked Item Update submission, increment chase_count and reset blocked_since. Repeat at 2, 4 and 7 business days. At chase_count 4, tag chase-exhausted, escalate to the practice manager, and create a task "Decide: escalate with the payer, appeal, or convert to self-pay conversation with the patient."
- Awaiting External Office (referring practice, imaging center, pharmacy): same cadence at 1, 3 and 6 business days, since these usually answer faster and matter more to the patient's timeline.
- Awaiting Clinician: wait 1 business day, then notify the clinician directly: "{{count}} items waiting on you. Oldest {{days}} days. {{queue_link}}." Repeat daily. At 3 business days, escalate to the practice manager, because a clinician queue that is backing up is a capacity problem the desk cannot fix.
- Awaiting Patient: wait 2 business days, then send "Hi {{contact.first_name}}, still need one thing from you to finish this off: {{requested_item_label}}. Reply here or call us on {{custom_values.front_desk}}." Repeat at 5 days and at 9 days, then stop. At chase_count 3, tag chase-exhausted and create a task "Close with a documented note or make one phone call." Three messages is the cap; a fourth is harassment and will produce an opt-out.
- Awaiting Supplier: weekly chase, no patient messaging, escalate to the practice manager at 3 chases.
- Unblock branch: when blocked_reason is cleared, move back to Assigned - Today, restart the SLA clock with the remaining window, and notify the owner: "Unblocked: {{task.task_type}}, record {{contact.id}}."
Stop and exit conditions: unblocked; chase cap reached; task closed with a documented reason; regulatory_clock true, which is excluded entirely. Patient-facing chase messages use approved non-clinical labels and never name a condition, test, medication or specialty.
5. Recurring Operational Task Generator
Trigger: scheduled, by recurrence rule.
Actions in order:
- Daily 07:15: create Verify tomorrow's insurance eligibility; Confirm today's unconfirmed appointments; Clear the overnight voicemail queue; Clear the overnight fax drop; Check the shared inbox. Each with an owner derived from the shift calendar and a same-day due time.
- Daily 16:30: create Reconcile today's co-payments and Confirm tomorrow's interpreter and mobility-assist bookings.
- Weekly Monday 07:30: create Review authorizations expiring in 30 days; Review the referral-out log for items with no response; Audit the waitlist for stale entries.
- Weekly Friday 15:00: create Review every open item over 10 days old with the front-desk lead.
- Monthly first business day: create Reconcile outstanding records requests against the regulated log with the privacy officer; Review opt-out and bounce lists; Verify every staff account on the board still belongs to a current employee.
- Any recurring task not completed by end of day is carried by workflow 6 and counted separately in the weekly report. Recurring tasks that are chronically carried are either unnecessary or under-resourced. The report is what tells you which.
Stop and exit conditions: none; these regenerate. Suppress generation on practice closure days read from the shift calendar, so the board does not fill with phantom work over a holiday.
6. Shift Handoff and End-of-Day Sweep
Trigger: scheduled at each shift boundary read from the Front Desk Shift Calendar, plus a closing sweep 30 minutes before close.
Actions in order:
- Compile the handoff: every item in Assigned - Today not completed, split by first-touched and never-touched; everything in Escalated; every blocked item whose next patient update is due today or overdue; every item in Inbox.
- Post the handoff to the front desk's internal channel and email it to the incoming and outgoing coordinators. Task types, due times, record identifiers and owner names only. No clinical content in a handoff that lands in a chat tool.
- Reassign carried items to the incoming coordinator, tag them handoff-carried, and preserve the original owner in a note so the weekly report can see who started what.
- Create the Shift Handoff Confirmation task on the incoming coordinator, due 15 minutes after shift start. If it is not submitted within 30 minutes, notify the front-desk lead. Handoffs that are not acknowledged are handoffs that did not happen.
- Closing sweep: force-assign everything still in Inbox to the closing coordinator; list every never-touched item from today by owner in the manager's evening summary; surface every item in Waiting on Patient with no patient contact in 5 days for a close-or-chase decision; and enable the after-hours SMS auto-reply.
- Branch: if more than the practice's agreed threshold of items are carried in one day, add "ACTION: desk was underwater today: review staffing or intake volume" to the manager's summary. One bad day is noise; the same line three days running is a staffing finding.
Stop and exit conditions: handoff acknowledged; practice closed. Regulated items appear on the handoff as a count with a pointer to the regulated pipeline, never with their content.
7. Reopen Detection and Loop-Closure Check
Trigger: inbound patient message, call or form on a contact with a task closed in the last 14 days.
Conditions and branches:
- Match the new contact against recently closed tasks by task_type and keyword. If it corresponds to one, create a new task, tag it reopened, link it to the closed task, and assign it to the original owner so the person who closed it sees the consequence.
- Notify the front-desk lead: "Reopened: {{task.task_type}}, closed {{days}} days ago, record {{contact.id}}."
- Set priority to Same Day regardless of the type's default. A reopen is a failure the patient has already paid for in time.
- Send the patient "Sorry, {{contact.first_name}}, that should have been finished. I have put it back with {{task.owner_first_name}} and you will hear from us today."
- Loop-closure sweep, weekly: query every task closed in the last 7 days where patient_informed_at is earlier than completed_at. That is, the work finished but nobody told the patient. Create a task per item: "Close the loop: tell the patient this is done." This is the single most common failure on a front desk board and the cheapest to fix.
Stop and exit conditions: reopened task completed; no match found, in which case the item flows through workflow 1 as new. Reopen count is a quality metric, not a disciplinary one; report it by task type first and by owner second.
8. Daily Queue Report and Weekly Throughput Rollup
Trigger: scheduled daily 07:00 and 17:45, plus Monday 07:30.
Actions in order:
- Morning report to every coordinator on shift and the front-desk lead: your items due today, your items overdue, your blocked items needing a chase today, and the count still in Inbox. Ordered as a work list, not a dashboard.
- Evening report to the front-desk lead and practice manager: created today, closed today, carried, never-touched by owner, SLA breaches by type, escalations opened, reopens, and the oldest open item on the board with its age in days.
- Branch: if any item is older than 14 days and not regulated or blocked, add "ACTION: this is abandoned: close it or own it" and name it.
- Branch: if any owner has more than the agreed cap of open items in Assigned - Today, add "ACTION: redistribute {{owner}}'s queue". An overloaded owner is how a board silently stops working.
- Monday rollup to the practice manager: volume by task_type and source_channel; median and 90th-percentile first-touch time; median cycle time by type; SLA breach rate by type and by owner; chase-exhausted count by external_party, which tells you which payer or office is the actual bottleneck; reopen rate; recurring tasks carried; and the age distribution of everything still open.
- Create a task on the practice manager: "Pick the one task type with the worst breach rate and change its SLA, its owner, or its process. Record which." A report nobody acts on is a report worth canceling.
Stop and exit conditions: none. All reports carry aggregate figures and record identifiers only; no clinical detail travels in a routine internal report.