Skip to main content
Gravity Forms → Google AdsIntegration guide

Connecting Gravity Forms to Google Ads

Gravity Forms stores the entry in your own WordPress database, which makes it one of the easier sources to join correctly. Google Ads knows what you spent and which click it came from, and nothing at all about what happened afterwards. The join between them succeeds or fails on one thing: whether the GCLID reaches the Gravity Forms entry before the conversion happens, because Google Ads can only match a conversion it can tie back to a click it recognizes.

Free30 minutesNo obligation

Specific to this pair

Gravity Forms to Google Ads: upload the lead that qualified

In gform_after_submission, read the GCLID from a hidden field or fall back to the _gcl_aw cookie, and store it in entry meta. Upload a lead conversion at submission and a valued conversion when the lead becomes a customer within 90 days, with one primary. Use hashed email for enhanced conversions for leads, respect consent, and skip spam.

Google Ads gives you a way around the cached hidden field: if the Google tag's conversion linker is running, the click is also stored in the _gcl_aw first-party cookie, and the submission POST sends that cookie to your server. In gform_after_submission, read the GCLID from the hidden field if it is populated and fall back to the cookie if not. Store it in entry meta, so it sits in your own wp_gf_entry tables next to the lead.

The valuable upload is not the submission. Gravity Forms entries can be starred, edited and given notes, and many teams already qualify leads in the entries screen or a connected CRM. Upload the entry as a lead conversion at submission, then upload a second, valued conversion when the lead becomes a customer, using the stored GCLID while the click is still within 90 days. Make sure only one of those two actions is set as primary for bidding.

When the GCLID is missing, enhanced conversions for leads can match on the hashed email field from the entry instead. Normalize it (trim, lowercase) before hashing, and only send entries whose consent checkbox was ticked if your form has one. Never upload entries marked as spam; Google Ads will happily optimize toward bots that fill forms.

Gravity Forms → Google Ads · what breaks

Why this join usually fails — Gravity Forms → Google Ads

  1. 01

    The GCLID never reaches Gravity Forms

    The identifier must be written into a hidden field with dynamic population enabled, and that only works if the parameter is on the URL when the page renders. Page caching serves a cached render to the visitor, so the dynamic population never runs — the same caching problem that breaks WooCommerce.

  2. 02

    Dynamic population fails silently under page caching

    The field is configured correctly and still arrives empty, because the visitor was served a cached page rendered for someone else. This is the most common Gravity Forms failure and it looks like nothing is wrong.

  3. 03

    The conversion action is the wrong type

    Uploads against a standard website conversion action fail. The action has to be created as 'Import' — and existing actions cannot be converted, so this is discovered late and requires starting a new action with no history.

  4. 04

    Nothing reconciles afterwards

    Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.

Gravity Forms → Google Ads · the fix

What working looks like — Gravity Forms → Google Ads

  • The GCLID on every entry

  • Conversions arriving in Google Ads

    Conversions appear against the campaign, ad group and keyword that produced the click, with the value you sent — which is what lets Smart Bidding optimize toward revenue instead of toward form fills.

  • Reconciled against the source

Gravity Forms → Google Ads · architecture

How Gravity Forms and Google Ads actually connect

  1. 1

    Gravity Forms holds the truth

    The entry lives in your database with every field value attached. You can query it, back it up and reconcile against it without depending on any third party, which is a real advantage over hosted form tools.

  2. 2

    Google Ads needs a click to match

    Google Ads matches an uploaded conversion back to a click using the GCLID. The conversion action must be created as an import type — an upload against a website-tag conversion action is rejected. Uploads must also land inside Google's window: the click has to be within the last 90 days.

  3. 3

    The identifier is the bridge

    The GCLID, captured at the visit and carried into the Gravity Forms entry.

  4. 4

    The event source decides reliability

    Fire server-side from the PHP hook. This runs regardless of caching, AJAX submission, or what the confirmation page does.

  5. 5

    Deduplication at the destination

    Google deduplicates on the combination of GCLID, conversion action and conversion time. Uploading the same click twice against the same action at the same timestamp is rejected rather than double-counted, but uploading it against a second conversion action counts twice — which is how most double-counting here actually happens.

Gravity Forms → Google Ads · normal or broken

Working vs. broken, side by side — Gravity Forms → Google Ads

Normal, not a fault

  • The GCLID present on the entry

  • Sent from the gform_after_submission hook

  • Deduplicated correctly

    Google deduplicates on the combination of GCLID, conversion action and conversion time. Uploading the same click twice against the same action at the same timestamp is rejected rather than double-counted, but uploading it against a second conversion action counts twice — which is how most double-counting here actually happens.

  • Reconciles with the source

Actually broken

  • The GCLID missing on most records

    The identifier must be written into a hidden field with dynamic population enabled, and that only works if the parameter is on the URL when the page renders. Page caching serves a cached render to the visitor, so the dynamic population never runs — the same caching problem that breaks WooCommerce.

  • Sent from the browser

    The field is configured correctly and still arrives empty, because the visitor was served a cached page rendered for someone else. This is the most common Gravity Forms failure and it looks like nothing is wrong.

  • Counted twice, or not at all

    Uploads against a standard website conversion action fail. The action has to be created as 'Import' — and existing actions cannot be converted, so this is discovered late and requires starting a new action with no history.

  • Nobody has reconciled it

Gravity Forms → Google Ads · diagnose

Diagnostic order — Gravity Forms → Google Ads

  1. 01

    Count entrys carrying the GCLID

  2. 02

    Follow one real conversion end to end

  3. 03

    Submit a test entry through a cached page

    Not through a logged-in admin session, which bypasses the cache. If the hidden field is empty on the cached path and populated on the admin path, caching is your cause.

  4. 04

    Check the conversion action type and the upload diagnostics

    In Google Ads, Goals → Conversions → Uploads shows every upload with its error rows. Read the errors rather than the success count; a file can import successfully with most rows rejected.

  5. 05

    Read the match rate, not the success message

    Google Ads reports uploads in Goals → Conversions → Uploads, with rows accepted and rows failed. A green result means the file parsed, not that the clicks matched. The number to watch is how many conversions actually appear against campaigns afterwards.

Gravity Forms → Google Ads · prove

How it gets proven — Gravity Forms → Google Ads

Source of truth

The Gravity Forms entries list for the same window, or the wp_gf_entry table directly.

  • The GCLID confirmed present on a live entry.
  • The Uploads diagnostics read row by row, with the accepted count reconciled against conversions appearing in campaign reporting.
  • Entry meta confirmed populated on a submission made from a fully cached page as an anonymous visitor.

Gravity Forms → Google Ads · free audit

What we check in the free audit

  • Count entrys carrying the GCLID
  • Follow one real conversion end to end
  • Submit a test entry through a cached page
  • Check the conversion action type and the upload diagnostics
  • Read the match rate, not the success message

Checked against

The Gravity Forms entries list for the same window, or the wp_gf_entry table directly.

Get my free conversion tracking audit

Free30 minutesNo obligation

Gravity Forms → Google Ads · when not to buy

When you don't need this — Gravity Forms → Google Ads

  • Measure identifier coverage yourself first — pull your last hundred entrys and count how many carry the GCLID.
  • If your site has no caching layer and one form, a developer can wire this in an afternoon. Worth trying before hiring anyone.
  • If your sales close inside a few days and your website tag already reports accurately, you may not need offline import at all. It exists to solve the delay between click and revenue.

Gravity Forms → Google Ads · what we deliver

What gets built — Gravity Forms → Google Ads

  • Identifier capture into Gravity Forms

    Hidden field with 'allow field to be populated dynamically' enabled and a parameter name set, plus a cookie fallback via a gform filter so the identifier survives a visitor who browsed several pages before converting.

  • Event source: the gform_after_submission hook

    Fire server-side from the PHP hook. This runs regardless of caching, AJAX submission, or what the confirmation page does.

  • Dispatch to Google Ads

    Offline Conversion Import through the Google Ads API, or a scheduled upload. Enhanced conversions for leads where GCLID coverage is poor and you have consented email addresses.

  • Reversals where they exist

    Nothing to reverse, though entries marked spam should be excluded from the send.

Written guarantee

95%+ tracking accuracy

Measured against The Gravity Forms entries list for the same window, or the wp_gf_entry table directly.. Miss it and we keep working at no cost.

Get my free conversion tracking audit

From $400 · See packages

FAQ

Gravity Forms → Google Ads questions, answered

Read the _gcl_aw cookie from the request in gform_after_submission, assuming the Google tag's conversion linker is on your site. It holds the most recent GCLID even when the cached page skipped dynamic population.

Free · 30 min

Get Gravity Forms and Google Ads joined properly

Free30 minutesNo obligation