What actually has to be instrumented to follow a search all the way to revenue?
Five handoffs: search to click, click to contact, contact to booking, booking to completed job, completed job to invoice. Each crosses a system boundary, and each needs an identifier that survives the jump — a click identifier carried into the session, the session carried into the tracked call or form, that carried into the customer record, and the customer record linked to the job and the invoice.
The chain, one link at a time
Nothing about this is conceptually hard. It is hard because five different vendors each own one link and none of them own the chain.
Search to click is owned by the ad or search platform and is the only link they can see end to end. Click to contact happens on your site and is where the click identifier, campaign parameters and session must be captured and attached to the phone call or form. Contact to booking happens in the CRM or field service system. Booking to completion happens on the dispatch board. Completion to invoice happens in billing and often in accounting.
What has to survive each jump
- Click to session. The click identifier and campaign parameters stored server-side or in a first-party cookie, not just read from the URL of the landing page.
- Session to contact. Dynamic number insertion for calls; hidden fields for forms. The failure mode is a customer who browses, leaves, and calls the number from your listing later — a real journey your instrumentation will miss.
- Contact to customer record. Phone number and address matching, because the same person may already exist in the system from three years ago.
- Customer to job to invoice. These are usually one-to-many. One customer, several jobs; one job, several invoices. Assuming one-to-one is the most common quiet error in home services reporting.
Match rate is a metric, not an embarrassment
No implementation matches every journey. Referrals who search your brand, calls from a number you never tracked, and jobs booked months after the click will always exist. A credible system reports the share it could match and treats the rest as unknown rather than distributing it silently across campaigns.
Publishing that match rate is what makes the rest of the numbers defensible in a meeting. It is a design requirement of the integration layer, not an afterthought.
Where to store the joined record
Not in the ad platform and not in the field service system. Both are optimized for their own job and neither can hold the other's identifiers well. The joined journey belongs in a layer you control, keyed to your own identifiers, with the source systems treated as inputs.
That is also what lets you change vendors without losing history — which happens more often than anyone plans for. This is the structural reason revenue reporting gets built outside the tools rather than inside them.
Topics: attribution · search to revenue · integration · tracking
Have a version of this question about your own business?
The useful answer usually depends on which systems you run and how they're connected. That's a conversation, not a blog post.