How to Fix UTM ID Platform Click ID Issues (Step-by-Step)
Rachel Kim discovered her GA4 cost reports showed $0 for $312,000 in quarterly ad spend. Sessions were tracked. Conversions recorded. But all campaign costs were missing.
The diagnosis took 20 minutes: Her campaigns used utm_id but lacked platform click IDs (gclid, fbclid). GA4 couldn't match sessions to ad platform costs without them.
The fix took 2 hours and restored complete ROI visibility for all future campaigns.
🚨 Not sure what's breaking your tracking?
Run a free 60-second audit to check all 40+ ways UTM tracking can fail.
Scan Your Campaigns Free✓ No credit card ✓ See results instantly
Diagnosing the Problem
Step 1: Confirm Cost Data Missing
GA4 → Reports → Acquisition → Traffic Acquisition
Add metric columns:
- Advertiser ad cost
- Advertiser ad clicks
- Advertiser ad impressions
Look for this pattern:
| Source | Medium | Sessions | Cost | Diagnosis |
|---|---|---|---|---|
| cpc | 45,223 | $0.00 | ❌ Problem | |
| cpc | 23,112 | $0.00 | ❌ Problem | |
| cpc | 8,445 | $0.00 | ❌ Problem |
If paid campaigns show $0 cost: Cost import is broken.
Step 2: Check Click ID Presence
GA4 → Explore → Create Free Form
Dimensions:
- Session source
- Session medium
- Google Click ID (gclid)
Filter: Source = google, Medium = cpc
What to look for:
Source | Medium | Sessions | gclid | Problem
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
google | cpc | 45,223 | (not set) | ❌ Missing
If gclid shows (not set): Click IDs aren't being captured.
Step 3: Test Active Campaigns
Click test ad and inspect URL:
What you see:
https://site.com?utm_id=brand_search&utm_source=google&utm_medium=cpc&utm_campaign=brand
What you need:
https://site.com?gclid=CjwKCAiA...&utm_id=brand_search&utm_source=google&utm_medium=cpc
Missing: gclid parameter
😰 Is this your only tracking issue?
This is just 1 of 40+ ways UTM tracking breaks. Most marketing teams have 8-12 critical issues they don't know about.
• 94% of sites have UTM errors
• Average: $8,400/month in wasted ad spend
• Fix time: 15 minutes with our report
✓ Connects directly to GA4 (read-only, secure)
✓ Scans 90 days of data in 2 minutes
✓ Prioritizes issues by revenue impact
✓ Shows exact sessions affected
Complete Fix Process
Phase 1: Enable Platform Auto-Tagging
Google Ads
Enable auto-tagging:
- Google Ads → Settings → Account settings
- Find "Auto-tagging"
- Toggle to ON
- ✅ "Tag the URL that people click through from my ad"
- Save changes
Verify setup:
- Create test campaign
- Click test ad
- URL should contain
?gclid=...
Important: Auto-tagging works with manual UTMs. Both coexist:
?gclid=abc123&utm_id=brand&utm_source=google&utm_medium=cpc
Facebook/Meta Ads
Facebook auto-enables fbclid by default.
Verify it's working:
- Click test Facebook ad
- Check URL contains
?fbclid=... - If missing, check ad account settings:
- Business Settings → Data Sources → Pixels
- Ensure Facebook Pixel is active
Microsoft Ads
Enable UET auto-tagging:
- Microsoft Ads → Campaigns
- Settings → Tracking
- Enable Auto-tagging with UET tag
- Save
Verify:
- Click test ad
- URL should contain
?msclkid=...
LinkedIn Ads
Install LinkedIn Insight Tag:
- LinkedIn Campaign Manager → Account Assets → Insight Tag
- Copy tag code
- Install in site
<head> - Verify installation
Insight Tag adds li_fat_id automatically.
TikTok Ads
Auto-enabled by default (ttclid).
Verify:
- Click test TikTok ad
- URL contains
?ttclid=...
Phase 2: Update Active Campaigns
For each platform with active campaigns:
Google Ads Campaigns
Keep auto-tagging ON, add utm_id:
- Go to campaign settings
- Campaign URL options → Final URL suffix
- Add (without overwriting gclid):
utm_id=`{"{"}{"{"}campaignid{"}"}{"}"}}`&utm_campaign=`{"{"}{"{"}campaign{"}"}{"}"}}`&utm_content=`{"{"}{"{"}adgroupid{"}"}{"}"}}`
Result URL:
https://site.com?gclid=abc...&utm_id=12345&utm_campaign=brand&utm_content=67890
Facebook Ads Campaigns
Update URL parameters:
- Ads Manager → Select campaign
- Edit ad creative
- Add URL parameters (Facebook auto-adds fbclid):
utm_id={"{"}{"{"}campaign.id{"}"}{"}"}}&utm_source=facebook&utm_medium=cpc&utm_campaign={"{"}{"{"}campaign.name{"}"}{"}"}}
Result URL:
https://site.com?fbclid=IwAR...&utm_id=23456&utm_source=facebook&utm_medium=cpc
LinkedIn Ads Campaigns
Update destination URLs:
- Campaign Manager → Campaigns → Ads
- Edit ad
- URL parameters:
utm_id={"{"}{"{"}campaign.id{"}"}{"}"}}&utm_source=linkedin&utm_medium=cpc&utm_campaign={"{"}{"{"}campaign.name{"}"}{"}"}}
Insight Tag adds li_fat_id automatically.
Phase 3: Configure GA4 Data Import
Even with click IDs working, you must link platforms:
Link Google Ads
- GA4 → Admin → Product Links → Google Ads links
- Click "Link"
- Choose Google Ads account
- Link configuration:
- ✅ Enable personalized advertising
- ✅ Import cost data
- ✅ Import clicks and impressions
- ✅ Enable auto-tagging override
- Save
Verify link:
- Link status: Active ✅
- Import enabled: Yes ✅
Link Meta Ads
- GA4 → Admin → Product Links → Meta Ads links
- Click "Link"
- Authenticate with Meta Business Manager
- Select ad account
- Configure import:
- ✅ Import cost data
- ✅ Import clicks and impressions
- Save
Verify:
- Connection status: Connected ✅
- Import active: Yes ✅
Link Microsoft Ads (if applicable)
- GA4 → Admin → Product Links
- Follow similar process for Microsoft Ads
- Enable cost data import
Phase 4: Validate Complete Setup
End-to-end validation checklist:
# Campaign: Google Ads Brand Search
Pre-launch checks:
- [x] Auto-tagging enabled in Google Ads
- [x] utm_id parameter added to Final URL suffix
- [x] Test ad clicked
- [x] Landing URL contains gclid ✅
- [x] Landing URL contains utm_id ✅
- [x] GA4 Realtime shows both parameters ✅
- [x] Google Ads linked to GA4 ✅
- [x] Cost import enabled ✅
Post-launch checks (after 48 hours):
- [ ] GA4 shows campaign cost data
- [ ] Cost matches Google Ads spend
- [ ] ROAS calculations workingTest for each platform (Google, Meta, Microsoft, etc.)
Phase 5: Fix Historical Data Gaps (Manual Import)
For campaigns that already ran without click IDs:
Historical data can't retroactively get click IDs, but you can manually import costs:
- GA4 → Admin → Data Import → Create data source
- Type: Offline event data or Cost data
- Download template CSV
- Fill with historical campaign costs:
Date,Campaign,Source,Medium,Cost,Clicks,Impressions
2024-10-01,brand_search,google,cpc,1234.56,890,12340
2024-10-02,brand_search,google,cpc,1456.78,921,13200- Upload CSV to GA4
- Match on: Date + Campaign + Source + Medium
Limitations:
- Manual process (not automatic)
- Must repeat monthly
- Less granular than click ID matching
Prevention: Maintain Click ID Health
1. Pre-Launch Campaign Checklist
Before launching ANY paid campaign:
## Click ID Validation
Platform: ___________
- [ ] Auto-tagging enabled on platform
- [ ] utm_id parameter configured
- [ ] Test ad clicked
- [ ] URL contains platform click ID
- [ ] URL contains utm_id
- [ ] Both captured in GA4 Realtime
- [ ] Platform linked to GA4
- [ ] Cost import enabled
- [ ] Documented in campaign tracking sheet2. Monthly Click ID Audit
Check these monthly:
# Click ID Health Audit
## Google Ads
- [ ] Auto-tagging: ON
- [ ] gclid capture rate: >95%
- [ ] Cost import: Working
- [ ] Cost data delay: <48 hours
## Meta Ads
- [ ] fbclid auto-appended: Yes
- [ ] fbclid capture rate: >95%
- [ ] Cost import: Working
## Microsoft Ads
- [ ] UET auto-tagging: ON
- [ ] msclkid capture rate: >95%3. Alert on Cost Import Failures
GA4 custom alert:
Condition:
- Metric: Advertiser ad cost
- Condition: Decreases more than 80%
- Comparison: Previous day
Action: Email marketing team
Why: Catches auto-tagging failures or link breaks immediately.
4. Redirect Testing
Ensure redirects preserve click IDs:
Test script:
# Test if gclid preserved through redirect
curl -I "https://site.com?gclid=test123" | grep -i location
# Expected: Location header contains gclid=test123
# If not: Redirect strips parameters (fix needed)Common redirect fixes:
Apache .htaccess:
# Preserve query parameters through redirect
RewriteCond %{"{"}{"{"}QUERY_STRING{"}"}{"}"}} .
RewriteRule ^old-page$ /new-page?%{"{"}{"{"}QUERY_STRING{"}"}{"}"}} [R=301,L]Nginx:
# Preserve query string
rewrite ^/old-page$ /new-page permanent;5. Documentation
Maintain platform-specific docs:
# Click ID Requirements by Platform
| Platform | Click ID | Parameter | Auto-Tagging Setting |
|----------|----------|-----------|---------------------|
| Google Ads | gclid | ?gclid=... | Account Settings → Auto-tagging |
| Meta Ads | fbclid | ?fbclid=... | Auto-enabled (verify in test) |
| Microsoft Ads | msclkid | ?msclkid=... | Settings → UET Auto-tagging |
| LinkedIn Ads | li_fat_id | ?li_fat_id=... | Insight Tag installation |
| TikTok Ads | ttclid | ?ttclid=... | Auto-enabled |
| Twitter Ads | twclid | ?twclid=... | Auto-enabled |✅ Fixed this issue? Great! Now check the other 39...
You just fixed one tracking issue. But are your Google Ads doubling sessions? Is Facebook attribution broken? Are internal links overwriting campaigns?
• Connects to GA4 (read-only, OAuth secured)
• Scans 90 days of traffic in 2 minutes
• Prioritizes by revenue impact
• Free forever for monthly audits
Join 2,847 marketers fixing their tracking daily
FAQ
Do I need to add utm_id manually if I have gclid?
For basic tracking: No. gclid alone provides cost import.
For advanced cases: Yes.
- Campaign grouping across platforms
- Custom cost reporting
- Multi-campaign aggregation
What if I can't enable auto-tagging?
You can't get automatic cost import without platform click IDs.
Alternative: Manual cost data upload via GA4 Data Import (tedious).
Can I add gclid manually instead of auto-tagging?
No. gclid values are unique per click, generated by Google. You can't create valid gclid values manually.
Must use: Auto-tagging to get real gclid values.
How long until cost data appears after enabling?
Typical timeline:
- Enable auto-tagging: Immediate effect on new clicks
- Link GA4 to platform: Immediate
- Cost data import: 24-48 hours
- First data in reports: 48-72 hours total
What if cost shows in Google Ads but not GA4?
Check:
- GA4-Google Ads link active
- Cost import enabled in link settings
- Auto-tagging enabled (gclid present)
- Wait full 48 hours
If still missing: Re-link accounts.
Can I use utm_id to track offline campaigns?
Yes, but it won't auto-import costs.
For offline (QR codes, print ads):
- Use utm_id for campaign identification
- Manually upload costs via GA4 Data Import
- Match on utm_id or campaign name
Related: UTM ID Without Platform Rule