TL;DR
You're running ads, but you don't know which campaigns drive revenue (just leads). UTM parameters (source, medium, campaign, term, content) tag every URL so GA4 knows where traffic came from. GCLID (Google Click ID) ties leads back to specific ad clicks for offline conversion tracking. This post covers: the 5 UTM parameters and naming best practices (lowercase, underscores, consistency), auto-tagging in Google Ads (GCLID), capturing GCLID in CRM (hidden form fields, Zapier, server-side), Final URL suffix for account-level UTM append, GA4 lead reports setup (generate_lead event, traffic acquisition, conversions), offline conversion imports back to Google Ads, and pipeline reporting (campaign → clicks → leads → cost → revenue → ROI).
You're spending $10,000/month on Google Ads, Facebook Ads, and LinkedIn Ads.
You know: How many clicks you got | How many leads you captured | How much you spent
You DON'T know:
- Which campaign generated your $50,000 deal last month
- Whether LinkedIn is actually profitable (or just generating junk leads)
- If your Facebook ads are driving revenue or just form fills that never close
The problem: You're tracking clicks and leads, not revenue.
The fix: Close the loop with UTM parameters, GCLID tracking, and offline conversion uploads.
What Are UTM Parameters?
UTM parameters = Tags you add to URLs to track where traffic came from.
Without UTMs:
https://yourwebsite.com/landing-page
With UTMs:
https://yourwebsite.com/landing-page?utm_source=google&utm_medium=cpc&utm_campaign=roofing_phoenix&utm_term=roof%20repair&utm_content=ad_variant_A
When someone clicks this URL, GA4 captures the UTM parameters and knows:
- Source: google (where traffic came from)
- Medium: cpc (the marketing channel: paid search)
- Campaign: roofing_phoenix (which campaign)
- Term: roof repair (which keyword)
- Content: ad_variant_A (which ad variation)
Now you can report: "The 'roofing_phoenix' campaign generated 50 clicks, 10 leads, and 2 closed deals worth $16,000."
The 5 UTM Parameters
| Parameter | What It Tracks | Required? | Example Values |
|---|---|---|---|
| utm_source | Traffic source (platform) | ✅ Yes | google, facebook, linkedin, newsletter |
| utm_medium | Marketing medium (channel) | ✅ Yes | cpc, social, email, referral, organic |
| utm_campaign | Campaign name | ✅ Yes | roofing_phoenix, q4_promo, brand_awareness |
| utm_term | Keyword (for paid search) | ⚪ Optional | roof repair Phoenix, HVAC installation |
| utm_content | Ad variation or A/B test | ⚪ Optional | ad_variant_A, banner_top, link_footer |
Parameter #1: utm_source (Where)
What it tracks: Where the traffic originated (the platform or website).
Examples:
google(Google Ads, organic search)facebook(Facebook Ads, organic posts)linkedin(LinkedIn Ads, organic posts)newsletter(your email newsletter)partner_site(referral from a partner website)
Naming conventions: Use lowercase (google, not Google). Be consistent — don't mix "google" and "Google_Ads."
Parameter #2: utm_medium (How)
What it tracks: The marketing channel or method.
Examples:
cpc(cost-per-click, paid ads)social(organic social media)email(email campaigns)referral(traffic from another website)organic(organic search)display(display ads, banners)affiliate(affiliate links)
Use standard GA4 values when possible (cpc, organic, referral, social, email). Be consistent.
Parameter #3: utm_campaign (What)
What it tracks: The specific campaign or promotion.
Examples:
roofing_phoenix_q4_2025hvac_summer_salebrand_awareness_janlead_magnet_ebook
Naming conventions: Be descriptive (roofing_phoenix, not campaign1). Use underscores or hyphens (no spaces). Include date or version if relevant.
Parameter #4: utm_term (Which Keyword) — Optional
What it tracks: The keyword that triggered your ad (for paid search).
Examples:
roof repair PhoenixHVAC installationemergency plumber
Note: Google Ads auto-populates utm_term if you enable auto-tagging (via GCLID). You usually don't need to add it manually for Google Ads.
Parameter #5: utm_content (Which Variation) — Optional
What it tracks: The specific ad variation, link, or A/B test.
Examples:
ad_variant_A(testing different ad copy)banner_top(top banner vs. sidebar)button_blue(blue CTA vs. red)link_footer(footer link vs. header link)
UTM Naming Best Practices
✅ Do:
- Use lowercase (google, not Google)
- Use underscores or hyphens (roofing_phoenix or roofing-phoenix, not roofing phoenix)
- Be consistent (always "facebook" — never "fb" or "Facebook")
- Be descriptive (roofing_phoenix_q4, not campaign1)
- Maintain a UTM naming convention doc shared with your team
❌ Don't:
- Use spaces (roofing phoenix = broken URL)
- Use special characters (avoid &, %, =, etc.)
- Mix cases (google vs. Google vs. GOOGLE = 3 different sources in GA4)
- Use PII (personally identifiable information like names, emails)
How to Build UTM URLs
Tool method (recommended): Use Google's Campaign URL Builder: https://ga-dev-tools.google/campaign-url-builder/
Manual method:
https://yourwebsite.com/landing-page?utm_source=google&utm_medium=cpc&utm_campaign=roofing_phoenix
Generated URL with all parameters:
https://yourwebsite.com/landing-page?utm_source=google&utm_medium=cpc&utm_campaign=roofing_phoenix&utm_term=roof%20repair%20Phoenix&utm_content=ad_variant_A
GCLID: Google's Auto-Tagging for Attribution
GCLID (Google Click ID) = A unique identifier Google Ads adds to URLs when someone clicks your ad.
Example URL with GCLID:
https://yourwebsite.com/landing-page?gclid=ABC123XYZ456
Why GCLID matters:
- Ties the click back to the specific ad, keyword, and campaign
- Enables offline conversion tracking (upload closed deals back to Google Ads)
- Works even if UTM parameters are stripped or missing
How to enable GCLID (auto-tagging):
- Go to Google Ads → Settings → Account settings
- Find "Auto-tagging"
- Turn it ON
Now every Google Ads click will have ?gclid=... appended automatically.
Capturing GCLID in Your CRM
Why you need GCLID in your CRM: To upload offline conversions back to Google Ads so Google knows which clicks led to revenue, not just leads.
Option A: Hidden Form Field
<input type="hidden" name="gclid" id="gclid">
<script>
var urlParams = new URLSearchParams(window.location.search);
var gclid = urlParams.get('gclid');
if (gclid) {
document.getElementById('gclid').value = gclid;
}
</script>
Most form tools (Unbounce, Typeform, Gravity Forms) support dynamic parameters.
Option B: Zapier/Make.com
- Trigger: New form submission
- Action: Create lead in CRM (HubSpot, Salesforce, Airtable)
- Map the
gclidfield from the form to a custom CRM property
Option C: Server-Side Tracking (Cookie)
// When user lands on page, save GCLID to cookie
var urlParams = new URLSearchParams(window.location.search);
var gclid = urlParams.get('gclid');
if (gclid) {
document.cookie = "gclid=" + gclid + "; path=/; max-age=7776000"; // 90 days
}
// On form submission, retrieve GCLID from cookie and include in form data
Final URL Suffix (Append UTMs to All Ads Automatically)
Problem: Manually adding UTMs to every ad URL is tedious and error-prone.
Solution: Use Final URL Suffix in Google Ads to append UTMs automatically.
Go to: Google Ads → Settings → Account settings → Tracking → Final URL Suffix
Add:
?utm_source=google&utm_medium=cpc&utm_campaign={campaignid}&utm_term={keyword}
Google Ads automatically replaces {campaignid} and {keyword} with real values. Your ads now have UTMs without manual tagging.
Setting Up GA4 to Track Leads and Revenue
Step 1: Create a "generate_lead" Conversion Event
Go to: GA4 → Admin → Events → Create Event
gtag('event', 'generate_lead', {
'currency': 'USD',
'value': 100.00 // Optional: estimated lead value
});
Step 2: Mark as Conversion
Go to: GA4 → Admin → Conversions → New conversion event → Add generate_lead
Step 3: View Lead Reports
Go to: GA4 → Reports → Acquisition → Traffic acquisition
See which campaigns drove leads (generate_lead conversions), cost per lead, and conversion rate by source/medium.
Step 4: Import Offline Conversions (Closed Deals)
Option A: Manual CSV import
- Export closed deals from CRM with GCLID, revenue, close date
- Import to GA4 (Admin → Data Import)
Option B: API (advanced)
- Use GA4 Measurement Protocol API to send offline conversion data programmatically
Offline Conversion Workflow (Full Loop)
- User clicks your Google Ad → Google appends
?gclid=ABC123to the URL - User lands on landing page → Hidden form field captures GCLID
- User submits form → CRM stores: Name, Phone, Email, GCLID
- Sales team works the lead → Lead is qualified, quoted
- Lead closes → CRM marks as "Closed-Won" with revenue amount
- Upload offline conversion → Export GCLID + close date + revenue → Upload to Google Ads
Google Ads now knows: GCLID ABC123 = keyword "roof repair Phoenix" = $8,500 revenue
Google's Smart Bidding optimizes for revenue-generating keywords, not just lead-generating keywords.
Pipeline Reporting (Campaign → Revenue → ROI)
| Metric | Example |
|---|---|
| Campaign | roofing_phoenix |
| Clicks | 500 |
| Cost | $5,000 |
| Leads | 50 (10% conversion rate) |
| Cost per Lead | $100 |
| Closed Deals | 5 (10% close rate) |
| Revenue | $40,000 (avg. $8,000/job) |
| Profit | $35,000 |
| ROAS | 8:1 ($40K / $5K) |
| ROI | 700% |
Without UTM/GCLID: You only know clicks and leads. With UTM/GCLID: You know which campaigns drive revenue and ROI.
Real-World Example: SaaS Company — LinkedIn vs. Facebook
Month 1 (No UTM Tracking): $5K total spend, 100 leads, $50K revenue. They know the totals — but not which platform generated the $50K.
Month 2 (With UTM Tracking):
LinkedIn (?utm_source=linkedin&utm_medium=cpc&utm_campaign=b2b_saas_q4)
- Spend: $3,000 | Leads: 30 | Closed: 6 | Revenue: $48,500 | ROAS: 16.2:1
Facebook (?utm_source=facebook&utm_medium=cpc&utm_campaign=b2b_saas_q4)
- Spend: $2,000 | Leads: 70 | Closed: 2 | Revenue: $2,500 | ROAS: 1.25:1
Insight: LinkedIn generates fewer leads but 19x more revenue per dollar spent.
Action: Cut Facebook from $2K → $500. Increase LinkedIn from $3K → $5K.
Month 3: $81,250 revenue (vs. $50K before) — 62% revenue increase by reallocating budget based on UTM data.
Common UTM Mistakes
Mistake #1: Inconsistent naming ❌ Using "google," "Google," and "Google_Ads" in different campaigns ✅ Pick one (google) and stick with it
Mistake #2: No UTMs on email campaigns
❌ Emails without UTMs (you can't track performance in GA4)
✅ Add ?utm_source=newsletter&utm_medium=email&utm_campaign=weekly_digest
Mistake #3: Spaces in UTM values ❌ utm_campaign=roofing phoenix (breaks URL) ✅ utm_campaign=roofing_phoenix
Mistake #4: Not capturing GCLID in CRM ❌ Google Ads conversions tracked, but no offline conversions uploaded ✅ Capture GCLID, upload closed deals back to Google Ads
Mistake #5: Only tracking leads (not revenue) ❌ Only tracking form fills in GA4 ✅ Import offline conversion data (closed deals + revenue)
The Bottom Line
UTMs and GCLID close the revenue loop.
Without them: You only know clicks and leads. With them: You know which campaigns drive revenue and ROI.
Set up the loop:
- Use the 5 UTM parameters (source, medium, campaign, term, content)
- Follow naming conventions (lowercase, underscores, consistency)
- Enable auto-tagging in Google Ads (GCLID)
- Capture GCLID in your CRM (hidden form field)
- Upload offline conversions back to Google Ads (closed deals + revenue)
- Set up GA4 to track leads and revenue
- Build pipeline reports (campaign → leads → cost → revenue → ROI)
Optimize for revenue, not just lead volume. Your ROAS will skyrocket.
Ready to Start Selling Leads?
Launch your first campaign in under 15 minutes. Try Growth free for 14 days.
Start Selling Leads →