How do you capture UTM parameters in Gravity Forms?
To capture UTM parameters in Gravity Forms, add a Hidden field for each parameter, open its Advanced tab, tick "Allow field to be populated dynamically", and set the parameter name to utm_source, utm_medium and so on. Gravity Forms then fills each field from the page URL and saves it with the entry.
- Add a Hidden field per UTM parameter.
- Enable dynamic population.
- Set the parameter name.
- Store UTMs for visitors who browse first.
- Test with a tagged URL.
A tagged link opens the page with your Gravity form, the hidden fields are populated, and the entry reaches your CRM with its source.
Step 1: add hidden fields
In the form editor, add a Hidden field from Standard Fields. Label it utm_source. Repeat for medium, campaign, term and content.
Step 2: enable dynamic population
Open each field's Advanced tab, tick Allow field to be populated dynamically, and enter the parameter name:
| Field label | Parameter name |
|---|---|
| utm_source | utm_source |
| utm_medium | utm_medium |
| utm_campaign | utm_campaign |
| utm_term | utm_term |
| utm_content | utm_content |
Gravity Forms' dynamic population docs cover the current options, including the gform_field_value filter for PHP.
Step 3: keep values across pages
Dynamic population reads the current URL. If the visitor lands on a blog post and submits on the contact page, the fields stay empty. Store UTMs on arrival and fill the fields later, as explained in persisting UTM parameters across pages. Page caching can also serve stale values, so test with your cache plugin on.
Step 4: send entries to your CRM
Gravity Forms add-ons (HubSpot, Salesforce and others) and webhooks can map hidden fields to CRM properties. Create the properties first.
Step 5: test
Visit the form page with ?utm_source=test, submit, and check the entry. Then land on another page with the tag, browse to the form, and submit again.
That's the manual setup. To skip it, pre-register for Trakt and every Gravity Forms entry arrives with its source attached.
Why Gravity Forms UTM tracking breaks (and how Trakt helps)
Each new form needs the fields. Cache serves old pages. Multi-page forms and AJAX submissions add edge cases.
How Trakt closes the gap
The Gravity Forms integration adds auto-injected hidden UTM fields to every form, keeps the source in a first-party cookie, syncs source and revenue into your CRM, and sends new-lead alerts by email and Slack. The WordPress UTM tracking guide covers sites with several plugins.
Manual vs. Trakt, by requirement
| Requirement | Dynamic population | Trakt |
|---|---|---|
| Setup per form | Five fields each | Once per site |
| UTMs from earlier pages | Extra code | First-party cookie |
| Source in CRM | Add-on mapping | Synced |
| A form people finish | Same either way | Same either way |
FAQ
Can Gravity Forms capture UTM parameters?
Yes. Hidden fields with dynamic population read UTM parameters from the URL and save them in the entry.
What parameter name do I use for Gravity Forms dynamic population?
Use the exact UTM name, such as utm_source. It must match the query string key in the URL.
Why are my Gravity Forms UTM fields empty?
The visitor probably reached the form page without tags in the URL, or a cached page was served. Store UTMs on arrival and test with caching on.
Can I capture GCLID in Gravity Forms?
Yes, the same way: a hidden field populated from the gclid parameter.
How do I send Gravity Forms UTMs to HubSpot?
Use the HubSpot add-on or a webhook and map each hidden field to a HubSpot property.
Is there a plugin-free way to track Gravity Forms sources?
Trakt adds auto-injected hidden UTM fields to Gravity Forms and carries the source across pages.
What to do first
Open your main Gravity form, add a utm_source hidden field with dynamic population, and submit it via ?utm_source=test. Then try it from another page.
