Sixteen free Open Dental queries

Read-only SQL for Reports > User Query. Free, no signup. Each one below is listed with the assumption it makes — which is usually the reason a report comes back wrong.

All sixteen on GitHubPaste into Reports > User Query and run. Nothing writes.

Every one is executed before it ships

Open Dental publishes its full database schema. A structure-only copy of it — 430 tables, no data — is rebuilt from that documentation and every query is run against it on every change, so a column your version does not have cannot quietly get through. The harness is verify.sh in the repository, and it takes a version number, so you can check these against yours.

The queries

Unscheduled treatment, in dollars

Answers: How much work have we diagnosed that nobody ever booked?

The trap: Deleted procedures carry ProcStatus 6 and are still in the table. Forget to exclude them and the number comes back inflated by work that was cancelled, sometimes badly.

New patients scheduled this month

Answers: How many genuinely new patients are on the books for this month?

The trap: Counting new patients by when they were seen answers a different question than counting by when they are booked. Marketing wants the second one.

New patients who left with nothing booked

Answers: Who came in, had treatment, and walked out without a next visit?

The trap: A patient can have a future appointment that is neither Scheduled nor ASAP. Check the status values you count as "on the books" or you will chase people who are already booked.

An appointment report with broken appointments actually excluded

Answers: What was on the schedule between these dates, for this provider?

The trap: AptStatus 5 is Broken. It is still a row in the appointment table, and most hand-written appointment reports silently include it.

Daily production goal against what is scheduled

Answers: Are we on pace today, against a figure we set ourselves?

The trap: Open Dental's built-in goal is hourly per provider. Most practices think in a number per day for the whole office, which is a different calculation.

Production by dentist, with hygiene rolled in

Answers: What did each dentist produce, including hygiene billed under their licence?

The trap: This is the associate-compensation number, and it is wrong unless hygiene production attributed to a provider rolls back onto the dentist it was billed under.

Payment plans as of a date

Answers: Principal, charged, paid and due — as of a date I choose, not today.

The trap: Aging a payment plan to an arbitrary past date is not the same as filtering by date. The charges that existed then are the ones that count.

Why future payment-plan charges are missing

Answers: The GUI shows a schedule my query does not return. Where is it?

The trap: On a dynamic plan those future charges are not data. Open Dental computes them for display and materialises a row when the charge falls due, which is also why the API's getExpected returns nothing.

Recall due, nothing booked

Answers: Who is overdue for hygiene and has no future appointment?

The trap: Recall rows carry a disabled flag and a sentinel date of 0001-01-01. Both have to go, or the list fills with people who were never on recall.

Insurance claims sent and still unpaid

Answers: Where is our money stuck, and how old is it?

The trap: Aged from the claim procedure date rather than the send date, because that is the date the carrier works from.

Accounts receivable aging by patient

Answers: Who owes us what, in 0-30 / 31-60 / 61-90 / 90+?

The trap: The Bal_0_30 columns on the patient table are not live. Open Dental writes them during the aging run. If aging last ran on the 1st, that is the date your report is really as of, whatever today is.

Collections by day and provider

Answers: What did we actually get paid, and who earned it?

The trap: Read the splits, not the payments. One payment can cover several patients and providers, and unearned prepayment will inflate a day unless you keep it in its own column.

Broken appointments, repeat offenders

Answers: Who keeps breaking appointments, and what did it cost us in chair time?

The trap: Chair time lives in the Pattern string — one character per five minutes — not in a duration column.

Case acceptance by provider

Answers: Of what each provider diagnosed, how much got done?

The trap: Measure it in dollars. One crown is not one sealant, so a count-based acceptance rate flatters whoever diagnoses a lot of small work.

Active patients not seen in 18 months

Answers: Who fell off entirely?

The trap: This is not the recall report. The recall report can only find people who had a recall row to go overdue in the first place; plenty of lapsed patients never had one.

Unused insurance benefits before the plan year closes

Answers: Who still has annual maximum left to spend before it resets?

The trap: Open Dental stores the annual maximum as a benefit row, and I could not verify from the public documentation which numeric BenefitType means Limitations — so this query does not hard-code it. It derives the maximum from your own data and prints the BenefitType it used, with a one-line query in the header to pin the value for your database.

If the number you want is not here

Ask for it — say what you want in plain English and include your Open Dental version. Real questions get written and added here, free. That is how most of the sixteen above came about.

If it is a big one and you would rather not wait your turn, I write these to order: $150 a query, tested, inside 48 hours. Delivered as a .sql file you run yourself, so no patient data leaves your office and there is nothing to sign. If it does not answer the question you asked, I fix it or refund you.