HubSpot is very good at telling you what sales has won. It says nothing about what happened next. Once a deal reaches closed won, the work moves into a job system, and the money eventually turns up in the accounts. Field service reporting in HubSpot therefore stops at the exact point where a service business starts spending money on the customer. This guide shows how to follow every won deal through to an invoice, which HubSpot objects to use, how to join them to jobs and invoices, and where quotes most often go missing on the way.
Why closed won is not the finish line
For a product company, closed won is close to the end of the story. For a contractor it is the start of a chain of hand-offs: sales to planning, planning to an engineer, engineer back to the office, office to finance. Each hand-off moves the record into a different system, and each system only knows its own part.
That creates four gaps nobody owns by default:
- Won but never set up. The salesperson marks the deal won and assumes operations saw the email. No job exists.
- Set up but never booked. The job sits in the job system with no visit, often because a survey, materials or an access date is outstanding.
- Done but never invoiced. The engineer closes the job; nobody raises the invoice, or it waits for paperwork.
- Invoiced short. A stage payment or a part of the scope is billed, and the balance is forgotten.
Each gap is invisible in HubSpot's own dashboards, because HubSpot already counts the deal as revenue won. It is also invisible in the accounts, because nothing has been raised. You only see it by lining up all three systems deal by deal.
The HubSpot records you need
HubSpot's CRM stores the commercial side as separate objects linked by associations. These are the ones a quote-to-cash report reads, described from HubSpot's own developer documentation.
- Deals. The Deals API guide shows
dealname,pipeline,dealstage,amountandclosedateas standard deal properties. It also warns that the API uses internal IDs for pipelines and stages, not the labels people see, so map stage IDs once rather than filtering on the word "won". Batch reads can return a property's history (propertiesWithHistory), which is how you find the date a deal actually moved stage. - Pipelines and stages. HubSpot's pipeline settings article lists closed won and closed lost in the default sales pipeline and treats won and lost as the closed outcomes. Many service firms run several pipelines (new installs, remedials, contract renewals), so check each one has its own won stage.
- Quotes. The Quotes API guide describes quote states including
DRAFT,PENDING_APPROVAL,APPROVED,REJECTEDandACCEPTED, with the state moving to accepted when the buyer accepts.hs_quote_amountholds the total. A quote links to one deal, and must have line item, contact and deal associations before it can be published. - Line items. The Line items API guide says each line item belongs to one parent object. A deal and its quote therefore carry separate sets of line items, which matters if someone edits the quote after the deal amount was set.
- Associations. HubSpot's associations guide describes how records link, including deal to company. A deal can be linked to more than one company, but only one can be the primary company, so report on the primary association.
HubSpot documents more than one API version for these objects, with different paths. Whichever you sync from, the object names and the properties above are what the report depends on.
The data model
Sources and fields
| System | Record | Fields the report reads |
|---|---|---|
| HubSpot | Deal | record ID, dealname, pipeline, dealstage, amount, closedate, stage history, a custom field for the job ref |
| HubSpot | Quote | state, hs_quote_amount, associated deal |
| HubSpot | Company (primary association) | record ID, name, your account number if stored |
| Job system | Job | job ref, customer account, HubSpot deal ID (custom field), created date, first visit date, completed date, job value |
| Accounts | Invoice and credit note | invoice number, date, net amount, reference field carrying the job ref |
The job system can be any field service platform with an API: see how this looks for Uptick, Simpro or ServiceMax. The principle is the same in each one: somewhere on the job there must be a field that stores the HubSpot deal ID.
Joins
| From | To | Key | What goes wrong |
|---|---|---|---|
| HubSpot deal | HubSpot quote | Quote-to-deal association | Several quotes per deal: report the accepted one |
| HubSpot deal | HubSpot company | Primary company association | Secondary companies double count if you join on all of them |
| HubSpot deal | Job | Deal record ID stored on the job | Jobs created by hand without the ID; fall back to company plus amount and have a person confirm |
| Job | Invoice | Job ref in the invoice reference field | Never join on invoice number: the job system's invoice number need not match the accounting system's |
| Invoice | Credit note | Credited invoice | A credited invoice is not billed until it is re-raised |
Formulas
| Measure | Formula |
|---|---|
| Win rate | won deals ÷ (won deals + lost deals), open deals excluded |
| Handover rate | won deals with a linked job ÷ won deals |
| Won to invoiced | net invoiced against won deals ÷ won deal amount |
| Leak value | won amount with no job + jobs with no visit + completed jobs with no invoice + (won amount − net invoiced) on part-billed jobs |
| Reconciliation | won value = invoiced + in flight + leaks + unconfirmed matches |
The reconciliation line is the test that keeps the report honest. If the four parts do not add back to the won value, a deal has fallen through a join and the report is wrong somewhere.
Quote-to-cash report · 5 November 2026
HubSpot + Job management system + Accounting system · Hallowmere Building Services (fictional)
£226,900 won in HubSpot.
£109,600 invoiced so far.
Quotes sent 1 July to 30 September 2026. Each won deal followed through the job system to the accounts, joined on the deal ID stored on the job and the job ref on the invoice.
- Win rate
- 51.6%
- 32 of 62 closed deals
- Won to invoiced
- 48.3%
- Invoiced ÷ won value
- Leaking
- £69,400
- 12 deals · 30.6% of won
- Still in flight
- £34,700
- 4 jobs booked, not done
Funnel by deal value
| Stage | Deals | Value |
|---|---|---|
| Quote sentHubSpot | 72 | £468,050 |
| Closed wonHubSpot | 32 | £226,900 |
| Job createdJob system | 28 | £191,000 |
| Visit bookedJob system | 25 | £181,450 |
| CompletedJob system | 21 | £146,750 |
| InvoicedAccounts | 17 | £109,600 |
Win rate 51.6%: 32 won ÷ (32 won + 30 lost). 10 deals still open are left out.
Where the won value is now
- Invoiced£109,600 · 17
- Booked, not yet done£34,700 · 4
- Won, no job created£22,700 · 3
- Job created, no visit booked£9,550 · 3
- Completed, not invoiced£32,500 · 4
- Invoiced below won amount£4,650 · 2
- Job with no deal link (review)£13,200 · 1
£109,600 + £34,700 + £69,400 + £13,200 = £226,900
Leaks, largest first
| Deal · job | Leak | Days | Value | Owner · action |
|---|---|---|---|---|
| Ravelston Hotels · Boiler replacement31840390844 · J-52363 | Completed, not invoiced | 69 | £14,100 | FinanceRaise invoice |
| Duncote Logistics · Fire alarm upgrade31840354136 · J-52334 | Job with no deal link | 62 | £13,200 | Sales adminConfirm match, then link |
| Pellbrook Self Storage · Fire alarm upgrade31840037226 · J-52128 | Completed, not invoiced | 52 | £10,350 | FinanceRaise invoice |
| Corvedale Housing · Access control install31840206338 · no job | Won, no job created | 98 | £9,600 | Sales to operations handoverCreate job and book survey |
| Quarrington Dental Group · CCTV install31840049170 · no job | Won, no job created | 55 | £8,850 | Sales to operations handoverCreate job and book survey |
| Harrowgate Lane Surgery · Sprinkler remedials31840125341 · J-52170 | Completed, not invoiced | 15 | £5,350 | FinanceRaise invoice |
| Duncote Logistics · Emergency lighting remedials31840158290 · no job | Won, no job created | 51 | £4,250 | Sales to operations handoverCreate job and book survey |
| Abberton Cold Chain · Sprinkler remedials31840259474 · J-52286 | Job created, no visit booked | 81 | £3,950 | PlanningBook first visit |
| Pellbrook Self Storage · CCTV install31840197814 · J-52244 | Job created, no visit booked | 60 | £3,250 | PlanningBook first visit |
| Ravelston Hotels · Access control install31840397196 · J-52376 | Completed, not invoiced | 28 | £2,700 | FinanceRaise invoice |
| Ravelston Hotels · Access control install31840240808 · J-52266 | Invoiced below won amount | 51 | £2,550 | FinanceInvoice balance or record reason |
| Marlcombe Retail · Sprinkler remedials31840136574 · J-52189 | Job created, no visit booked | 60 | £2,350 | PlanningBook first visit |
| Wrenfield Primary Federation · Emergency lighting remedials31840174778 · J-52219 | Invoiced below won amount | 69 | £2,100 | FinanceInvoice balance or record reason |
Days count from close date (no job), job creation (not booked) or completion (billing leaks). The probable match is a job for the same company and amount with no deal ID on it: listed for a person to confirm, not counted as a leak.
Worked example (illustrative, fictional)
Hallowmere Building Services is an invented fire, security and mechanical contractor. Its report on 5 November 2026 follows every deal that had a HubSpot quote sent between 1 July and 30 September.
Quote to win. 72 deals had a quote sent, worth £468,050. 32 were won, 30 lost and 10 are still open. The win rate is 32 ÷ (32 + 30) = 51.6%. Dividing by all 72 would give 44.4% and wrongly count open deals as losses.
Win to job. The 32 won deals are worth £226,900. Only 28 have a job carrying their deal ID, worth £191,000. The gap of £35,900 is three deals with no job at all (£22,700) and one job raised by hand for the same company and amount with no deal ID (£13,200). That one is a probable match for sales admin to confirm, so it is shown but not counted as a leak.
Job to visit. 25 jobs have a visit booked (£181,450). Three jobs worth £9,550 have none; the oldest has been waiting 81 days since it was created.
Visit to completion. 21 jobs are complete (£146,750). The other 4, worth £34,700, are booked and in progress. That is normal work in flight, not a leak.
Completion to invoice. Four completed jobs worth £32,500 have no invoice, including a £14,100 boiler replacement finished 69 days ago. The remaining 17 completed deals were worth £114,250 at their HubSpot amount, but only £109,600 has been invoiced: two were billed a stage payment and the £4,650 balance never followed.
The totals. Leaks are £22,700 + £9,550 + £32,500 + £4,650 = £69,400 across 12 deals, which is 30.6% of won value. Won to invoiced is £109,600 ÷ £226,900 = 48.3%. The check adds up: £109,600 invoiced + £34,700 in flight + £69,400 leaking + £13,200 to confirm = £226,900.
Read the funnel bottom up and the priorities are clear. Finance can recover £37,150 this week by billing four completed jobs and two balances. The £22,700 of deals with no job is a sales-to-operations handover problem, and the fix is a rule that a deal cannot sit in closed won for more than a few days without a job ID written back to it.
Who owns each leak
A funnel is only useful if every red number has a name next to it. Route each exception to the team that can clear it:
- No job: the salesperson who owns the deal and the planning lead. The deal owner is on the HubSpot record, so the list can go straight to them.
- No visit booked: planning. Show the days since the job was created, because a won job left unbooked for weeks is also a customer service problem.
- Not invoiced or part-invoiced: finance, with the completed date and job ref so they can raise it without looking anything up. Our field service KPIs template covers how to set targets for these lines.
- Probable match: sales admin, to confirm and add the missing deal ID so next week's join works without help.
Why the join breaks in practice
Most quote-to-cash reports fail on data hygiene, not on maths. The usual causes:
- The deal ID never reaches the job. If jobs are created by retyping the customer and scope, the only link is the company name and the value, which is weak. Writing the HubSpot deal ID into a job field at creation, by hand or through an integration, removes most of the guesswork.
- Deal amount and quote total disagree. Because line items belong to one parent, a revised quote does not automatically change the deal's own line items. Decide which number is the commitment (usually the accepted quote) and use it consistently.
- Stage labels change. Someone renames "Closed won" to "Won – awaiting PO" and a filter on the label silently drops every deal. Filtering on the internal stage ID avoids this.
- Contract work is mixed in. Renewals and planned maintenance are billed on a schedule, not per job. Put them in their own pipeline or flag them, then measure them separately.
- Credits are ignored. An invoice that was raised and then credited in full counts as billed unless credit notes are netted off.
Automating the report with IVP.ai
The IVP.ai Data Layer syncs HubSpot, your job system and your accounts into one governed warehouse, holds the joins and formulas above as tested definitions, and reruns the report on a schedule, so the reconciliation is checked every time rather than once a quarter. Deskless by IVP.ai can send each owner their own exceptions. By default it flags and drafts, and a person decides; it only takes actions such as raising an invoice if you configure it to.
This is the same pattern a national fire safety and security company used to bring HubSpot, Uptick and its finance spreadsheets into one governed view, saving 10+ hours a week on reporting (case study). Its renewal agents later ran on that HubSpot and Uptick data, and priced and reported on 100+ contracts in the first live run with no price changed without a person (renewals case study). See more on the platform and on field service reporting.
To see your own funnel, start a free 48-hour pilot. We connect up to three sources, such as HubSpot, your job system and your accounts, clean the data and have one report or agent running on your real data within 48 hours of read-only access. You then have 14 days of access to decide whether to choose a plan or walk away.