What “delivered but not invoiced” means
Work was agreed or completed (a deal closed, a milestone reached, a retainer extended, a scope amended), but no invoice, or too small an invoice, reached the ledger.
It is rarely one large miss. It is usually many small ones, which is why it goes unnoticed while cash flow looks healthy.
Where unbilled work hides
- Amended statements of work: the CRM deal changes, but the invoice does not.
- Retainer overages: extra hours are approved by email and never reach billing.
- Milestones: the work is completed, but nothing triggers the invoice.
- Renewals and upsells: they are closed in the CRM but never raised in the ledger.
- Partial invoices: the first part is billed and the balance is never raised.
- Late closes: deals are marked closed-won after the billing run has already happened.
How to find it manually
- Export closed-won deals from HubSpot for a chosen period (for example, the last 60 days): deal name, company, amount, close date, deal ID.
- Export invoices from Xero for the same period plus a margin: invoice number, contact, reference, amount, date.
- Place both in a spreadsheet and add a shared key (invoice number or PO reference if you use one; otherwise company name plus amount).
- Match exact keys first, then customer and amount within a tolerance, then customer and date window.
- List every deal with no matching invoice, and every invoice with no matching deal.
- Review each exception: is it timing, a tax or currency difference, a partial invoice, or genuinely unbilled?
- Raise invoices for anything genuinely unbilled and record why it was missed.
Why the manual approach struggles at scale
- It is a snapshot, out of date the day after you run it.
- Names and amounts rarely match exactly (VAT, currency, rounding, naming differences).
- It depends on someone finding the time, usually at month-end under pressure.
- Checking a sample leaves most transactions unverified.
How Auditor Alpha helps
- Connects to HubSpot and Xero with read-only access in a couple of minutes.
- Reconciles the last 60 days of deals against invoices, then keeps checking every 2 hours.
- Flags each deal with no matching invoice, with the amount at risk, a confidence score and a suggested fix.
- Produces a shareable report so finance, delivery and account owners can all see the same findings.
- Never writes to your systems: your team decides what to bill.
Read more: How automated invoice matching works.
Illustrative example
A services firm closes a £14,200 milestone deal in HubSpot. The team delivers the work, but the invoice is never raised because the billing trigger sat in a spreadsheet. HubSpot shows “closed won”; Xero shows nothing. Direct ID matching finds no invoice reference, and semantic matching finds no invoice of a similar amount and date for that client. The deal is flagged as unbilled with £14,200 at risk.
All names and figures in this example are illustrative, not real customer data.
Frequently asked questions
How far back should I look?
Start with 60 to 90 days, then extend once your process is stable. The Health Check reviews the last 60 days.
Is unbilled work the same as unpaid invoices?
No. Unpaid invoices exist and await payment. Unbilled work has no invoice at all.
Who should own this?
Usually finance, with a monthly confirmation from delivery or account owners.
Can it be fully automated?
Detection can be. The decision whether to bill, and how, stays with your team.