AR aging & DSO
AR aging groups a contractor's unpaid invoices into buckets — current, 1–30, 31–60, 61–90, 90+ days past due — so you can see exactly how much money is owed and how overdue it is. Days Sales Outstanding (DSO) turns that into a single number: the average number of days between invoicing a job and getting paid for it.
The columns.
- Aging bucketsEvery open invoice grouped by age — current, 1–30, 31–60, 61–90, and 90+ days outstanding.
- DSO trendRolling days sales outstanding so you can tell whether collections are getting faster or slower.
- Drill-downBy customer, agreement, or branch, to isolate whether the balance is concentrated on a handful of accounts.
How the report works.
What the report shows
The AR aging & DSO report pulls every open invoice across your customers and service sites and sorts them by age. You see total dollars outstanding per bucket, which customers or agreements are driving the balance, and a rolling DSO trend so you can tell whether collections are getting faster or slower.
For a commercial or mechanical contractor running service agreements alongside project and T&M work, this matters more than it does for a one-off residential shop — agreement billing, milestone invoices, and multi-site customers all extend the collection cycle in different ways, and the aging buckets show you which one is the actual problem.
How Thermal builds the number
Thermal calculates AR aging directly from invoice and payment records that already live in the platform — there's no separate export or reconciliation step. Every invoice created from a work order, agreement billing cycle, or manual entry carries its issue date and payment status, so the aging buckets and the DSO trend line update as payments post.
Because Thermal runs beside your accounting system rather than replacing it, the report reflects what's actually been invoiced and collected in Thermal, and syncs with your accounting system so your books and your dispatch data don't drift apart.
Why DSO creeps up for service contractors
DSO rarely climbs because of one bad customer. It's usually a chain: a work order closes out but doesn't get invoiced for a week, the invoice sits for approval, a customer disputes a line item and the whole invoice stalls instead of just the disputed part, or a multi-site customer batches payment on their own cycle regardless of your terms.
The aging report exposes which link in that chain is slow. If most of the balance sits in 1–30 days, collections are healthy and the lag is in your own invoicing speed. If it's concentrated in 60+ and tied to a handful of accounts, it's a collections conversation, not a process one.
Turning the report into action
Aging by itself is a snapshot. The useful move is pairing it with time-to-invoice — how long a work order sits closed before it's billed — because that's the part of the cycle you control directly. Shortening time-to-invoice by even a few days compounds across every job and moves DSO down without changing a single customer's payment behavior.
Most shops run this weekly with whoever owns collections, flagging anything crossing into a new aging bucket before it becomes a write-off conversation.
See it live in Thermal
Thermal's AR aging & DSO report lives at app.trythermal.com/reports, alongside the rest of the operational reporting stack — agreement margin, callback rate, and SLA compliance all pull from the same live job and billing data, not a nightly export.
Questions about this report.
What counts as 'past due' in the aging buckets?
An invoice ages from its issue date, not its due date, so the buckets reflect total time outstanding. You can see both the raw age and how far past terms each invoice is.
Does AR aging replace what my accounting system already tracks?
No. Thermal syncs with your accounting system rather than replacing its ledger — QuickBooks Online sync is in early access; the Sage Intacct and Business Central adapters are on the roadmap. The report gives your operations team a live, job-connected view of the same balances your bookkeeper sees, without waiting on a sync cycle to check status.
Can I see DSO by branch or by customer segment?
Yes. Multi-branch operators can filter the aging report and DSO trend by branch, and by customer or agreement, to isolate whether a slow number is company-wide or specific to one book of business.
How is DSO different from time-to-invoice?
DSO measures the whole cycle from invoice date to payment. Time-to-invoice measures only the part before that — how long a completed job sits before it's billed at all. A contractor can have fast-paying customers and still carry a high effective collection cycle if time-to-invoice is slow.
These reports, on your own data.
If you want to see how they read on your branch's actual work orders and billing, that's a demo.