Am I doing work I’m not billing for?
You finished the project. You handled the extra requests. You answered the weekend emails. But did you ever send an invoice for all of it? Here's how to find unbilled work hiding in your business.
The short answer
Probably yes. If you deliver services, handle change orders, or do any kind of custom work, there is almost certainly work you completed but never invoiced. The only way to know is to compare what you did (tracked in your CRM, project tool, or time logs) against what you billed (tracked in your accounting software).
Unbilled work is the quietest way to lose money
You close a $12,000 project. Halfway through, the client asks for two extra deliverables. You say yes because you want to keep them happy. The project wraps up. You send the original invoice for $12,000. Those two extras? They were worth $3,200. You never billed for them and you never will, because by next week you have forgotten they happened.
This is not a billing error. It is a process gap. The work gets done, the client is happy, and you never realize you gave away 27% of the project value for free. Multiply that across every client, every month, and you are looking at tens of thousands in annual revenue that simply evaporates.
The problem is that the systems where work happens (your CRM, project management tool, email) are completely disconnected from the system where billing happens (QuickBooks, Xero). Nobody is cross-referencing them, so nobody catches the gap.
What unbilled work actually looks like in your systems
Unbilled work shows up as a mismatch between activity and invoices. Specifically, you are looking for:
- CRM deals marked “Closed Won” with no matching invoice. You won the deal in HubSpot or Salesforce, but there is no corresponding invoice in QuickBooks or Xero.
- Time logged against a client with no invoice for that period. Your team tracked 40 hours on a project last month. The invoice only covers 28.
- Completed projects or milestones with no final bill. The project is done, the deliverable was sent, but the last invoice never went out because everyone moved on to the next thing.
- Scope additions that were never quoted or invoiced separately. The client asked for extras during the engagement. You did the work. Nobody created a line item for it.
How to find unbilled work manually (step by step)
This requires pulling data from two or three systems and matching records by hand. Here is the process:
Step 1: Export your closed deals from your CRM
- 1In HubSpot: go to CRM → Deals
Filter by “Deal Stage” equals “Closed Won” and set the close date to the last 90 days. Click “Export” in the top-right and choose CSV. You will get a file with deal name, amount, close date, and associated company.
- 2In Salesforce: go to Reports → Opportunities
Create or open an Opportunities report filtered to Stage equals “Closed Won” with Close Date in the last 90 days. Click “Export Details” and choose CSV. You need the Opportunity Name, Amount, Close Date, and Account Name columns.
Step 2: Export your invoices from accounting
- 3In QuickBooks Online: go to Reports → Invoice List
Set the date range to the same 90-day period. Click “Export to Excel.” You need invoice number, customer name, amount, and date.
- 4In Xero: go to Business → Invoices
Filter to the same period, then click “Export.” Match column names: Reference, Contact, Total, and Date.
Step 3: Match deals to invoices in a spreadsheet
- 5Paste both exports into one spreadsheet
Put CRM deals in one sheet and invoices in another. Add a “Matched?” column to the deals sheet.
- 6For each closed deal, look for a matching invoice
Match by customer name and approximate amount. Customer names often differ between systems (“Acme Corp” vs “Acme Corporation Inc.”), so you will need to eyeball many of them.
- 7Flag unmatched deals
Any deal marked “Closed Won” with no corresponding invoice is potentially unbilled work. Total up the amounts. That is money you earned but never collected.
Total time: 45 minutes to 2 hours depending on volume. The matching is tedious because customer names rarely match exactly between your CRM and accounting software.
What it takes to check for unbilled work every month
This is not a one-time exercise. Unbilled work accumulates continuously. To stay on top of it, you would need to:
- Export from your CRM every month. Pull all closed-won deals for the period.
- Export from your accounting software every month. Pull all invoices for the same period.
- Manually match records across inconsistent naming. “Smith Consulting LLC” in HubSpot might be “Smith Consulting” in QuickBooks. You have to catch every variation.
- Track scope changes separately. Even if the original deal was invoiced, you need a way to flag and bill additional work. Most teams have no system for this.
In practice, almost nobody does this consistently. The friction is too high and the payoff is invisible until someone calculates the total.
Or let Bottomline find your unbilled work automatically
Bottomline connects to your CRM (HubSpot, Salesforce) and your accounting software (QuickBooks, Xero) and runs the match for you. Every month, it compares closed-won deals against issued invoices and flags the gaps.
No spreadsheets. No manual name matching. No exports. Bottomline handles the messy identity matching (“Acme Corp” vs “Acme Corporation”) and surfaces only the gaps that need your attention. You review the list, send the invoices, and collect the money you already earned.