Integrations

HubSpot to job to invoice: quote conversion reporting for service firms

HubSpot tells you what sales has won, but not whether that work was ever scheduled, completed or invoiced. This guide joins HubSpot deals and quotes to field service jobs and invoices so you can see, deal by deal, where won quotes leak before they become cash.

By Simon DuttonLast reviewed

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:

  1. Won but never set up. The salesperson marks the deal won and assumes operations saw the email. No job exists.
  2. 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.
  3. Done but never invoiced. The engineer closes the job; nobody raises the invoice, or it waits for paperwork.
  4. 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, amount and closedate as 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, REJECTED and ACCEPTED, with the state moving to accepted when the buyer accepts. hs_quote_amount holds 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.

IVP.ai / Data Layer

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

Deals and HubSpot deal value at each stage from quote sent to invoiced; the invoiced row shows net invoiced value
StageDealsValue
Quote sentHubSpot72£468,050
Closed wonHubSpot32£226,900
Job createdJob system28£191,000
Visit bookedJob system25£181,450
CompletedJob system21£146,750
InvoicedAccounts17£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

Won value split by where it sitsInvoiced: £109,600; Booked, not yet done: £34,700; Won, no job created: £22,700; Job created, no visit booked: £9,550; Completed, not invoiced: £32,500; Invoiced below won amount: £4,650; Job with no deal link (review): £13,200. Total £226,900.
  • 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

Won deals that have stalled between HubSpot, the job system and the accounts, with the value at risk and who should act
Deal · jobLeakDaysValueOwner · action
Ravelston Hotels · Boiler replacement31840390844 · J-52363Completed, not invoiced69£14,100FinanceRaise invoice
Duncote Logistics · Fire alarm upgrade31840354136 · J-52334Job with no deal link62£13,200Sales adminConfirm match, then link
Pellbrook Self Storage · Fire alarm upgrade31840037226 · J-52128Completed, not invoiced52£10,350FinanceRaise invoice
Corvedale Housing · Access control install31840206338 · no jobWon, no job created98£9,600Sales to operations handoverCreate job and book survey
Quarrington Dental Group · CCTV install31840049170 · no jobWon, no job created55£8,850Sales to operations handoverCreate job and book survey
Harrowgate Lane Surgery · Sprinkler remedials31840125341 · J-52170Completed, not invoiced15£5,350FinanceRaise invoice
Duncote Logistics · Emergency lighting remedials31840158290 · no jobWon, no job created51£4,250Sales to operations handoverCreate job and book survey
Abberton Cold Chain · Sprinkler remedials31840259474 · J-52286Job created, no visit booked81£3,950PlanningBook first visit
Pellbrook Self Storage · CCTV install31840197814 · J-52244Job created, no visit booked60£3,250PlanningBook first visit
Ravelston Hotels · Access control install31840397196 · J-52376Completed, not invoiced28£2,700FinanceRaise invoice
Ravelston Hotels · Access control install31840240808 · J-52266Invoiced below won amount51£2,550FinanceInvoice balance or record reason
Marlcombe Retail · Sprinkler remedials31840136574 · J-52189Job created, no visit booked60£2,350PlanningBook first visit
Wrenfield Primary Federation · Emergency lighting remedials31840174778 · J-52219Invoiced below won amount69£2,100FinanceInvoice 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.

72 deals with a quote sent · deal value from HubSpot amount, invoiced value net of VAT

Illustrative data

Illustrative, fictional data. Company, customers, deals, jobs and invoices are invented; not customer results or a live product screenshot.

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.

Questions

Frequently asked questions

Can HubSpot report on field service jobs on its own?

Only if the job data is in HubSpot. Most service businesses run jobs in a dedicated field service system and invoices in an accounting package, so HubSpot's reports stop at the deal. To see whether won work was booked, completed and billed, you need the job and invoice records joined to each deal, either by syncing them into HubSpot or by bringing all three systems into one warehouse.

How do I link a HubSpot deal to a job in our field service system?

Store the HubSpot deal record ID in a field on the job when the job is created, and ideally write the job reference back to a custom property on the deal. That gives an exact join both ways. Matching on company name and value is a fallback only: it misses jobs where the scope changed and can confuse two similar jobs for the same customer.

Should the report use the deal amount or the quote total?

Pick one and use it consistently. HubSpot line items belong to a single parent, so a deal and its quote hold separate line items and can drift apart after revisions. Many contractors treat the accepted quote's total as the commitment, because that is what the customer agreed to. Whichever you choose, show the other where they differ so sales can tidy the record.

What counts as a leak rather than normal work in progress?

A job that is booked and under way is in flight, not leaking. Leaks are won deals with no job, jobs with no visit booked, completed jobs with no invoice, and jobs billed for less than the won amount. Setting an age threshold for each, for example a won deal with no job after a week, stops the report flagging work that is simply new.

How often should we reconcile HubSpot against jobs and invoices?

Weekly is enough for most firms to catch stalled handovers before customers notice, and a daily run suits businesses with high job volumes or short payment terms. The important part is that each run checks that invoiced, in-flight, leaking and unconfirmed values add back to the won total, so a broken join shows up immediately.

About the author

Simon Dutton

Simon has more than 10 years of experience as a data scientist, working with start-ups, SMEs, Google and the CMA.

Last reviewed 6 November 2026.

Your first report or agent in 48 hours.

Tell us which systems feed it. We connect them, clean the data and set the report running automatically. If it isn’t useful, walk away.