Gravity Forms + Google Ads Conversion Tracking Setup

I see this exact broken setup in about 35% of WordPress sites I audit. Gravity Forms is firing the submission event, Google Ads shows zero conversions, and you’re left wondering if your campaigns are actually working. The problem isn’t your forms — it’s that Gravity Forms uses AJAX submissions with a specific event (gform_confirmation_loaded) that most people completely miss.

Here’s how to fix it properly with Enhanced Conversions, which I now set up on 100% of client accounts because iOS tracking losses hit form conversions hardest.

What You’ll Have Working By The End

Prerequisites

Step 1: Create the Conversion Action in Google Ads

Log into Google Ads and navigate to Goals → Conversions → New conversion action → Website.

Set these specific values:

Click “Create and Continue.” You’ll get a Conversion ID (looks like AW-123456789) and Conversion Label (looks like AbCdEfGhIj_12AbCdEf). Copy both — you need them for GTM.

Step 2: Set Up the Data Layer Push in WordPress

Gravity Forms fires gform_confirmation_loaded when a form submits successfully. You need to catch this event and push form data to the data layer for Enhanced Conversions.

Add this code to your theme’s functions.php or in a custom plugin:

// Track Gravity Forms submissions for Google Ads Enhanced Conversions
add_action('wp_footer', 'gf_google_ads_tracking_script');

function gf_google_ads_tracking_script() {
    ?>
    <script>
    jQuery(document).ready(function($) {
        $(document).on('gform_confirmation_loaded', function(event, formId) {
            // Get form data from the submitted form
            var formData = {
                'email': '',
                'phone': '',
                'first_name': '',
                'last_name': ''
            };
            
            // Extract data from form fields (adjust field IDs based on your form)
            var form = $('#gform_' + formId);
            
            // Most common Gravity Forms field mappings
            formData.email = form.find('input[type="email"]').val() || 
                            form.find('input[name*="email"]').val() || '';
            formData.phone = form.find('input[type="tel"]').val() || 
                            form.find('input[name*="phone"]').val() || '';
            formData.first_name = form.find('input[name*="first"]').val() || 
                                form.find('input[name*="fname"]').val() || '';
            formData.last_name = form.find('input[name*="last"]').val() || 
                               form.find('input[name*="lname"]').val() || '';
            
            // Push to data layer for GTM
            window.dataLayer = window.dataLayer || [];
            window.dataLayer.push({
                'event': 'gravity_form_submission',
                'form_id': formId,
                'user_data': {
                    'email_address': formData.email,
                    'phone_number': formData.phone,
                    'first_name': formData.first_name,
                    'last_name': formData.last_name
                }
            });
            
            console.log('Gravity Form submission tracked:', formId, formData);
        });
    });
    </script>
    <?php
}

Important: If your Gravity Forms use different field types or you have specific field IDs, you’ll need to adjust the selectors. Check your form HTML or use input_X format where X is the field ID (like input_3 for field ID 3).

Step 3: Create the GTM Trigger

In Google Tag Manager, create a new Custom Event trigger:

Name it “GF Submission - Google Ads” and save.

Step 4: Set Up Data Layer Variables

Create these Data Layer Variables in GTM (Variables → New → Data Layer Variable):

  1. Variable Name: “DL - Form ID”
    Data Layer Variable Name: form_id

  2. Variable Name: “DL - User Email”
    Data Layer Variable Name: user_data.email_address

  3. Variable Name: “DL - User Phone”
    Data Layer Variable Name: user_data.phone_number

  4. Variable Name: “DL - User First Name”
    Data Layer Variable Name: user_data.first_name

  5. Variable Name: “DL - User Last Name”
    Data Layer Variable Name: user_data.last_name

Step 5: Create the Google Ads Conversion Tag

Create a new Google Ads Conversion Tracking tag in GTM:

Tag Configuration:

Enhanced Conversions Settings (this is crucial):

Triggering: Select your “GF Submission - Google Ads” trigger from Step 3.

Name the tag “Google Ads Conv - Gravity Forms” and save.

Step 6: Testing & Verification

Test the Data Layer Push

  1. Enable GTM Preview mode
  2. Fill out and submit your Gravity Form
  3. In the GTM debug panel, look for the gravity_form_submission event
  4. Click on the event and check the Data Layer tab — you should see user_data with email, phone, and name fields populated

If you don’t see the event, check your browser console for JavaScript errors. The most common issue is jQuery not being loaded or conflicts with the gform_confirmation_loaded event.

Test the Google Ads Tag

  1. In GTM preview, after submitting the form, click on the gravity_form_submission event
  2. Look for your Google Ads conversion tag in the “Tags Fired” section
  3. Click on the tag to see if Enhanced Conversions data is being passed correctly

Verify in Google Ads

  1. Go to Google Ads → Goals → Conversions
  2. Find your conversion action and check the “Status” column — it should show “Recording conversions” within 3 hours
  3. Check the “Enhanced conversions” column — it should show a percentage (usually 60-90% for forms with email collection)

Cross-check the numbers: Compare Gravity Forms entries (WordPress Admin → Forms → Entries) with Google Ads conversion counts. Acceptable variance is 5-15% due to attribution windows and bot filtering.

Troubleshooting

Problem: GTM shows gravity_form_submission event but no form data in user_data
Solution: Your field selectors are wrong. Inspect your form HTML and update the jQuery selectors in the PHP code. Look for actual name attributes or id attributes that match Gravity Forms’ pattern.

Problem: Google Ads shows “Not recording conversions” after 24 hours
Solution: Check your Conversion ID and Label are correct. The most common mistake is copying the wrong label or including extra characters. Also verify your GTM container is published, not just previewed.

Problem: Enhanced Conversions showing 0% match rate
Solution: Your email field is empty or malformed. Check that users are actually entering valid email addresses and that your jQuery selector is finding the email input. Test with a valid email like “test@gmail.com”.

Problem: Double-counting conversions (2x the actual form submissions)
Solution: You probably have both the GTM tag AND the Google Ads global site tag firing. Remove one of them. Also check that your conversion action is set to “One” not “Every” for counting.

Problem: Form submissions work but Google Ads conversions are delayed by hours
Solution: This is normal. Google Ads processes conversions in batches. Enhanced Conversions can take 2-6 hours to show up, especially for new conversion actions. Don’t panic if numbers don’t match immediately.

Problem: AJAX forms not triggering the gform_confirmation_loaded event
Solution: Some Gravity Forms setups disable AJAX. Check your form settings and ensure “Enable AJAX” is checked. If it’s disabled by design, you’ll need to use a different event like form submission success page loads.

What To Do Next

Now that your Gravity Forms are tracking properly in Google Ads, consider these next steps:

Ready to audit your entire tracking setup? I’ll review your Google Ads + Gravity Forms integration for free and show you exactly what’s broken. Get your free tracking audit — I usually find 3-5 fixable issues that improve conversion data quality.

This guide is part of the Google Ads Conversion Tracking Hub — covering every major form, CRM, and ecommerce platform integration with Google Ads.