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
| AutoVerify | Billing-Ins | |
|---|---|---|
| Who is it for? | Offices wanting routine verification | Offices where our team does the billing |
| Which appointments does it check? | Today and upcoming days — same calendar as Billing-Ins | Today and upcoming days (see calendar below) |
| When does it run? | 1am (full pass) + every 30 min during business hours | Once per day, early morning (3am) |
| What if something fails? | Leaves a note on the appointment saying it couldn't verify | No 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).
Possible results
When the insurance query could be made, there are three possible responses and they're the same for both services:
| Result | What it means | What to do |
|---|---|---|
| INS ACTIVE | Insurance is active. | Nothing, done. |
| INS INACTIVE!!! | The insurance responded that coverage is not active. | Talk to the patient before the appointment. |
| NO INS INFO | The 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):
| Case | What it means |
|---|---|
| Insurance didn't find the patient | Usually a data issue: name, date of birth, or member number wrong. |
| Query error | Technical failure on the insurance or intermediary side (Stedi). |
| Insurance not supported | That 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
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
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.
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 run | Appointment dates checked |
|---|---|
| Monday | Monday, Tuesday, Wednesday |
| Tuesday | Tuesday, Wednesday, Thursday |
| Wednesday | Wednesday, Thursday, Friday |
| Thursday | Thursday, Friday, Saturday and Monday |
| Friday | Friday, Saturday, Monday and Tuesday |
| Saturday | Saturday, Monday and Tuesday |
| Sunday | doesn'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):
| Trigger | Schedule | What it does |
|---|---|---|
| Billing-Ins | Every day at 3:00 AM, except Sunday | One clean early-morning pass, before the office opens — checks the multi-date calendar above. |
| AutoVerify — overnight | Every day at 1:00 AM | Full pass on the same multi-date calendar — catches everything loaded during the previous day. |
| AutoVerify — business hours | Every 30 minutes, from 8:00 AM to 6:30 PM, Monday to Saturday | Re-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. |
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 B1 | Effect |
|---|---|
TRUE | Normal — that product's trigger runs itself, as always. |
FALSE | That product processes no offices on the next automatic run (neither overnight nor, in AutoVerify, the 30-min ones) — skips everything, touches no appointments. |
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.
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?
| Place | What's there | Who uses it |
|---|---|---|
| Note on the appointment (Open Dental) | Result per plan, visible when opening the appointment | Office reception |
| INSURANCE field on the appointment | Summarized status, visible in the schedule | Office reception |
| Patient documents (Open Dental) | PDF receipt for each monthly verification | Office and our billing team |
| Google Sheets | Full history of all verifications for all offices | Our team |
| Escalation email (Billing-Ins only) | Patients needing manual review | Our 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:
| Row | Content |
|---|---|
| 1 | Product's master switch (trigger_active, cell B1) — see previous section. |
| 2 | Column headers (office_name, dev_key, ...). |
| 3 onwards | One row per office. |
Original PDF
This guide was generated from the PDF GUIA_AUTOVERIFY_Y_BILLING_INS.pdf. Open / download original PDF.
