# Google Ads UTM Parameter Fix - `/schichtbetriebe` and `/gastro` Landing Pages

**Date:** 2026-01-29  
**Issue:** UTM parameters not being passed correctly for `/schichtbetriebe` and `/gastro` landing pages  
**Status:** ✅ Server-side fixed | ⚠️ Google Ads configuration needs update

---

## Problem Summary

UTM parameters are not being tracked correctly for the `/schichtbetriebe` and `/gastro` landing pages in Google Ads campaigns. Both pages have UTMs hardcoded in the Final URL, which conflicts with the Tracking Template that also adds UTMs.

**Root Cause:** Conflict between UTMs hardcoded in the Final URL and the Tracking Template that also adds UTMs. Google Ads doesn't merge these correctly, causing parameters to be dropped or inconsistently applied.

---

## Current Configuration (Incorrect)

### `/schichtbetriebe` Landing Page

**Final URL at Ad Level:**

```
https://www.ordio.com/schichtbetriebe/?utm_campaign=DE_Search_G_Zeiterfassung&utm_source=google&utm_medium=ppc
```

**Tracking Template at Campaign Level:**

```
{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_G_Zeiterfassung&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=20035390960&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3
```

### `/gastro` Landing Page

**Final URL at Ad Level:**

```
https://www.ordio.com/gastro/?utm_campaign=DE_Search_G_Gastro&utm_source=google&utm_medium=ppc&utm_content=dienstplan1&utm_term=lp26
```

**Tracking Template at Campaign Level:**

```
{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_G_Gastro&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=21031209748&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3
```

**Problem:** When both Final URL and Tracking Template contain UTMs, Google Ads can drop or incorrectly merge parameters. This affects both `/schichtbetriebe` and `/gastro` landing pages.

---

## Correct Configuration

### `/schichtbetriebe` Landing Page

**Final URL at Ad Level (Clean URL):**

```
https://www.ordio.com/schichtbetriebe
```

**Tracking Template at Campaign Level (Keep As-Is):**

```
{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_G_Zeiterfassung&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=20035390960&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3
```

### `/gastro` Landing Page

**Final URL at Ad Level (Clean URL):**

```
https://www.ordio.com/gastro
```

**Tracking Template at Campaign Level (Keep As-Is):**

```
{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_G_Gastro&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=21031209748&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3
```

**Important:** Remove ALL query parameters from the Final URLs. The Tracking Templates will add them automatically. **No changes needed** to the Tracking Templates - they are correct and will add all parameters automatically.

---

## How It Works

1. **Final URL** (`{lpurl}`) = `https://www.ordio.com/schichtbetriebe` (clean, no parameters)
2. **Tracking Template** appends all UTM and `hsa_*` parameters
3. **Final Click URL** = `https://www.ordio.com/schichtbetriebe?utm_term={keyword}&utm_campaign=DE_Search_G_Zeiterfassung&...`
4. **Server-side** preserves all parameters (already fixed with `QSA` flag in `.htaccess`)

---

## Action Items

### For Google Ads Manager

#### Fix `/schichtbetriebe` Landing Page

1. **Find all ads** pointing to `/schichtbetriebe` landing page
   - Go to: **Ads & Extensions → Ads**
   - Filter/search for ads with Final URL containing `schichtbetriebe`

2. **Update Final URLs** for all `/schichtbetriebe` ads:
   - **Change FROM:** `https://www.ordio.com/schichtbetriebe/?utm_campaign=DE_Search_G_Zeiterfassung&utm_source=google&utm_medium=ppc`
   - **Change TO:** `https://www.ordio.com/schichtbetriebe`
   - Remove ALL query parameters from Final URL

3. **Verify Tracking Template** is set at campaign level:
   - Campaign: **DE_Search_G_Zeiterfassung**
   - Settings → URL Options → Tracking Template
   - Should be: `{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_G_Zeiterfassung&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=20035390960&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3`

#### Fix `/gastro` Landing Page

1. **Find all ads** pointing to `/gastro` landing page
   - Go to: **Ads & Extensions → Ads**
   - Filter/search for ads with Final URL containing `gastro`

2. **Update Final URLs** for all `/gastro` ads:
   - **Change FROM:** `https://www.ordio.com/gastro/?utm_campaign=DE_Search_G_Gastro&utm_source=google&utm_medium=ppc&utm_content=dienstplan1&utm_term=lp26`
   - **Change TO:** `https://www.ordio.com/gastro`
   - Remove ALL query parameters from Final URL

3. **Verify Tracking Template** is set at campaign level:
   - Campaign: **DE_Search_G_Gastro**
   - Settings → URL Options → Tracking Template
   - Should be: `{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_G_Gastro&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=21031209748&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3`

#### Testing After Updates

4. **Test both landing pages:**
   - Use Google Ads preview tool for both campaigns
   - Click through to verify Final Click URL includes all UTM parameters
   - For `/schichtbetriebe`: Check that `utm_source=adwords`, `utm_campaign=DE_Search_G_Zeiterfassung`, `utm_term={keyword}`, and all `hsa_*` parameters are present
   - For `/gastro`: Check that `utm_source=adwords`, `utm_campaign=DE_Search_G_Gastro`, `utm_term={keyword}`, and all `hsa_*` parameters are present

---

## Reference: Working Example

### `/v3` Landing Page (Working Correctly)

**Final URL:**

```
https://www.ordio.com/v3
```

**Tracking Template:**

```
{lpurl}?utm_term={keyword}&utm_campaign=DE_Search_B_Brand&utm_source=adwords&utm_medium=ppc&hsa_acc=1887350035&hsa_cam=21226577222&hsa_grp={adgroupid}&hsa_ad={creative}&hsa_src={network}&hsa_tgt={targetid}&hsa_kw={keyword}&hsa_mt={matchtype}&hsa_net=adwords&hsa_ver=3
```

**Result:** ✅ All UTM parameters tracked correctly

**Note:** `/v3` works correctly because it uses a clean Final URL (no hardcoded UTMs) and lets the Tracking Template add all parameters dynamically. This is the correct approach that should be applied to `/schichtbetriebe` and `/gastro`.

---

## Best Practice: Final URL vs Tracking Template

### ✅ Correct Approach

- **Final URL:** Clean URL without any parameters
- **Tracking Template:** Adds all UTM and tracking parameters dynamically

### ❌ Incorrect Approach

- **Final URL:** Contains hardcoded UTM parameters
- **Tracking Template:** Also tries to add UTM parameters
- **Result:** Google Ads may drop or incorrectly merge parameters

---

## Server-Side Status

✅ **Server-side fix completed:**

- Updated `.htaccess` rewrite rule to include `QSA` flag
- Ensures query parameters are preserved during URL rewriting
- All landing pages (`/schichtbetriebe`, `/gastro`, `/v3`) now have proper parameter preservation

**No action needed** - Server configuration is correct and ready to receive UTM parameters.

---

## Testing Checklist

After updating Google Ads configuration for both `/schichtbetriebe` and `/gastro`:

**Note:** UTMs will disappear from URL after 1.5 seconds (expected behavior). Verify tracking via cookies and form submission.

### `/schichtbetriebe` Landing Page

- [ ] Final URL updated to clean URL (no parameters)
- [ ] Tracking Template verified at campaign level (DE_Search_G_Zeiterfassung)
- [ ] Used Google Ads preview tool to test
- [ ] Verified Final Click URL includes all UTM parameters
- [ ] Checked `utm_source=adwords` is present
- [ ] Checked `utm_campaign=DE_Search_G_Zeiterfassung` is present
- [ ] Checked `utm_term={keyword}` is populated with actual keyword
- [ ] Verified all `hsa_*` parameters are present
- [ ] Tested actual click-through from live ad
- [ ] Confirmed UTM parameters appear in browser address bar on landing page
- [ ] Verified tracking in analytics/HubSpot

### `/gastro` Landing Page

- [ ] Final URL updated to clean URL (no parameters)
- [ ] Tracking Template verified at campaign level (DE_Search_G_Gastro)
- [ ] Used Google Ads preview tool to test
- [ ] Verified Final Click URL includes all UTM parameters
- [ ] Checked `utm_source=adwords` is present
- [ ] Checked `utm_campaign=DE_Search_G_Gastro` is present
- [ ] Checked `utm_term={keyword}` is populated with actual keyword
- [ ] Verified all `hsa_*` parameters are present
- [ ] Tested actual click-through from live ad
- [ ] Confirmed UTM parameters appear in browser address bar on landing page
- [ ] Verified tracking in analytics/HubSpot

---

## Expected Behavior: URL Cleanup

**IMPORTANT:** UTM parameters are intentionally cleaned from the URL after tracking. This is correct behavior.

### What Happens

1. **User clicks Google Ads link** → URL contains UTMs + hsa\_\* parameters
2. **Page loads** → UTM tracking script reads parameters from URL
3. **Cookies set** → All parameters stored in cookies (90-day expiration)
4. **After 1.5 seconds** → UTMs cleaned from URL (prevents link sharing misattribution)
5. **hsa\_\* parameters preserved** → Remain in URL for Google Ads conversion tracking
6. **Forms read from cookies** → Form submissions include all UTM data

### How to Verify Tracking is Working

Even though UTMs disappear from the URL, tracking is working correctly:

1. **Check Cookies:**

   ```javascript
   // In browser console
   document.cookie;
   // Should show: utm_source=adwords; utm_campaign=DE_Search_G_Zeiterfassung; etc.
   ```

2. **Check localStorage:**

   ```javascript
   // In browser console
   localStorage.getItem("ordio_utm_data");
   // Should show JSON with all UTM parameters
   ```

3. **Enable Debug Mode:**
   - Add `?utm_debug=true` to URL
   - Check browser console for detailed logs
   - See: [UTM Tracking Debugging Guide](../../development/UTM_TRACKING_DEBUGGING.md)

4. **Test Form Submission:**
   - Submit a form on the page
   - Check Network tab → Form submission should include UTM parameters
   - Verify HubSpot contact record has UTM data

### Parameters Preserved in URL

These parameters remain in the URL (not cleaned):

- `hsa_*` - Google Ads conversion tracking parameters
- `gad_source`, `gad_campaignid`, `gbraid` - Google Ads additional tracking

This is intentional and correct - these parameters are needed for Google Ads conversion tracking.

## Questions or Issues?

If UTM parameters are still not appearing after this fix:

1. **Verify URL Cleanup is Working:**
   - UTMs should disappear from URL after 1.5 seconds
   - Check cookies: `document.cookie` should contain UTMs
   - This is expected behavior, not an error

2. **Check Cookies:**
   - Open browser DevTools → Application → Cookies
   - Verify UTM cookies exist with 90-day expiration
   - Check domain is `.ordio.com`

3. **Test Form Submission:**
   - Submit a form and check Network tab
   - Verify UTM parameters are included in form data
   - Check HubSpot contact record

4. **Enable Debug Mode:**
   - Add `?utm_debug=true` to URL
   - Check console for detailed logs
   - See debugging guide: [UTM Tracking Debugging Guide](../../development/UTM_TRACKING_DEBUGGING.md)

5. **Check Google Ads Configuration:**
   - Verify ad-level Final URLs are clean (no UTMs)
   - Verify campaign-level Tracking Template is set
   - Check ad-level overrides don't conflict
   - Test with Google Ads preview tool

6. **Verify Server-Side:**
   - Check `.htaccess` has `QSA` flag for `/schichtbetriebe` and `/gastro`
   - Test URL rewrite preserves parameters

---

## Additional Notes

### `/schichtbetriebe` Campaign

- **Custom Parameter:** `{_utmcampaign} = DE_Search_G_Zeiterfassung` should remain unchanged
- **Campaign ID:** `20035390960` (for reference)
- **Account ID:** `1887350035` (for reference)

### `/gastro` Campaign

- **Custom Parameter:** `{_utmcampaign} = DE_Search_G_Gastro` should remain unchanged
- **Campaign ID:** `21031209748` (for reference)
- **Account ID:** `1887350035` (for reference)

---

**Document prepared by:** Development Team  
**For:** Google Ads Manager  
**Priority:** High - Affects campaign tracking and attribution
