A plumber in Brisbane was spending $4,000 a month on Google Ads and told me the ads "sort of worked." The account showed 212 conversions last month. When we pulled up the call log, 212 included 60 clicks on the phone number that never connected, every repeat visit to the thank-you page, and 38 form submissions, half of which were suppliers and SEO salespeople.
Plumbing is one of the most expensive keyword categories in Google Ads. Emergency terms can cost $30 to $80 a click. At those prices, the difference between tracking leads and tracking real jobs is the difference between a profitable account and a money pit.
This guide shows how I set up conversion tracking for plumbing and drainage businesses with Google Tag Manager, and how to connect it to the job management software you already use.
What a Plumbing Business Should Track
| Customer action | Conversion action | Priority | Value approach |
|---|---|---|---|
| Call from the ad | Ad Call | Primary | Calls over 60 seconds |
| Call from the website, business hours | Website Call | Primary | Average call value |
| Call from the website, after hours | Emergency Call | Primary | Higher value |
| Quote or booking form | Quote Request | Primary | Lower value than a call |
| Online booking confirmed | Booked Job | Primary | Average job value |
| Booked job from field software | Offline Booked Job | Primary | Actual job value |
The last row is what separates a good plumbing account from an average one. Everything else measures leads. The offline import measures jobs.
Before You Start
- Google Tag Manager on every page of the site, including any landing pages built in a separate tool.
- A tel: link on every phone number. Many plumber sites show the number as text or an image in the header, which cannot be tracked.
- Google Ads conversion IDs and labels.
- Access to your job management software settings: ServiceTitan, Jobber, Housecall Pro, Fergus, simPRO or Tradify. You need to know whether it can store a Google click ID against a job.
- A decision about your business hours for the emergency split.
Step 1: Conversion Actions in Google Ads
Create the website conversions manually under Goals, then Conversions. Use Phone call lead for the calls, Submit lead form for the quote form and Book appointment for online bookings. Set Count to One for forms and bookings, and One for calls.
Set the click-through conversion window to 7 days for emergency calls and 30 days for everything else. A blocked drain is not a considered purchase.
For the Ad Call conversion, add call assets to your campaigns with call reporting on and a 60 second minimum duration. Google counts those automatically.
Step 2: Conversion Linker
Create a Conversion Linker tag firing on All Pages. This stores the click identifier so the conversion can be matched to the ad click. Skip this and a large share of your Safari and mobile conversions will vanish.
Step 3: Website Calls, Split by Time of Day
Enable the Click URL built-in variable. Create a Click, Just Links trigger with Click URL starting with tel:.
To split emergency calls, create a Custom JavaScript variable in GTM that returns business_hours or after_hours based on the visitor's local time and your trading hours:
function () {
var now = new Date();
var day = now.getDay();
var hour = now.getHours();
var weekday = day >= 1 && day <= 5;
if (weekday && hour >= 7 && hour < 17) { return 'business_hours'; }
return 'after_hours';
}
Create two triggers from the tel: click: one with the variable equal to business_hours, one equal to after_hours. Fire the Website Call tag on the first and the Emergency Call tag on the second.
If you use a call tracking platform with dynamic number insertion, use its Google Ads integration instead and skip the tel: method. It will give you call duration and recordings, which are useful for lead quality.
Step 4: Quote Request Forms
Fire the conversion on confirmed submission only. If the form redirects to a thank-you page, use a Page View trigger on that URL. If it submits in place, use the form plugin's success event. Guides for Gravity Forms, WPForms, Fluent Forms and Elementor on this site have the exact listener code.
Then reduce spam:
- Add a honeypot field or reCAPTCHA v3.
- Set Count to One so repeat submissions from the same click are not counted twice.
- Add a "What do you need?" dropdown and pass its value to the dataLayer. Exclude values like "Other" or "Partnership enquiry" from the conversion trigger.
Step 5: Online Booking
If you take bookings through Housecall Pro, Jobber or ServiceTitan's online booking widget, the confirmation step is usually inside an iframe or on the vendor's domain.
- Check whether the widget redirects to a confirmation URL on your domain. If so, use a Page View trigger.
- If it confirms inside the widget, check the browser console during a test booking for a postMessage event you can listen for and push to the dataLayer.
- If neither is possible, fire a secondary conversion on the click into the booking widget and rely on the offline import for the real number.
Step 6: Offline Conversion Import From Your Job Software
This is the step that turns lead tracking into job tracking.
- Capture the Google click ID. Add a small script on your site that reads the
gclidURL parameter and stores it in a first-party cookie for 90 days. Google also sets this automatically when Enhanced Conversions for Leads is on. - Pass the click ID into your job software. Add a hidden field to your quote form that populates from the cookie and maps to a custom field on the customer or job record. For phone calls, your call tracking platform can pass it, or you can use Enhanced Conversions for Leads, which matches on email or phone instead.
- Export booked jobs weekly with the click ID, job date and job value. ServiceTitan and Jobber both support custom fields on jobs that can be exported.
- Upload to Google Ads under Goals, then Conversions, then Uploads, or connect a Google Sheet that Google Ads reads on a schedule.
Once this is running, mark Offline Booked Job as a primary conversion and consider demoting Quote Request to secondary. Smart Bidding then learns which searches produce jobs, not form fills.
Step 7: Enhanced Conversions
Turn on Enhanced Conversions for the quote form and booking. Create a User-Provided Data variable in GTM pointed at the email and phone fields from the dataLayer, and enable it in the conversion tags. The data is hashed in the browser.
Enhanced Conversions for Leads is particularly useful for plumbers because it lets you upload offline jobs by customer email or phone, without needing the click ID to survive the journey from form to invoice.
Step 8: Test, Then Reconcile Against Jobs
- Preview in GTM. Click the phone number during and outside business hours by temporarily changing the variable, submit the form, complete a test booking. Confirm one tag per action.
- Use a tag debugger like the Insighter Debugger extension to confirm the Google Ads request carries the right label.
- Next day, check Diagnostics on each conversion action.
- After two weeks, compare Google Ads conversions with booked jobs in your software. Expect Google Ads lead conversions to be higher than jobs. If offline imports are working, Offline Booked Job should match your software closely.
Mistakes I See in Plumber Accounts
- Phone number shown as text, so website calls are invisible.
- Emergency and routine calls counted the same, so budget drifts to cheap routine clicks.
- Quote form counting every submission, including spam and suppliers.
- Thank-you page reachable by direct URL and counted on every visit.
- No offline import, so the account optimises for calls that never book.
- Call asset without call reporting, so calls from ads are not counted at all.
The Outcome
With this setup, your Google Ads account tells you the cost per booked job for every campaign and keyword, including after-hours emergencies. That is the number you need to decide whether a $60 click on "emergency plumber near me" is a bargain or a waste. Most of the time it is a bargain. Until you track it, you are guessing.
