Roofing has two things that make tracking unforgiving: clicks that cost as much as a nice dinner, and jobs that range from a $400 repair to a $40,000 replacement. An account that counts all leads equally will happily spend your budget generating gutter cleaning enquiries at $90 each while the full replacement keywords sit on a limited budget.
This guide walks through how I set up Google Ads conversion tracking for roofing contractors using Google Tag Manager, and how to close the loop with signed contracts so the account optimises for revenue, not form fills.
What a Roofing Company Should Track
| Homeowner action | Conversion action | Priority | Value |
|---|---|---|---|
| Free inspection or estimate form | Estimate Request | Primary at first, secondary later | Average lead value |
| Call from the ad | Ad Call | Primary | Average lead value |
| Call from the website | Website Call | Primary | Average lead value |
| Financing or quote calculator completion | Calculator Lead | Secondary | Low |
| Appointment booked by the office | Inspection Booked | Primary, offline | Higher |
| Contract signed | Signed Job | Primary, offline | Actual contract value |
Start by tracking the online actions. Within a month, add the two offline stages. The goal is to reach a point where Signed Job carries the real contract value and drives bidding.
Prerequisites
- Google Tag Manager installed on the site and on any landing pages built in a separate page builder.
- tel: links on every phone number, including the sticky mobile call button.
- Google Ads conversion IDs and labels.
- A CRM with a custom field available for the Google click ID.
- A clear list of what counts as a signed job in your CRM, for example a deal stage named "Contract Signed".
Step 1: Conversion Actions
Create the online conversions manually in Google Ads under Goals, then Conversions. Use Submit lead form for the estimate form and the calculator, and Phone call lead for the calls.
Create two more as Import from clicks conversions for Inspection Booked and Signed Job. Set Signed Job to use the value from the upload rather than a fixed value. Set its click-through window to 90 days.
For call reporting on the ads themselves, add call assets with a minimum duration of 60 seconds.
Step 2: Conversion Linker and Click ID Capture
Create a Conversion Linker tag firing on All Pages.
Then add a Custom HTML tag, also on All Pages, that reads the gclid parameter and stores it in a first-party cookie for 90 days. Add a hidden field named gclid to every form and populate it from that cookie. Map that field to a custom property in your CRM.
This single step is what makes the offline import possible later. Do it on day one even if you are not ready to import yet.
Step 3: Track Calls
Enable the Click URL built-in variable, create a Click, Just Links trigger where Click URL starts with tel:, and fire the Website Call conversion on it.
Roofing is a category where a call tracking platform pays for itself quickly. Dynamic number insertion lets you attribute each call to a keyword and record it for quality review, and most platforms send calls to Google Ads directly. If you use one, use its integration and skip the tel: method to avoid double counting.
Step 4: Track the Estimate Form
Fire the Estimate Request conversion only on confirmed submission. Thank-you page redirect gives you a Page View trigger. In-place submission needs the plugin's success event; see the Gravity Forms, WPForms, Fluent Forms and Elementor guides on this site for the code.
Add a service type dropdown to the form: Repair, Replacement, Inspection, Gutters, Commercial. Push the value to the dataLayer and store it in the CRM. You will use it to see which campaigns bring replacement enquiries versus repairs, and you can give the Estimate Request conversion a different value per type using a lookup table variable in GTM.
Step 5: Track Calculators and Financing Tools
Instant quote calculators and financing pre-qualification widgets usually run in an iframe. They are a weaker signal than a direct estimate request, so track them as a secondary conversion. Check the browser console during a test for a postMessage event on completion and push it to the dataLayer. If the vendor offers a redirect on completion, use a Page View trigger instead.
Step 6: Offline Conversions From Your CRM
This is the step most roofing companies never do, and it is the one that changes the economics.
- Make sure every lead in the CRM carries the Google click ID from the hidden form field or from your call tracking platform.
- When the office books an inspection, record the date. When a contract is signed, record the date and the contract value.
- Weekly, export leads that reached each stage with their click ID, the stage timestamp and the value.
- Upload to Google Ads under Goals, then Conversions, then Uploads, or connect a scheduled Google Sheet. HubSpot and GoHighLevel can send these automatically through their native Google Ads integrations.
After a month of imports, switch bidding to Maximise Conversion Value with Signed Job as the only primary conversion. Then watch the account shift spend toward the searches that produce replacements.
Step 7: Enhanced Conversions for Leads
Turn on Enhanced Conversions for Leads in Google Ads. It lets you upload offline conversions matched by hashed email or phone number, so even leads where the click ID was lost, such as phone calls taken by hand, can still be attributed. Create a User-Provided Data variable in GTM for the estimate form and enable it in the conversion tag.
Step 8: Test and Reconcile
- GTM Preview: submit the estimate form, click the phone number, complete the calculator. Confirm one tag per action and that the hidden gclid field is populated when you arrive with a test
?gclid=test123parameter. - Confirm in your CRM that the test lead carries
test123in the click ID field. - Use a tag debugger such as the Insighter Debugger extension to check the Google Ads request.
- After the first offline upload, check the upload history for match rate. Below 70 percent usually means the click ID is not being stored on enough leads.
Common Mistakes in Roofing Accounts
- All leads valued equally, so repair keywords win the budget.
- Click ID never captured, so offline import is impossible later.
- Calculator completions counted as primary leads.
- Two call tracking methods running at once, doubling call conversions.
- Thank-you page indexed by Google and reachable directly, counting organic visitors as conversions.
- Conversion window too short for replacement jobs that take two months to sign.
What Good Looks Like
Your Google Ads account shows cost per signed job and return on ad spend by campaign, keyword and suburb. You can see that storm damage searches in one area produced $140,000 in signed contracts last quarter while the generic "roofer near me" campaign produced repairs. From there, budget decisions become obvious. Without it, you are negotiating with the account on gut feel.
