Utility Bill Processing: How AP Checks Every Site's Electricity, Gas and Water Bill Before It Pays
A utility bill looks like the easiest invoice in the queue: same vendor, same account, every month. That is exactly why it goes wrong. Nobody checks it, so a missed bill turns into a late fee, an estimated read runs for half a year, and a closed location keeps paying for power. This post covers how accounts payable can check every site's bill quickly, using nothing but the bill and the account's own history.
In brief
- Utility bills are recurring, non-PO invoices with no receipt to match, so the only control is checking each bill against the same account's history.
- The account number and service address identify the site; the service period, meter reads and usage are what make one month comparable to the next.
- An estimated read is not an error, but a run of them hides real usage and ends in a large catch-up bill; flag any account estimated two cycles in a row.
- Late fees, deposits and balances carried forward are the clearest sign a previous bill was missed, and they should be traced before the new one is paid.
- Utility cost should be accrued by service period at month end, because the bill for a month's usage usually arrives in the following month.
Why utility bills slip through AP
Utilities are non-PO invoices with no receipt. There is no purchase order to match the price and no goods receipt to confirm the quantity, so the usual three-way match has nothing to run against. The meter is the receipt, and only the utility reads it. Most AP teams therefore treat a utility bill as a payment to schedule, not an invoice to review, and route it through the same approval as any non-PO invoice.
The volume makes that tempting. A business with forty locations might have electricity, gas, water, sewer and waste service at most of them, which is well over a hundred accounts and a hundred bills a month, each from a different provider with its own layout. Bills arrive by mail to the site, by email to whoever signed up for the account, or on a provider portal that one person logs into. The cycle dates differ by account, so there is no single week when they all arrive.
The cost of not checking is not usually a single large error. It is a steady leak: late fees on bills that went to the wrong inbox, deposits charged after a missed payment, catch-up charges after months of estimates, and accounts nobody closed when a site moved.
6
utility bill exceptions covered in this post
5
checks run on every bill, from account to balance
7
steps in the checklist below
What to read from every bill
Every utility bill, whatever the provider and the layout, carries the same small set of facts. Reading them into the same fields is what makes one month comparable to the next and one site comparable to another.
- Account number and service address: which site the bill belongs to. The account number is the key; the address confirms it, because providers sometimes reissue account numbers when service changes hands.
- Service period: the start and end dates of the usage billed, and the number of days. This is not the bill date, and it is what an accrual and a comparison both need.
- Meter number, previous and current read, read type: whether the usage was measured or estimated. Providers mark an estimate with a code, a letter, or a line of text near the read.
- Usage and unit: kilowatt hours, therms, gallons or cubic feet.
- Charges by line: customer or fixed charge, supply or energy, delivery, riders, taxes, and anything unusual such as a late payment charge or a deposit.
- Previous balance, payments received, amount due and due date: whether the last bill was paid, and what must be paid now.
With these fields in a table, the checks below are simple comparisons. Without them, every check means opening a PDF and finding the number on a page that looks different for every provider.
Five checks that catch most problems
The account belongs to an active site
Keep a register of every utility account: account number, provider, service type, site and cost center, and the date service started or ended. A bill for an account that is not in the register, or for a site that closed, stops before payment. This is where a forgotten account at a vacated unit is found, along with bills addressed to the right company for a location it never used.
The service period follows the last one
Each bill's service period should start the day after the previous one ended. A gap means a bill is missing: it may be in someone's inbox, or it may never have been issued and will arrive later as a catch-up. An overlap means the same days are being billed twice, which happens when a provider reissues a corrected bill and the original was already paid. Both are cheaper to catch now than at year end, and an overlap is the utility version of a near-match duplicate invoice.
Usage per day is in line with history
Compare usage divided by the days in the service period, never the total, because cycles run from 27 to 35 days. Set it against the account's average for the last few months and against the same month a year ago, which accounts for heating and cooling seasons. A large jump at one site can be a meter fault, a leak, equipment left running, or a read that belongs to another meter.
The read is actual, or the estimates are not piling up
One estimated read is normal; the utility could not reach the meter. Two or three in a row means the bill no longer reflects real usage, and when an actual read finally arrives, the difference lands in a single bill. Flag any account estimated two cycles running and ask the provider for an actual read, or submit one from the site.
The balance carried forward is zero
A previous balance, a late payment charge or a new deposit on the bill is the provider telling you a payment was missed. Do not just pay the total. Trace the missed bill first: it was probably sent to an address AP does not watch, and the next one will go there too unless the delivery is fixed.
Estimated reads two or more cycles in a row
Late fee or prior balance carried forward
Service period gap or overlap
Account for a closed or unknown site
Rate or tariff changed on the bill
Duplicate of a bill already paid
A worked example: the catch-up bill
Take an illustrative electricity account for one warehouse unit. Usage runs at around 400 kilowatt hours a day through the first quarter. In April the utility cannot reach the meter and estimates the read, and it does the same in May and June, each time billing roughly the spring average. In those months the site added refrigerated storage, but nobody can see that on a bill built from an estimate.
In July the meter is read. The bill trues up three months of real usage against what was estimated, and usage per day jumps to more than 700 for that cycle before settling at a new, higher level in August. The catch-up is correct, but it arrives as a surprise in one month, the budget for the site is wrong for the whole quarter, and the accruals booked from April to June understated the cost.
The rule that would have caught it is the read-type check: by May, a second consecutive estimate would have prompted a request for an actual read, and the higher usage would have shown up two months earlier. Here is what the result for a similar bill looks like once the fields are read and the checks run.
{ "vendor": "regional electric utility", "account_number": "4410-228-917", "service_address": "1200 Commerce Way, Unit 4", "site_id": "site-017", "bill_date": "2026-10-06", "due_date": "2026-10-27", "service_period": { "start": "2026-09-03", "end": "2026-10-02", "days": 30 }, "meter": { "meter_number": "E-55102", "previous_read": 88214, "current_read": 101006, "read_type": "estimated", "usage_kwh": 12792 }, "charges": [ { "description": "Customer charge", "amount": 24.00 }, { "description": "Energy charge", "amount": 1279.20 }, { "description": "Delivery charge", "amount": 466.91 }, { "description": "Late payment charge", "amount": 38.50 }, { "description": "State and local taxes", "amount": 104.84 } ], "previous_balance": 1540.00, "payments_received": 0.00, "current_charges": 1913.45, "amount_due": 3453.45, "checks": [ { "check": "account_mapped_to_active_site", "status": "ties" }, { "check": "service_period_follows_previous_bill", "previous_end": "2026-09-02", "status": "ties" }, { "check": "usage_per_day_vs_trailing_average", "value": 426.4, "trailing": 418.0, "status": "ties" }, { "check": "read_type", "consecutive_estimates": 3, "status": "review", "hint": "Third estimated read in a row; request an actual read" }, { "check": "previous_balance_paid", "status": "review", "hint": "Prior bill of 1,540.00 unpaid; look for a missed or misrouted bill" } ], "requires_review": true}Usage per day is in line, so the comparison passes; the problems are the third estimated read and an unpaid prior balance with a late charge. Neither is a decision the extraction makes. They are rules the reviewer would apply by hand, run on fields instead of on a PDF.
Compare each bill with its own history
Accruing utilities at month end
The bill for a month's usage usually arrives in the next month, and service periods rarely line up with the calendar. If nothing is accrued, each month carries the cost of a period that ended weeks ago, and a month with a missing bill looks cheap. The fix is a per-account accrual for the unbilled days: take the daily cost from the most recent bill, multiply by the days between the end of its service period and month end, and reverse it when the next bill is recorded.
For example, if an account's last bill covered 30 days for 1,800.00, the daily cost is 60.00; with 29 unbilled days at month end, the accrual is 1,740.00. It is the same logic as a received-not-invoiced accrual, with the meter in place of the goods receipt. A bill whose service period crosses month end can be split by days the same way, which keeps site-level costs honest from one month to the next.
Utility bill processing: a checklist
- Keep a register of every utility account with provider, service type, site, cost center and start or end date.
- Route every bill, from mail, email and portals, to one intake address that AP can see.
- Read each bill into the same fields: account, service address, service period, meter reads, read type, usage, charges by line, previous balance and amount due.
- Stop any bill for an account not in the register or for a closed site.
- Check that the service period follows the previous bill with no gap or overlap.
- Compare usage per day with recent months and the same month last year, and flag two estimated reads in a row.
- Trace any late fee, deposit or prior balance before paying, then accrue unbilled days per account at month end.
Where extraction fits
None of these checks is hard. What makes them rare is reading a hundred bills a month from dozens of providers, each with its own layout and its own way of marking an estimate. Parser reads each bill into structured JSON against an extraction template you define, with the account, service period, reads and charges as fields, so the comparisons run on data and the team reviews only the bills that fail one. The post on extraction schema design covers how to type dates and amounts so those checks can run, and the solutions pages list the invoice types Parser handles today.