Using AI for Medical Billing: Spot Missed Charges From Visit Notes

Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Using AI for Medical Billing: Spot Missed Charges From Visit Notes.
Coding Liquids tutorial cover featuring Sagnik Bhattacharya for Using AI for Medical Billing: Spot Missed Charges From Visit Notes.

Compare your weekly list of completed visits with the charges billed for the same visits, in a spreadsheet, using internal visit numbers. Anything with no charge is a candidate. Then let AI read only the short procedures-performed text for each candidate and flag services documented without a matching charge. The owner or coder reviews every exception.

The two-step order matters. A spreadsheet finds whole visits that were never billed, which is the cheapest recovery. AI helps with the harder case: a visit that was billed for the consultation while the injection, the test or the extra time documented in the note was left off. Neither step needs a patient name.

Follow me on Instagram@sagnikteaches

The four ways a delivered service goes unbilled

Before you build anything, know what you are hunting. In a small practice, missed charges usually fall into four groups, and each needs a different check.

Connect on LinkedInSagnik Bhattacharya
  1. Whole visit, no claim. The appointment was marked complete but nothing reached billing. Usual cause: an encounter left open, a note unsigned, or a walk-in who was never registered.
  2. Add-on service missing. The consultation was billed, but a procedure, an in-house test, an injection, supplies or a drug given during the visit were not.
  3. Units or time short. Time-based services billed at fewer units than the note supports.
  4. Follow-up work with no charge. A telephone review, a form completed or a result discussion that your practice does charge for when it is done and documented.

The first group is a pure data match. The second and third need a rule that links wording in the note to an expected charge. The fourth depends on your own fee schedule. This tutorial deals mainly with the first three, because that is where AI adds something a spreadsheet cannot.

Subscribe on YouTube@sagnikteaches

Step one: the match that needs no AI

Export two lists for last week from your practice management system. List A is every visit marked completed: visit number, date, clinician code, visit type. List B is every charge posted: visit number, code, units, amount. No names. If your system's visit number is the patient's record number, create a separate sequence number in the spreadsheet instead, and keep the key to it private.

In a spreadsheet, add a column to List A that counts how many charges exist for each visit number:

=COUNTIF(ListB!A:A, A2)

Any row that returns 0 is a completed visit with no charge. Filter to those. For a six-clinician practice that saw 212 visits in the week, a typical illustrative result is 198 matched and 14 with no charge. Do not assume all 14 are errors. Write a reason beside each: no-show wrongly marked complete, free follow-up inside a global period, charity or research visit, internal meeting booked as an appointment, or genuinely missed. In this example nine of the 14 turned out to be genuinely missed and five were legitimately free.

For help building lookups like this, the ChatGPT and Excel guide shows how to ask for the formula and check it.

The Complete Excel Course with AI Integration thumbnail

The Complete Excel Course with AI Integration

From formulas and pivot tables to Power Query, DAX, VBA and AI with Copilot, ChatGPT and Claude — hands-on from the first lesson.

By Sagnik Bhattacharya and Virginia Thorn, Primetime Emmy Award winner

Buy now

Step two: the note-to-charge gap, where AI helps

Now take the 198 matched visits. Each one has a charge, but does the charge cover what was done? Export a third small column per visit: the "procedures performed" or equivalent field from the signed note. Use a structured field if you have one, not the free narrative. Trim any name, date of birth or phone number that a clinician typed into it, and keep the visit number as the only identifier.

Write your own expected-charge rules, in plain words, from the practice's usual habits. Ask your coder to confirm them. Illustrative examples (the codes named are standard procedure codes for these services, but verify every code, descriptor and bundling rule with your coder and your payers, because rules differ):

If the note documentsLook for a charge such asCommon reason it is missed
Injection given in clinicAn injection administration code (for example 96372, intramuscular or subcutaneous) plus the drug supply chargeDrug billed, administration forgotten, or the reverse
Blood drawn in clinicA venipuncture code (for example 36415)Treated as part of the consultation
ECG done and readAn ECG code (for example 93000, which covers the tracing plus the interpretation and report)Done by a nurse between patients and never entered
Dipstick urinalysisAn in-office urinalysis codeResult recorded in notes only
Wound closure or dressing with suppliesThe procedure code and suppliesSeen as part of a "minor" visit
Extended visit, time stated in noteThe time-based level or add-on your fee schedule allowsClinician documents it, biller bills the standard level

Give the AI the rules, the note fields and the charge lines, and ask it for gaps only:

I run a small medical practice. Below are (a) my expected-charge rules, (b) for each visit number, the "procedures performed" text from the signed note, and (c) the charge codes billed for that visit. No patient names are included.

For each visit, list any service that the note says was performed where none of the codes billed plausibly covers it, using my rules. Show: visit number, the exact words from the note, the rule that applies, and the codes billed. Do not suggest codes beyond those in my rules. Do not suggest a higher level of service. If a note is ambiguous, say "unclear" and quote it. Visits with no gaps should not be listed.

Illustrative output:

Visit 40817: note says "B12 injection given, tolerated well." Rule: injection requires administration code plus drug supply. Billed: consultation only. Possible gap: administration and drug supply.
Visit 40822: note says "ECG performed, normal sinus rhythm." Billed: consultation only. Possible gap: ECG.
Visit 40839: note says "bloods taken, sent to lab". Rule: venipuncture. Billed: consultation, lab handling. Unclear: handling code may already include the draw; check.

That third item is the kind of exception the owner must judge. The AI cannot know your payer's bundling rules, and it will sometimes flag something that is already included in another code. Treat every flag as a question for a human.

Main example: one week, start to finish

Here is an illustrative week for a six-clinician primary care practice, from export to recovered money. Fee figures are invented round numbers.

StageCountNotes
Completed visits in the week212From the schedule
Visits with no charge (spreadsheet)14List A with COUNTIF of zero
Legitimately free or non-clinical5Follow-ups inside the free period, one meeting booked as an appointment
Genuinely missed whole visits9Eight unsigned notes, one walk-in never registered
Visits where AI flagged an add-on gap17Of 198 matched visits
Confirmed after human review11Six rejected: bundled, or note unclear

Say the nine missed visits average $90 and the eleven add-ons average $28. That is 9 x 90 + 11 x 28 = 810 + 308 = $1,118 for the week, before payer adjustments, and before the usual denial rate. Do not multiply it by 52 and promise it as annual income; the first few weeks clear a backlog, after which the weekly figure drops as habits improve. The first run is also when you learn which gaps are a system problem: the eight unsigned notes pointed to a clinic rule that notes were signed on Fridays, so Thursday visits sat unbilled over the weekend.

Time-based services: counting units from the note

Time-based charges are a quieter leak. A therapist or physician documents "38 minutes face to face" and the biller, working from a template, posts the standard single unit. Whether 38 minutes supports one unit or two depends on the payer's time rules, so the AI should not decide it; it should surface the mismatch and quote the minutes.

For each visit below, extract any minutes stated in the note and the units billed. Using my unit table, mark each visit as: supported, minutes support more units than billed, units billed exceed what the minutes support, or unclear (no minutes written). My unit table is: 1 unit = 8-22 minutes, 2 units = 23-37, 3 units = 38-52. Quote the note's words. Do not infer minutes that are not written.

Illustrative result: "Visit 41102: note says 41 minutes of therapeutic exercise; billed 2 units; table supports 3. Visit 41117: note says 'about 30 mins'; billed 2 units; supported. Visit 41133: no minutes stated; billed 2 units; unclear." The unit table here follows one widely used convention for 15-minute timed codes, but payers do not all count time the same way, so confirm which rule each of your payers applies and put that table in the prompt. The third line is as valuable as the first, because an overbilled visit with no stated minutes is a compliance problem, and a reconciliation that only finds underbilling is half a check.

The same method in three kinds of small practice

The structure carries over, but the leaks differ, and your expected-charge rules should be written for your own work.

  • A four-clinician family practice. Add-ons dominate: injections, in-house tests, ECGs, minor procedures. The rule table above is a good start. In this illustration, 30 minutes a week recovers a handful of $25 to $35 items.
  • A two-therapist physical therapy clinic. Time and units dominate, plus modalities and re-evaluations. The unit-table check matters most, and the notes already carry minutes.
  • A small dermatology practice. Procedures with supplies and pathology handling dominate. A destruction or biopsy documented without a procedure code is the main leak, and supplies often go unbilled.

In each, start with the three most common services in your note templates, write a rule for each, and add more only when the log shows a recurring gap. Ten rules you trust beat sixty you never tested.

Clearing a backlog of unsigned notes

The first run often reveals a stack of encounters that were never closed. In the example week, eight of the nine missed visits were unsigned notes. Do not post charges from unsigned notes, and do not let the AI "complete" them. Instead export the list of open encounters by clinician code and age, ask the AI to group it, and send each clinician their own list:

From this list of open encounters (visit number, clinician code, visit date, days open), produce one section per clinician with the visit numbers, ordered oldest first, and a one-line count at the top. Add a final line showing the total open by age band: under 3 days, 3-7, 8-14, over 14. No other commentary.

Run this on Wednesday and Friday for a fortnight. Seeing their own count is often enough to get clinicians closing encounters, and if it works, the weekly number of whole visits missed falls without any other change.

A before-and-after for one front-desk change

Before: the nurse performs an ECG between patients, scribbles it on a slip, and the slip reaches the biller only if someone remembers. After: the visit template has a short "done in clinic" tick list (injection, ECG, blood draw, urine test, dressing), and the weekly check compares the ticks and the note. Gaps now show up as mismatches between two structured fields, which a spreadsheet can find without AI. This is the best outcome of the whole exercise: the AI check teaches you where to put a tick box, and eventually most of what it was finding can be caught by a form. Keep the AI step for the free-text notes that remain, and review the rule table every quarter.

Charge only what the note supports

A reconciliation tool can tip into over-billing if you are not careful, so set three rules and write them where the team will see them.

  • Documentation first. A charge may be added only if the signed note records the service. "Probably did an ECG" is not a charge.
  • No upcoding prompts. Never ask AI "what is the highest code I can bill for this visit". Ask whether a documented service has a charge.
  • Clinician confirms add-ons. If the note is ambiguous, ask the clinician and, where appropriate, have them add a dated addendum rather than editing the original.

For the audit side of this, see AI Medical Coding Software: Audit Trails and Upcoding Risk, and for the wider question of where human checks stay, Can AI Do Medical Billing and Coding? What Still Needs a Human.

Which tool, and what must stay out of it

Three safe setups exist for a small practice. The first is to do step one only, in a spreadsheet, with no AI. The second is to use a general AI tool on a business plan, with internal visit numbers, codes and the short procedures text only, after your data lead has agreed it and you hold a signed data agreement (in some markets called a business associate agreement). The third is a feature inside your practice management or billing software, covered by the vendor's agreement. What you never do is paste exports with names, insurer IDs or dates of birth into a consumer account.

A quick test before you upload: open the file and search for the letters of a few common surnames, for "DOB", for "@" and for runs of ten digits. If any hit, clean the file first. If you outsource billing, ask the billing company whether it already runs a charge-capture check and whether its tools are covered by the same rules, as covered in Outsourced Medical Billing or In-House AI Tools? A Decision Rule.

The owner's exception log

Every flagged item goes in a log with one of four outcomes: added, rejected, queried to clinician, or deferred. Illustrative entries:

VisitFlagOutcomeReason
40817Injection administration missingAddedNote documents drug, dose and site
40822ECG not billedQueriedTracing saved but signed interpretation report missing; clinician to add
40839VenipunctureRejectedIncluded in lab handling per payer contract
40844Time-based add-onAddedNote states 42 minutes, face to face

After a month, count rejections by reason. A cluster tells you something about your rules: if one bundling rule causes half the rejections, add it to the prompt so the AI stops flagging it. A cluster of "queried" items points to a documentation habit that clinicians can fix at the source.

A realistic mistake and what it cost

One practice, in this illustration, asked the AI to list "every visit where something may have been missed" and added charges straight from the list, without human review. In the next quarter the payer denied a block of claims for services that were bundled. The recovered charges were reversed, and the practice spent two weeks answering the payer. The fix was not a better prompt. It was the review step: nothing is posted until the owner or coder has seen the note line and the rule behind each flag.

A weekly routine that takes about an hour

  1. Monday: export lists A, B and the procedures field for the week just ended (10 minutes).
  2. Run the COUNTIF match and annotate the zero-charge visits (15 minutes).
  3. Run the AI gap check on the matched visits (5 minutes plus reading).
  4. Owner or coder reviews flags and updates the log (25 minutes).
  5. Post approved charges, send queries to clinicians, note deadlines (10 minutes).

Keep the filing deadlines of your main payers beside the log, because a charge found late may be unbillable, and the list of such expired items is a number worth tracking. For the claims that were billed but then denied, the process continues in AI Denial Management for Medical Billing: Group, Appeal, Track.

Telling the team without blame

A missed-charge report can feel like an accusation, especially to the nurse whose ECGs keep appearing on it. Frame it as a process finding. Share the weekly count by type, not by person, for the first month, and ask one question at the monthly meeting: what made this easy to forget? A slip left on a desk, a template without a tick box and an unsigned-note rule that waits until Friday are all system faults. After the first month, individual clinician lists are useful for the open-encounter clean-up, but keep the tone practical. People who feel policed will start documenting less, which is the opposite of what a reconciliation needs.

Also agree the amendment rule once, with your compliance lead: when a gap is genuine but the note lacks detail, the clinician adds a dated, signed addendum rather than overwriting the original. That keeps the record honest and makes the added charge defensible if a payer ever asks.

How you know it worked

Judge it by three numbers over eight weeks, not by one good week. First, zero-charge visits per week should fall towards the legitimate free ones. Second, AI flags confirmed after review should fall as clinicians and billers fix habits at source. Third, the share of flags you reject should fall as you refine the rules. If confirmed add-ons stay flat while clinicians change nothing, the check is finding the same leak weekly and you have a process problem to fix upstream, such as the charge entry screen being easy to skip or notes being signed too late.

Questions practice owners ask about missed-charge checks

Is this the same as coding the visit with AI?

No. Coding decides which code describes a service. This check only asks whether a service that the note documents has any charge at all. You are looking for gaps, not new codes, and a coder or clinician still decides what is billable.

Do I need to give the AI patient names?

No. Use an internal visit number and the codes. Names, dates of birth and insurer member numbers add nothing to a reconciliation. If you want AI to read note text, use only the short procedures-performed field, and only in a tool covered by a signed data agreement.

How often should I run it?

Weekly. Claims have filing deadlines that vary by payer, and a gap found in the same week is one the clinician can still remember and the note can still be amended. A monthly check finds the same gaps but recovers fewer of them.

Could this push us towards over-billing?

Only if you let it. The rule is that a charge may be added only where the signed note documents the service. Never ask the AI to suggest a higher-paying code, and keep the exception log so an auditor can see the reason behind every added charge.

Further reads

Sources: the visit counts, codes, fee levels and recovery figures in this tutorial are illustrative; confirm code definitions with your coder and filing limits with each payer.

Want a missed-charge check built into your week?

On a 1:1 call we'll map how visits move from the schedule to a claim in your practice, find where services slip through, and decide which part of the check can be automated.

Book a 1:1 call with me