ES
SOP-IT-007 · v1.0
Jul 3, 2026

Guide: AutoVerify & Billing-Ins

The two automatic insurance verification services · No technical background required
Who this is for: anyone on the team who needs to understand what the two automatic insurance verification services do. Conceptual guide — for technical implementation see also SOP-IT-006 (BCBOT/Dentrix) and SOP-IT-003 (Metrics).

What problem do they solve?

Before seeing a patient, the dental office needs to know if their insurance is active. Doing this by hand means calling the insurance or going into their portal, patient by patient, every day. Our two services do it automatically: they query insurance carriers through an official intermediary (Stedi, which connects to the US insurance network) and write the result directly in Open Dental, the system the office already uses.

There are two services because there are two types of clients with different needs:

Service comparison

AutoVerifyBilling-Ins
Who is it for?Offices wanting routine verificationOffices where our team does the billing
Which appointments does it check?Today and upcoming days — same calendar as Billing-InsToday and upcoming days (see calendar below)
When does it run?1am (full pass) + every 30 min during business hoursOnce per day, early morning (3am)
What if something fails?Leaves a note on the appointment saying it couldn't verifyNo note: sends an email to our team so a person resolves it

What they do, step by step

Every day, for each active office:

1Find the appointments for the target day

In the Open Dental schedule. Only look at confirmed appointments (ignore broken, tentative, or waitlisted appointments).

2Identify the patient's insurance

Primary plan and, if they have one, secondary. If the patient is a dependent (e.g. a child insured under the parent's plan), the query is built with the subscriber's data, which is what the insurance expects.

3Query the insurance (via Stedi)

Is this insurance active for dental care?

4Write the result to the appointment in Open Dental

As a note the reception staff sees when opening the appointment. If the patient has two plans, there's one line per plan, marked (primary) and (secondary).

5Save the PDF receipt issued by the insurance

In the patient's documents folder (Insurance Verification - BC), with the month and status in the name.

6Log everything in a Google Sheet

Which serves as the central history of all verifications.

No duplicate verifications

If a patient already has a receipt from this month saying insurance active, the system takes it as valid and doesn't query the insurance again (queries have a cost). With two plans, each is evaluated separately: if primary is already verified but secondary isn't, only secondary is queried.

Any other result — inactive, no info, error — is re-queried on the next pass, in case the situation changed (e.g. the office loaded the correct member ID, or the insurance reactivated coverage). But if the response is still the same as what we already recorded (still inactive), the system doesn't save a new PDF receipt or touch the note — it leaves it as is, to avoid accumulating duplicate receipts of the same result. It only writes a new receipt and note when the result changes (e.g. from inactive to active).

Especially important in AutoVerify which now queries several times a day — without this rule, dozens of duplicate PDFs would pile up per patient.

Possible results

When the insurance query could be made, there are three possible responses and they're the same for both services:

ResultWhat it meansWhat to do
INS ACTIVEInsurance is active.Nothing, done.
INS INACTIVE!!!The insurance responded that coverage is not active.Talk to the patient before the appointment.
NO INS INFOThe patient has no insurance loaded in Open Dental (or key data is missing, like member number).Load/complete the insurance in the chart; retried automatically on next pass.

Cases where the query couldn't be made

Aside from the three results, there are cases where the query couldn't happen — a data problem, an insurance problem, or a transaction problem. This is where AutoVerify and Billing-Ins behave differently (see flows below):

CaseWhat it means
Insurance didn't find the patientUsually a data issue: name, date of birth, or member number wrong.
Query errorTechnical failure on the insurance or intermediary side (Stedi).
Insurance not supportedThat insurance doesn't allow electronic verification (on our excluded list); requires manual verification.

In addition to the note, the system fills the appointment's INSURANCE field with the status, so it's visible at a glance in the schedule.

AutoVerify flow

No human intervention in the middle — every appointment it processes ends with a note written in Open Dental, whatever the result.
Appointment within the calendar of days (see table below)
        │
        ▼
Was the insurance query possible?
        │
   ┌────┴────┐
   │         │
  Yes        No (bad data / insurance not
   │             supported / technical error)
   ▼         │
Insurance active?     ▼
   │         Note on the appointment explaining the problem,
 ┌─┴─┐       for reception to resolve manually
 Yes No
 │    │
 ▼    ▼
Note:      Note:
INS ACTIVE INS INACTIVE!!!

Runs once early morning (1am), plus every 30 minutes during business hours. The frequent business-hours pass exists to catch a same-day appointment the office just loaded or moved — if it only ran overnight, that appointment could go unreviewed until the next day.

Checks the same multi-date calendar as Billing-Ins (see table below), so the office has time to react if insurance is inactive or data is missing. The difference between the two services is not which dates each looks at — it's when it runs and what it does if verification fails.

Always leaves a record on the appointment, even when verification failed: reception sees directly what happened and what's missing. No manual review on our side — that's why everything ends in a note, never an email.

Billing-Ins flow

Here there IS a person from our team in the middle: anything that can't be resolved automatically escalates via email, not as a note on the appointment. The only exception is when the patient has no insurance loaded — our team can't resolve that, so it does get a note for the office to load it.
Appointment today or upcoming days (see calendar)
        │
        ▼
Does the patient have insurance loaded in Open Dental?
        │
   ┌────┴────┐
   │         │
  Yes        No
   │         │
   ▼         ▼
Was the query    Note on the appointment:
possible?          NO INS INFO
   │              (office must load insurance)
┌──┴──┐
│     │
Yes   No  ← insurance didn't find the patient,
│     │      or not supported, or technical error
▼     ▼
Insurance  Escalates: NO note on the appointment.
active?    Goes into that run's escalation email,
│          with name, patient number and
┌─┴─┐      appointment date.
Yes No
│    │
▼    ▼
Note:      Note:
INS ACTIVE INS INACTIVE!!!

In plain terms: in Billing-Ins, anything that isn't "active", "inactive", or "no insurance loaded" gets escalated. That includes a one-off insurance error and an insurance that doesn't support electronic verification at all — both end in the same email, for a person to resolve manually.

One escalation email per office per run, with the full list of patients to review that day (not one per patient).

Calendar — which dates it checks each day

Runs once per day (except Sundays) and checks multiple dates at a time, with a calendar designed so no appointment goes uncovered even when weekends have no useful runs. This same calendar is used by AutoVerify too:

Day of runAppointment dates checked
MondayMonday, Tuesday, Wednesday
TuesdayTuesday, Wednesday, Thursday
WednesdayWednesday, Thursday, Friday
ThursdayThursday, Friday, Saturday and Monday
FridayFriday, Saturday, Monday and Tuesday
SaturdaySaturday, Monday and Tuesday
Sundaydoesn't run

Because each appointment is checked on multiple passes (e.g. Wednesday's appointment is checked on Monday, Tuesday, and Wednesday), a transient problem one day is fixed by itself the next — and with AutoVerify, which also runs every 30 minutes during business hours, it's fixed much sooner.

When does each one run? (triggers)

Both services run themselves, triggered by clock (Google Cloud Scheduler), with no one needing to run them manually. Times in US Eastern (America/New_York):

TriggerScheduleWhat it does
Billing-InsEvery day at 3:00 AM, except SundayOne clean early-morning pass, before the office opens — checks the multi-date calendar above.
AutoVerify — overnightEvery day at 1:00 AMFull pass on the same multi-date calendar — catches everything loaded during the previous day.
AutoVerify — business hoursEvery 30 minutes, from 8:00 AM to 6:30 PM, Monday to SaturdayRe-checks the same multi-date calendar over and over during the day — so if someone loads or moves an appointment mid-morning, it doesn't wait until the next early morning to be verified.
Why Billing-Ins runs once and AutoVerify runs often: Billing-Ins needs a single clean pass before the office opens, because what can't be resolved escalates via email to our team (we don't want escalations mid-workday). AutoVerify, on the other hand, resolves everything in the appointment note without our intervention, so it can — and should — run frequently throughout the day: the sooner the note is there, the sooner reception sees it.

Adding or removing an office from a trigger doesn't require touching the trigger. Each trigger hits the system with "run all Billing-Ins offices" or "run all AutoVerify" — the system builds that list by reading the Office Registry sheet at that moment, not a fixed list. Moving an office to a different tab (or deactivating it) is enough; no redeploy or Cloud Scheduler touching needed.

Turn off an entire product fast, without touching code or gcloud

If something's wrong and you need to stop all automatic runs of a product until you review it (e.g. tomorrow morning), you don't need to touch Cloud Scheduler or ask for tech help: in the Office Registry sheet, tab AutoVerify or BillingIns, cell B1 (at the top, before the list of offices) says TRUE or FALSE:

Cell B1Effect
TRUENormal — that product's trigger runs itself, as always.
FALSEThat product processes no offices on the next automatic run (neither overnight nor, in AutoVerify, the 30-min ones) — skips everything, touches no appointments.
Simple kill switch: Putting FALSE in that cell turns off the entire product until someone puts it back to TRUE — no special "the next day" reactivation flow, it's literally changing that cell back.
Important: this does NOT affect running a specific office by hand (e.g. to test something while the product is off) — it only turns off the automatic "all offices of this product" runs.

The "Field Guide" tab of the same sheet explains which valid values go in each cell of AutoVerify and BillingIns (including this one).

Where does everything get logged?

PlaceWhat's thereWho uses it
Note on the appointment (Open Dental)Result per plan, visible when opening the appointmentOffice reception
INSURANCE field on the appointmentSummarized status, visible in the scheduleOffice reception
Patient documents (Open Dental)PDF receipt for each monthly verificationOffice and our billing team
Google SheetsFull history of all verifications for all officesOur team
Escalation email (Billing-Ins only)Patients needing manual reviewOur team

How to add or configure an office

Active offices and their data live in a Google Sheet (the "Office Registry"), with one tab for AutoVerify offices and another for Billing-Ins ones. Adding an office is adding a row with its data; no system changes needed.

Each of those two tabs has this shape:

RowContent
1Product's master switch (trigger_active, cell B1) — see previous section.
2Column headers (office_name, dev_key, ...).
3 onwardsOne row per office.
The "Field Guide" tab of the same sheet lists, for each field, which values are valid and what they do. Consult it before adding new fields or changing values.

Original PDF

This guide was generated from the PDF GUIA_AUTOVERIFY_Y_BILLING_INS.pdf. Open / download original PDF.