Skip to content
MJ Marketing
Google Ads Tracking Setup Guide
Tracking & Analytics
14 min read
Mijo Jurisic

Google Ads Tracking Setup: 5 Steps (No Blind Guessing)

Set up Google Ads conversion tracking properly. Conversion actions, GA4 integration, Enhanced Conversions, offline trackingβ€”with setup steps and common fixes.

Share:

Google Ads Tracking Setup: The Complete Guide 2025

Reality: Without proper tracking = flying blind. In my experience, a large share of Google Ads campaigns have tracking issues. This guide shows the complete setup process + troubleshooting.

Why Tracking is Critical

Example without tracking:

Budget: €5,000/month
Clicks: 2,500
Conversions: ???
ROAS: ???
β†’ No idea if profitable!

With tracking:

Budget: €5,000/month
Clicks: 2,500
Conversions: 83
Cost per Conversion: €60
Revenue: €24,900
ROAS: 498%
β†’ Profitable! Scale!

What you DON'T know without tracking:

  • ❌ Which keywords are profitable
  • ❌ Which ads convert
  • ❌ If campaign is profitable
  • ❌ How to optimize
  • ❌ Whether to increase/decrease budget

With tracking:

  • βœ… Every conversion is attributable
  • βœ… AI can optimize (Smart Bidding)
  • βœ… ROI assessment possible
  • βœ… Scaling decisions data-driven

The Tracking Ecosystem

Components:

  1. Google Ads Conversion Tracking (foundation)
  2. Google Analytics 4 (advanced analysis)
  3. Google Tag Manager (tag management)
  4. Enhanced Conversions (better data quality)
  5. Offline Conversion Import (B2B, phone sales)

Minimum: #1 (Google Ads Conversion Tracking) Recommended: #1 + #2 + #3 Advanced: All 5

Setup 1: Google Ads Conversion Tracking (Foundation)

Step 1: Create Conversion Action

Google Ads β†’ Tools β†’ Conversions β†’ + Conversion
β†’ Website
β†’ Conversion name: "Purchase" (or "Lead", "Signup", etc.)

Settings:

Category: Purchase (or Lead, Signup, etc.)
Value:
  - "Same value for each conversion" (Lead-Gen)
  - "Use different values for each conversion" (E-Commerce) βœ“
Default value: Optional (fallback)
Count:
  - "Every" (E-Commerce - multiple purchases count)
  - "One" (Lead-Gen - only first lead counts) βœ“
Conversion window: 30 days (default, adjustable)

Step 2: Get Tag Code

β†’ "Use Google Tag Manager" or "Install tag yourself"

Code snippet:

<!-- Global Site Tag (gtag.js) - Google Ads: XXXXXX -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'AW-XXXXXX');
</script>

Installation: On ALL pages (in <head>)

Step 3: Conversion Event Tag

Installation: Only on confirmation page (after purchase/lead)

<!-- On Thank You page / Order confirmation page -->
<script>
  gtag('event', 'conversion', {
    'send_to': 'AW-XXXXXX/XXXXXXX', // Your Conversion ID
    'value': 129.99, // Dynamic!
    'currency': 'EUR',
    'transaction_id': 'T12345' // Unique per conversion
  });
</script>

Dynamic values (important!):

PHP example:

<script>
  gtag('event', 'conversion', {
    'send_to': 'AW-XXXXXX/XXXXXXX',
    'value': <?php echo $order_total; ?>,
    'currency': 'EUR',
    'transaction_id': '<?php echo $order_id; ?>'
  });
</script>

JavaScript example (Single Page Apps):

// On conversion event
gtag('event', 'conversion', {
  'send_to': 'AW-XXXXXX/XXXXXXX',
  'value': orderData.total,
  'currency': 'EUR',
  'transaction_id': orderData.id
});

Step 4: Testing

Test 1: Tag Assistant

1. Install Google Tag Assistant (Chrome Extension)
2. Visit website
3. Open Tag Assistant
4. Should show: "Google Ads Conversion Tracking (AW-XXXXXX)"

Test 2: Test conversion

1. Complete conversion (test purchase/lead)
2. Google Ads β†’ Tools β†’ Conversions β†’ Status
3. After 1-2 hours: Should show test conversion

Important: First conversions take 24-48h to appear completely!

Setup 2: Google Analytics 4 Integration

Why GA4 additionally?

  • Advanced analysis (user journey, funnel, etc.)
  • Cross-device tracking
  • Audience building for remarketing
  • Better attribution

Step 1: Create GA4 Property

Google Analytics β†’ Admin β†’ Create Property
β†’ Property name: "My Website"
β†’ Time zone: Your country
β†’ Currency: EUR

Step 2: Create Data Stream

β†’ Add data stream β†’ Web
β†’ Website URL: https://yourdomain.com
β†’ Stream name: "Website"
β†’ Create

Note Measurement ID: G-XXXXXXXXXX

Step 3: Install GA4 Tag

Option A: Direct (without GTM):

<!-- Global Site Tag (gtag.js) - Google Analytics -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'G-XXXXXXXXXX');
</script>

Option B: Via Google Tag Manager (recommended, see Setup 3)

Step 4: E-Commerce Tracking

Purchase event (on confirmation page):

gtag('event', 'purchase', {
  transaction_id: 'T12345',
  value: 129.99,
  currency: 'EUR',
  tax: 20.76,
  shipping: 4.99,
  items: [{
    item_id: 'SKU123',
    item_name: 'Nike Air Max 2025',
    item_category: 'Shoes',
    price: 129.99,
    quantity: 1
  }]
});

Other important events:

View item (product page):

gtag('event', 'view_item', {
  currency: 'EUR',
  value: 129.99,
  items: [{
    item_id: 'SKU123',
    item_name: 'Nike Air Max 2025'
  }]
});

Add to cart:

gtag('event', 'add_to_cart', {
  currency: 'EUR',
  value: 129.99,
  items: [{
    item_id: 'SKU123',
    item_name: 'Nike Air Max 2025'
  }]
});

Begin checkout:

gtag('event', 'begin_checkout', {
  currency: 'EUR',
  value: 129.99,
  items: [...]
});

Step 5: Google Ads ↔ GA4 Linking

GA4: Admin β†’ Product Links β†’ Google Ads Links
β†’ Create link
β†’ Select Google Ads account
β†’ Enable auto-tagging: YES
β†’ Import conversion events: YES (purchase, submit_form, etc.)

Advantage: GA4 conversions usable in Google Ads!

Why GTM?

  • Central tag management (no more code changes!)
  • Version control
  • Testing & preview mode
  • Easier for marketers (less IT dependency)

Step 1: Create GTM Container

tagmanager.google.com β†’ Create account
β†’ Container name: "My Website"
β†’ Container type: Web
β†’ Create

Note container code

Step 2: GTM Code on Website

<!-- In <head> -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','GTM-XXXXXX');</script>

<!-- In <body> (immediately after opening tag) -->
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-XXXXXX"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>

Step 3: Configure Tags in GTM

Tag 1: Google Ads Conversion Tracking

GTM β†’ Tags β†’ New
β†’ Tag Configuration: Google Ads Conversion Tracking
β†’ Conversion ID: AW-XXXXXX
β†’ Conversion Label: XXXXXXX
β†’ Conversion Value: {{order_total}} (Variable!)
β†’ Trigger: Custom Event "purchase"

Tag 2: GA4 Configuration

Tags β†’ New
β†’ Tag Type: Google Analytics: GA4 Configuration
β†’ Measurement ID: G-XXXXXXXXXX
β†’ Trigger: All Pages

Tag 3: GA4 Purchase Event

Tags β†’ New
β†’ Tag Type: Google Analytics: GA4 Event
β†’ Event Name: purchase
β†’ Event Parameters:
  - transaction_id: {{Transaction ID}}
  - value: {{Order Total}}
  - currency: EUR
  - items: {{Items Array}}
β†’ Trigger: Custom Event "purchase"

Step 4: DataLayer Push (on website)

On confirmation page:

<script>
  window.dataLayer = window.dataLayer || [];
  dataLayer.push({
    'event': 'purchase',
    'transactionId': 'T12345',
    'transactionTotal': 129.99,
    'transactionTax': 20.76,
    'transactionShipping': 4.99,
    'ecommerce': {
      'purchase': {
        'actionField': {
          'id': 'T12345',
          'revenue': '129.99',
          'tax': '20.76',
          'shipping': '4.99'
        },
        'products': [{
          'name': 'Nike Air Max 2025',
          'id': 'SKU123',
          'price': '129.99',
          'category': 'Shoes',
          'quantity': 1
        }]
      }
    }
  });
</script>

Step 5: Testing in GTM

GTM β†’ Preview mode
β†’ Enter website URL
β†’ Complete conversion
β†’ GTM shows: Which tags fire

Setup 4: Enhanced Conversions

What: Improved conversion accuracy through first-party data

Why important?

  • iOS 14.5+ & cookie restrictions = less tracking
  • Enhanced Conversions uses hashed email/phone
  • +10-30% more measured conversions!

Setup Methods

Method 1: Automatic (GTM - easiest)

GTM β†’ Tags β†’ Google Ads Conversion Tag
β†’ Advanced Settings β†’ Enhanced Conversions
β†’ "Automatically collect from website data": ON
β†’ Save

GTM automatically detects: Email, phone, name, address from form fields

Method 2: Manual (code)

gtag('event', 'conversion', {
  'send_to': 'AW-XXXXXX/XXXXXXX',
  'value': 129.99,
  'currency': 'EUR',
  'transaction_id': 'T12345',
  // Enhanced Conversion data
  'email': 'user@example.com', // Automatically hashed!
  'phone_number': '+491234567890',
  'address': {
    'first_name': 'Max',
    'last_name': 'Mustermann',
    'street': 'Main Street 1',
    'city': 'Munich',
    'postal_code': '80331',
    'country': 'DE'
  }
});

IMPORTANT: Data is automatically hashed (GDPR-compliant!)

Verification:

Google Ads β†’ Tools β†’ Conversions
β†’ Status: "Active" + "Enhanced conversions: active"

Setup 5: Offline Conversion Tracking

For: B2B, phone sales, physical stores

Use case:

1. User clicks Google Ad
2. Fills lead form (online conversion)
3. Sales team contacts (offline)
4. Customer purchases for €50,000 (offline conversion)

Problem: Google Ads only sees lead (€0), not purchase (€50,000)!

Solution: Offline conversion import

Setup

Step 1: Activate GCLID tracking

Google Ads β†’ Settings β†’ Account Settings
β†’ Auto-tagging: ON

Step 2: Store GCLID in CRM

// On lead form submit
const urlParams = new URLSearchParams(window.location.search);
const gclid = urlParams.get('gclid');

// GCLID in hidden field
document.getElementById('gclid_field').value = gclid;

// Or: Store in cookie
document.cookie = `gclid=${gclid}; max-age=2592000`; // 30 days

Step 3: Create offline conversion action

Google Ads β†’ Tools β†’ Conversions β†’ +
β†’ Import β†’ "Clicks"
β†’ Name: "Offline Purchase"
β†’ Create

Step 4: Upload conversions

Via UI (manual):

Google Ads β†’ Tools β†’ Conversions β†’ Uploads
β†’ Select "Offline Purchase"
β†’ Upload CSV:

Google Click ID, Conversion Name, Conversion Time, Conversion Value, Conversion Currency
abc123xyz, Offline Purchase, 2025-01-15 10:30:00, 50000, EUR
def456uvw, Offline Purchase, 2025-01-16 14:20:00, 35000, EUR

Via API (automated):

# Python example (Google Ads API)
from google.ads.googleads.client import GoogleAdsClient

client = GoogleAdsClient.load_from_storage()
service = client.get_service("ConversionUploadService")

click_conversion = client.get_type("ClickConversion")
click_conversion.gclid = "abc123xyz"
click_conversion.conversion_action = "customers/XXX/conversionActions/YYY"
click_conversion.conversion_date_time = "2025-01-15 10:30:00"
click_conversion.conversion_value = 50000
click_conversion.currency_code = "EUR"

response = service.upload_click_conversions(
    customer_id="XXXXXX",
    conversions=[click_conversion],
    partial_failure=True
)

Important: Upload within 90 days of click!

Troubleshooting Tracking Issues

Problem 1: "No conversions measured"

Checklist:

  • [ ] Conversion tag on confirmation page? (not on checkout!)
  • [ ] Tag firing? (check with Tag Assistant)
  • [ ] Conversion value dynamically passed?
  • [ ] transaction_id unique?
  • [ ] Waited 24-48h? (first conversions take time)

Testing:

Google Ads β†’ Tools β†’ Conversions β†’ Diagnostics
β†’ Shows errors

Problem 2: "Duplicate conversions"

Cause: User reloads thank you page multiple times

Solution: Use transaction_id!

gtag('event', 'conversion', {
  'send_to': 'AW-XXXXXX/XXXXXXX',
  'transaction_id': 'T12345' // Unique! Google automatically deduplicates
});

Problem 3: "Conversion value is 0"

Cause: Static value instead of dynamic

❌ Wrong:

'value': 129.99 // Hardcoded!

βœ… Correct:

'value': {{order_total}} // Dynamic!

Problem 4: "Conversions significantly lower than expected"

Possible causes:

  1. Ad blockers: 10-30% users use ad blockers β†’ don't track
  2. Cookie restrictions: Safari ITP, Firefox ETP
  3. Cross-device: User clicks on mobile, buys on desktop
  4. Attribution window: Default 30 days (user buys after 35 days = not counted)

Solution:

  • Activate Enhanced Conversions (partially solves 1+2)
  • GA4 cross-device tracking
  • Increase attribution window (Google Ads β†’ Conversion Settings)

Problem 5: "GTM tags not firing"

Debug:

GTM β†’ Preview mode β†’ Visit website
β†’ Shows: Which tags fire (or don't)

Common mistakes:

  • ❌ Trigger misconfigured
  • ❌ Variable not defined
  • ❌ GTM container not published (!!)
  • ❌ DataLayer event misspelled

Advanced: Server-Side Tracking

What: Tracking runs through your own server, not browser

Advantages:

  • βœ… Bypasses ad blockers
  • βœ… Better data quality
  • βœ… More GDPR-compliant (first-party data)
  • βœ… Faster website (fewer client-side scripts)

Disadvantages:

  • ❌ Complex (server setup)
  • ❌ Costs (server infrastructure)
  • ❌ Technical know-how required

Setup: Google Tag Manager Server-Side Container (outside this guide)

Tracking Compliance (GDPR)

Important: Tracking MUST be GDPR-compliant!

Requirements:

  1. Cookie banner: Opt-in before tracking
  2. Privacy policy: Document tracking
  3. Data processing agreement: Sign Google Ads DPA

Cookie banner integration:

// Cookiebot example
window.addEventListener('CookiebotOnAccept', function (e) {
  if (Cookiebot.consent.marketing) {
    // User accepted marketing cookies
    // Now activate Google Ads tracking
    gtag('consent', 'update', {
      'ad_storage': 'granted',
      'analytics_storage': 'granted'
    });
  }
});

Consent Mode (Google):

<script>
  // BEFORE gtag.js
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}

  gtag('consent', 'default', {
    'ad_storage': 'denied',
    'analytics_storage': 'denied'
  });

  // After user consent: Update
  gtag('consent', 'update', {
    'ad_storage': 'granted',
    'analytics_storage': 'granted'
  });
</script>

Tracking Checklist

Foundation βœ…:

  • [ ] Google Ads Conversion Tracking active
  • [ ] Conversion value dynamically passed
  • [ ] transaction_id for deduplication
  • [ ] Testing performed (Tag Assistant)
  • [ ] First test conversions measured

Advanced βœ…:

  • [ ] GA4 integrated
  • [ ] E-Commerce events (view_item, add_to_cart, purchase)
  • [ ] Google Ads ↔ GA4 linked
  • [ ] GTM setup (optional but recommended)

Expert βœ…:

  • [ ] Enhanced Conversions activated
  • [ ] Offline Conversion Tracking (B2B)
  • [ ] GCLID stored in CRM
  • [ ] GDPR-compliant cookie banner

Tools for Tracking

Testing:

  • Google Tag Assistant (Chrome Extension) - free
  • GTM Preview Mode (built-in) - free
  • Google Analytics DebugView - free

Tag management:

  • Google Tag Manager (free)
  • Segment (from $120/month) - Enterprise
  • Tealium (custom pricing) - Enterprise

Cookie consent:

  • Cookiebot (from €9/month)
  • OneTrust (custom pricing)
  • Usercentrics (from €5/month)

Monitoring:

  • Google Ads Conversion Tracking Status - built-in
  • GA4 Real-Time Reports - built-in

Conclusion

Tracking = Foundation for successful Google Ads

Setup priority:

Day 1:

  • βœ… Google Ads Conversion Tracking (foundation!)
  • βœ… Dynamic conversion value

Week 1:

  • βœ… Testing & verification
  • βœ… GA4 setup
  • βœ… E-Commerce events

Week 2:

  • βœ… GTM migration (optional)
  • βœ… Enhanced Conversions
  • βœ… GDPR compliance

Month 2+:

  • βœ… Offline conversions (B2B)
  • βœ… Advanced attribution
  • βœ… Server-side tracking (optional)

Without proper tracking: No optimization possible!

Tracking Setup Help


FAQ: Google Ads Tracking

How do I set up Google Ads Conversion Tracking?

4 steps: 1) Google Ads β†’ Tools β†’ Conversions β†’ + Conversion β†’ Website. 2) Conversion name (e.g., "Purchase"), category, value option (dynamic for e-commerce!), count method. 3) Global Site Tag on ALL pages (in <head>). 4) Conversion Event Tag on confirmation page with value, currency, transaction_id. Testing: Tag Assistant + perform test conversion. First conversions visible after 24-48h. Critical: Conversion value MUST be dynamic!

What's the difference between Google Ads and GA4 tracking?

Both complement each other! Google Ads Tracking: Focus on campaign optimization, direct attribution to keywords/ads, essential for Smart Bidding. GA4: Advanced analysis (user journey, funnel, demographics), cross-device tracking, audience building, better attribution. Best practice: Use both! Google Ads for optimization, GA4 for deeper insights. Setup: Link both (GA4 β†’ Admin β†’ Google Ads Links).

Why aren't my conversions being measured?

5 most common causes: 1) Conversion tag not on confirmation page (only on checkout!). 2) Tag not firing (check with Tag Assistant). 3) Haven't waited 24-48h. 4) transaction_id missing or not unique. 5) Ad blockers (10-30% users). Solution: Use Tag Assistant, perform test conversion, activate Enhanced Conversions (partially bypasses ad blockers), GTM debug mode.

What is Enhanced Conversions and should I activate it?

Enhanced Conversions = improved tracking accuracy through first-party data (email, phone, address - automatically hashed!). Benefits: +10-30% more measured conversions, better data quality despite cookie restrictions (iOS 14.5+, Safari ITP), GDPR-compliant (hashing). Setup: GTM β†’ Google Ads Conversion Tag β†’ "Automatically collect from website data": ON (easiest method). YES, definitely activate! No disadvantages, only benefits.

How do I track offline conversions (B2B, phone sales)?

Offline Conversion Tracking setup: 1) Activate auto-tagging in Google Ads. 2) Store GCLID (Google Click ID) in CRM when lead form submitted. 3) Create offline conversion action (Google Ads β†’ Conversions β†’ Import β†’ Clicks). 4) Upload conversions: Via CSV (manual) or API (automated) with gclid, conversion_time, value. Important: Upload within 90 days of click! Use case: Lead online (€0) β†’ sales call β†’ offline purchase (€50k) β†’ Google Ads now sees €50k value!

What is Google Tag Manager and do I need it?

GTM = tag management system for central management of all tracking tags. Benefits: No more code changes (IT-independent), version control, testing/preview mode, easier for marketers. Without GTM: Every tag directly in HTML (on change: developer needed). With GTM: Manage all tags in GTM UI. Need it? No (optional), but HIGHLY recommended when: 5+ tags (Ads, GA4, Facebook, etc.), frequent changes, non-technical team. Setup: 1-2 hours initially, but saves time long-term!

How do I ensure my tracking is GDPR-compliant?

GDPR requirements: 1) Cookie banner with opt-in BEFORE tracking (Cookiebot, OneTrust, etc.). 2) Privacy policy: Document tracking. 3) Google Ads DPA (Data Processing Agreement) sign (Google Ads β†’ Admin β†’ Settings β†’ Data Processing). 4) Use Consent Mode (Google): Fire tags only after user consent. Setup: Cookie banner β†’ On accept: gtag('consent', 'update', {'ad_storage': 'granted'}). Without compliance: Warnings + fines possible!

How do I test if my tracking works?

4 test methods: 1) Google Tag Assistant (Chrome Extension): Shows which tags fire on page. 2) GTM Preview Mode: Real-time debug (which tags, triggers, variables). 3) Perform test conversion: Complete purchase process, then check Google Ads β†’ Conversions β†’ Status (after 1-2h). 4) GA4 DebugView: Real-time event monitoring. Important: Test BEFORE launch! Validate test conversions via "Conversion β†’ Diagnostics". Often overlooked: Testing in incognito mode (clean cookies).

Mijo Jurisic

Mijo Jurisic

Google Ads consultant & founder of MJ Marketing. Five-plus years of hands-on practice β€” from a self-taught start to the Google Premier Partner programme with 500+ direct Google Ads clients and €20M+ in managed media spend.

Share this article:

Share: