Revenue systems for home services
Service work, replacement and install work, and recurring maintenance agreements all arrive through the same front door — one phone number, one website — and then diverge into systems that were never built to reconcile with each other: a dispatch board, an estimate object, a recurring billing schedule. The structural loss sits at both ends of that path. At the front, an inbound contact becomes revenue only if something writes a record; where the overflow, after-hours or web-booking path is wired to notify a person rather than to open an object, the demand exists as a message and never as a job. At the back, a job closes in a driveway days or weeks after the click that started it, and where no shared identifier travels between the invoice and the ad account, the revenue never reaches the surface that decides what to bid on. Google's Local Services Ads ad-ranking documentation makes the front end a paid-visibility question as well as an operational one, because it names a business's responsiveness among the inputs to placement in that paid product.
Who this is for
Written for residential trade contractors running a field service management platform with a dispatch board, a phone queue answered by CSRs or an outside answering service, a website that takes bookings or service requests, and a replacement or install line quoted in the home. The revenue path runs from an inbound contact, through a dispatched work order, to an estimate written on site and an agreement billed on a schedule.
How revenue is actually made
Revenue arrives on lines with different physics that share one front door. Demand-capture service work bills as a dispatch or diagnostic fee plus the repair, and its unit of revenue is a completed work order. Replacement and install work — systems, panels, water heaters, repipes — is quoted in the home as an estimate object, and its ticket is set by equipment and scope rather than by labor time; where financing is offered, the approval decision sits in a provider portal outside the field service management platform. Maintenance agreements, also sold under the name memberships, bill on a recurring schedule and are the only line producing an owned demand base rather than purchased demand. What compounds over time is whether agreement status, equipment age and prior technician findings are recorded as fields rather than as notes, because only a field can be selected against. Revenue is also capacity-bound: a booked job the schedule cannot serve inside the window the homeowner will wait does not become revenue.
Where demand comes from
- Google Local Services Ads in enumerated home-services categories
- Google Search and Performance Max campaigns
- Google Business Profile and the local pack
- Shared-lead marketplaces and lead-resale networks
- Manufacturer dealer-locator listings and utility rebate contractor lists
- Home warranty networks and property-manager contracts
- The past-customer database and the maintenance-agreement base
Revenue-leak map
Each entry names the system the leak lives in, the configuration in which it exists, the evidence that would confirm it, and what still cannot be concluded once you have that evidence. None of it is a claim about any particular business.
-
Overflow and after-hours contact that terminates in a notification
Calls arriving outside dispatch hours, or overflowing a staffed queue, are routed to voicemail or to an answering service, and website service requests are posted by the form handler. Both answering services and form tools are sold in configurations that include a write path — an API, a webhook or a native connector that opens a customer, lead or job record. When that write path is configured, the inbound contact exists as an object the dispatch queue can see. Wherever the integration is instead an email or SMS notification, the contact exists as a message in an inbox and a row in a vendor log, and the field service management platform holds nothing at all, so the inquiry is absent from the dispatch queue and from every pipeline report built on that platform.
- where it lives
- The integration setting on the answering service and on the website form handler that decides whether their output is a notification or a write, and on the platform side, whether an inbound contact can exist as a record before a person re-keys it.
- what would confirm it
- Export the carrier or call-tracking call detail record for a period and filter to calls that ended without connection. Export the answering service's message log and the website form handler's submission log for the same period. Then attempt to match each caller number and each submitted phone number against customer, lead and job creation timestamps in the field service management platform, and record which of the inbound paths produced records and which produced only messages.
- what it still cannot show
- A message log is an answering-service operator typing to a script, so it evidences what the operator recorded rather than what the homeowner wanted. A message with no matching record does not establish that work was lost — the homeowner may have redialled during business hours and been booked before anyone read it. A message that does match a record does not establish that the service produced the booking either: the match is temporal, and nothing in the join carries who acted on it.
-
A booking-rate denominator assembled from connected calls only
Where the booking report is built from calls that reached a CSR — the state of a platform that learns about a call only when someone opens a record while on the phone — calls that abandoned in queue, rang out or arrived outside dispatch hours are absent from the denominator. When the platform ships integrated telephony, or where a call-tracking integration writes an inbound call event against a contact, those same classes do land in the platform and are available to the report. In the first configuration the ratio does not fall when capture fails: the calls that fail leave the numerator and the denominator together, so the reported figure can hold steady or rise while less of the demand arriving at the number is converted into work.
- where it lives
- The metric definition behind the booking or conversion report in the field service management platform — specifically which inbound population that platform was ever told about, which is settled by the telephony integration rather than by the report builder.
- what would confirm it
- Recompute the ratio with a denominator built from the phone system's total inbound count for the same window, including abandoned, rung-out and after-hours calls, deduplicated by caller number so repeat dials from one household collapse into a single inquiry. Publish the recomputed figure beside the platform's stock booking report rather than instead of it; the gap between the two is the finding.
- what it still cannot show
- A wider denominator changes the number without explaining it. It cannot separate coverage from routing, hold-time tolerance from intent, or an understaffed queue from an IVR that was too deep, because a call log carries a duration and a disposition and no reason. Nor does the recomputed ratio establish what the missing calls would have been worth: the log has no field for job value.
-
Missed calls priced into the ad account rather than the dispatch board
Google's Local Services Ads ad-ranking documentation lists a business's responsiveness to customer inquiries among the factors feeding ad rank, and beneath that bullet states that missed calls may negatively affect responsiveness; average response time is named separately among profile-quality factors. That is placement inside a paid product, not organic local ranking. Where the phone system's answered and missed series is placed on the same timeline as the profile's lead-delivery report, a coverage gap and a delivery movement can be read as one event. Where the two series are never brought together, the operational cause and the commercial symptom are read on separate surfaces, and the remediation that gets bought is a budget change in the ad account.
- where it lives
- Between the phone system's reporting surface and the Local Services Ads profile's ranking inputs — two systems with no shared record, no shared identifier and, unless someone builds one, no shared report.
- what would confirm it
- Line the phone system's answered and missed counts up by day and by hour against the Local Services Ads lead-delivery report, charged-lead counts and any budget changes made in the same window, and add whatever responsiveness and response-time indicators the profile exposes. Then overlay license and insurance document expiry dates, because a verification lapse produces the same shape in a lead report.
- what it still cannot show
- Google publishes the named factors and not their weights, so co-movement between answer rate and delivery cannot be read as the documented mechanism operating at any particular strength. The documentation describes placement inside that paid product and is not evidence about the organic local pack. And the profile's own indicators are computed by Google on a definition it does not publish, so they cannot be reconciled against phone-system counts row by row.
-
Website bookings that arrive without the session that produced them
A homeowner books or requests service through a scheduling widget on the site. When that widget is served from a vendor iframe or a vendor-controlled subdomain, the campaign parameters and click identifier belong to the parent page and are not part of what the widget posts, so the job created in the field service management platform carries the widget's own name as its source and the entire website collapses into a single source value. When the widget is configured to receive the parent page's parameters into hidden fields that map onto job fields, the same booking arrives with its origin attached. Both configurations produce an identical row on the dispatch board and different rows in every channel report.
- where it lives
- The embed boundary between the online scheduling widget and the job record — the hidden-field map on the widget, and the source field on the job that either receives a channel value or receives the widget's name.
- what would confirm it
- Read the booking page's markup to establish whether the widget is same-origin, an iframe or a vendor subdomain, and which hidden fields it posts. Then export every job created through it for a trailing window with its source field and any campaign, keyword or click-identifier field, and see how many distinct source values the whole website produced.
- what it still cannot show
- A single source value does not reveal what sits underneath it, and configuring the parameter carry forward does not recover bookings already taken — a backfill has no key to run on. Even a job that does carry a campaign parameter proves only what the browser held at submission: it does not establish which touch the homeowner acted on, and a homeowner who researched on a phone and booked on a desktop presents as an untagged direct booking under either configuration.
-
Financing decisions held in the provider portal, absent from the estimate
A consumer financing application is submitted through the provider's portal or a link sent to the homeowner, and the decision and approved amount are written into the provider's system. Some providers publish a callback or an application-status endpoint, and where one is configured the decision lands on the estimate as a field. Where no write-back is configured, the estimate record in the field service management platform holds no approved-amount field, so the option set the homeowner actually qualified for is not available to whoever picks the conversation up next.
- where it lives
- The handoff between the consumer financing provider's portal and the estimate or proposal object inside the field service management platform, and specifically whether a decision field exists on that object at all.
- what would confirm it
- Pull the financing provider's application report for a period, match applicant name and service address against estimate records, then inspect the matched estimates for any field carrying the decision, the approved amount or the application date — including custom fields, not only the stock ones.
- what it still cannot show
- Matching applications to estimates does not establish that a written-back approval would have changed the outcome. It also cannot see applications the homeowner began on a phone in the driveway and abandoned before the provider logged them, or a decision the homeowner received by email and never mentioned to anyone.
-
Technician findings held as prose rather than as deficiency attributes
A technician records an observation — a low capacitor reading, corroded piping, an aging panel — while closing the work order. When the platform exposes a deficiency object, an equipment record or typed custom fields and they are configured, that observation becomes an attribute a list can be filtered on. Where the only place to put it is the job or invoice note, it is stored as prose, and prose is not selectable: no segment can be built from it and no sequence can be triggered by it, however accurate the observation was.
- where it lives
- The free-text note fields on the job, invoice or work-order record, and the configuration decision about whether a typed deficiency or equipment object exists alongside them.
- what would confirm it
- Take a sample of completed jobs, read the note fields, then attempt to rebuild the same information as a filterable list — equipment type, observed condition, recommended action — using only the platform's report builder and its custom fields. Record which attributes could not be selected at all, and which existed as fields but were left empty.
- what it still cannot show
- That an attribute cannot be selected says nothing about whether the observation was correct, whether the homeowner was told about it on site, or whether a structured record would have changed the purchase decision. Empty structured fields are ambiguous in their own way: a blank severity field does not distinguish a technician who skipped it from equipment with nothing wrong.
-
Completed invoice value that never reaches the bidding surface
The click, the call and the invoice sit in different systems, and the revenue event happens in a driveway days or weeks after the click. Where the platform's advertising integration or a middleware job carries a job or invoice identifier back as an offline conversion, the value of completed work reaches the bidding surface. When it does not, the ad platform optimizes against lead count — a unit that treats a service call and a system replacement as the same event — so every bidding decision is made on a quantity rather than on what the quantity contained.
- where it lives
- The gap between the invoice and job records in the field service management platform and the ad platform's conversion import, with call tracking sitting unjoined between them.
- what would confirm it
- Export closed invoices with job identifiers for a window, export the call-tracking session and click-identifier log, and attempt the join. Then compare the resulting revenue-by-source table against the ad platform's own reported conversions for the same window and record where the two disagree.
- what it still cannot show
- The two tables will not reconcile cleanly, and the residual is not all leakage. Google's consent mode documentation states that where users deny consent for storage, tags send measurements without cookies and Google products use those pings to model metrics, so part of what the ad platform reports is modeled rather than observed. The join also cannot attribute a replacement sold on a second visit to the campaign that produced the first call unless both jobs carry the same customer key.
Operational flow and systems of record
The path from demand to revenue, and which system holds the truth at each step. The boundaries between them are where state has to be handed over, so they are where this page looks.
- Inbound call, form or online booking Phone system or call-tracking platform, the answering-service message log, and the website form or booking widget handler
The inbound paths write to different places, and only some of them write to the platform the dispatch board reads. A connected call becomes a customer record where the CSR opens one; an abandoned, rung-out or after-hours call leaves a call-log row; a widget submission becomes a job where the widget holds platform credentials, and a notification where it does not.
- CSR intake and booking Field service management platform customer and job records
The source captured at intake is whatever the CSR selects from a dropdown while a homeowner waits. When that field is optional, defaults to a single value, or offers options that no longer match the live channel mix, the job carries a source attribute no downstream report can trust.
- Dispatch and scheduling Dispatch board in the field service management platform
Where the board is full, the job is booked into a later window. Wherever the platform stores only the final scheduled date, the date the homeowner originally asked for is not retained, so a job abandoned because the wait was too long and a job abandoned on price close under the same status on the same report.
- On-site diagnostic Technician mobile work order and job notes
Findings typed into the work order become structured attributes only where typed fields exist to receive them. Anything the technician observed but did not quote leaves no queryable trace once the work order is closed, and a photo attached to the job is not a field either.
- Estimate and financing Estimate or proposal object plus the consumer financing provider's portal
The estimate leaves the visit carrying whatever status the technician selected, while the financing decision stays in the provider's system. When no write-back maps that decision onto the estimate, the two halves of the same offer never sit in one record, and anyone reopening the conversation sees only the half the technician typed.
- Install or repair completion Invoice record in the platform and the accounting ledger
Revenue posts to the invoice and to the accounting ledger, both downstream of the ad platform. Where no job or invoice identifier travels back as an offline conversion, the closed ticket is invisible to bidding; where the identifier travels but the invoice is later adjusted, the value the ad platform holds is the superseded one.
- Maintenance agreement and renewal Agreement or membership record and the recurring payments processor
The agreement holds the visit entitlement while the processor holds the billing schedule. Where the two are joined only by a nightly file or a manual reconciliation, a card that stops authorising and an entitlement that goes unbooked each change state in one system while the other keeps displaying the agreement as current.
Relevant OmniLabs systems
- Acquisition & Conversion Systems Campaign, creative, and conversion infrastructure that captures demand and holds it through to completed action.
- CRM, Lifecycle & Follow-Up Systems Lead-handling and lifecycle workflows that connect intake, ownership, response, nurture, and recovery.
- Tracking, Attribution & Measurement Systems Measurement infrastructure — instrumentation, attribution, audits, and public-signal diagnostics — that makes source, event, and reporting signals trustworthy.
- Automation & AI Agent Systems Bounded automations and AI-agent workflows with explicit inputs, handoffs, and review points.
- Integration & Orchestration Systems Connectors, APIs, and synchronization workflows that let tools exchange the data an operating process depends on.
These are capability domains inside the systems portfolio, delivered as scoped custom builds. The operating model that sequences them is Revenue OS.
Questions you can answer from your own systems
- What is your booking rate computed over — calls that reached a CSR, or every inbound call your phone system logged, including the ones that abandoned and the ones that arrived after dispatch hours?
- When a call arrives outside dispatch hours, what exists the next morning: a customer, lead or job record inside the platform your dispatch board reads, or a message in an inbox?
- For a booking taken through your website, what value lands in the job's source field — the widget's own name, or the channel that produced the session?
- Can you produce last quarter's technician-observed deficiencies as a filterable segment — equipment type, observed condition, recommended action — using only your platform's report builder, or does that information exist solely inside note fields?
- When Local Services Ads lead volume moves, what gets checked first: the profile's responsiveness indicators, the phone system's missed-call series for the same days, or the expiry dates on your license and insurance documents?
- When a financing application is approved, does the approved amount appear on the estimate record itself, or only in the provider's portal?
Recurring failure modes
- Dynamic number insertion is deployed for call attribution without reconciling the swapped numbers against the number published on the Google Business Profile and in directory listings, so an attribution build introduces a citation inconsistency that surfaces later as an apparently unrelated visibility problem.
- An answering service or automated receptionist is procured against a coverage requirement — someone picks up — rather than against a record requirement, so it is wired to email and SMS and never given write access to the field service management platform. The overflow is answered and the pipeline still does not know it happened.
- Local Services Ads document state is treated as an onboarding task rather than a recurring one, so a license renewal or a certificate-of-insurance expiry can change delivery while the field service management platform records a fall in lead volume with no explanation attached to any record.
- Integration between the ad, call-tracking and field service management platforms is built as a scheduled poll against a modified-since filter rather than as an event subscription, so a value that changes twice between polls is collapsed to its last state and the intermediate state — the reschedule, the reassignment, the brief cancellation — is never observable.
- A cross-system join is keyed on the completion timestamp the field service management platform holds. When technicians close work orders without signal in a crawlspace, an attic or a basement and the record is written on reconnection, that timestamp is the sync rather than the moment on site, so every window-based join to a call, a click or a shift roster is offset by the length of the drive back.
Evidence and claim boundaries
Industry pages describe revenue mechanics structurally. No conversion, retention or churn benchmark is published for any industry, because no verified benchmark was obtained for any of them — the mechanics are real, the magnitudes are not established here. Nothing on these pages describes work performed for a business.
Named regimes that constrain the systems
- TCPA delivery restrictions, 47 CFR 64.1200 applies to Autodialed or prerecorded telemarketing calls and text messages to consumers. Whether a particular missed-call text-back, estimate follow-up or agreement-renewal message sits inside that definition is a fact-specific determination the rule leaves open, and one for counsel rather than for whoever configures the automation. The rule requires prior express written consent for that contact, permits revocation by any reasonable method clearly expressing a desire not to receive further calls or text messages, and requires revocation to be honored within a reasonable time not to exceed ten business days. It also states that the national do-not-call registry must be scrubbed against data no more than 31 days old. What binds in a trade operation is where those artifacts get written. Permission is collected in scattered places — a CSR on a live call, a technician on a mobile work order, a booking widget on the website — and a revocation arrives as a reply to a text or a sentence said to whoever answers. When the field service management platform carries no consent field, no revocation timestamp and no suppression flag on the customer record, the missed-call text-back, the estimate follow-up and the renewal reminder all read the same unmarked record, and a homeowner who revoked to one of them stays reachable by the others. source SRC-14
- Google Local Services Ads screening and verification applies to Businesses serving in Local Services Ads categories. Google enumerates the eligible United States category list, and the home-services trades appear on it as named categories. Google documents per-category screening: state or province license checks across Home Services, and an additional service professional check named for electrician, garage door, locksmith, HVAC and plumber. Insurance requirements are enumerated per category rather than applied uniformly — the documentation lists categories requiring general and professional liability, categories requiring general liability only, and categories with no insurance requirement. Inside a trade operation the consequence is that serving eligibility is a document-state dependency: a license renewal date, a certificate-of-insurance expiry, a bond period. Those dates sit with an office manager, a bookkeeper or an insurance broker rather than in the ad account, and the field service management platform may not carry any of them as a dated field on a record a report can read — so a document lapse and a bidding change present the same way in the lead report until someone opens the compliance tab and checks. source SRC-08 · SRC-09
Regimes are described structurally, as constraints on how systems and follow-up get built. Nothing here interprets them, and nothing here is legal, medical, veterinary, financial or regulatory advice.
Sources
- SRC-08 Getting started with Local Services Ads — United States Google Local Services Ads Help · No last-updated date is exposed on the page; date is genuinely unknown.
- SRC-09 Business screening and verification requirements — United States Google Local Services Ads Help · No last-updated date is exposed on the page; date is genuinely unknown.
- SRC-10 About ad rankings Google Local Services Ads Help · Undated live help document; retrieved 2026-08-16.
- SRC-14 47 CFR 64.1200 — Delivery restrictions (FCC TCPA rules) Legal Information Institute, Cornell Law School · Regulation text; no page publication date.
- SRC-18 Consent mode — Tag Platform Google for Developers · Undated live developer document; retrieved 2026-08-16.
Related reading
Definitions used on this page
There is one diagnostic. The Revenue Leak Scan reviews public-visible signals for any business; it is not an industry-specific product, and this page does not create one.