Title: Qaiyo UTM Tracker for Fluent Forms
Author: qaiyo
Published: <strong>September 29, 2026</strong>
Last modified: September 30, 2026

---

Search plugins

![](https://s.w.org/plugins/geopattern-icon/qaiyo-utm-tracker-for-fluent-forms.svg)

# Qaiyo UTM Tracker for Fluent Forms

 By [qaiyo](https://profiles.wordpress.org/qaiyo/)

[Download](https://downloads.wordpress.org/plugin/qaiyo-utm-tracker-for-fluent-forms.1.1.0.zip)

 * [Details](https://wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/#description)
 * [Reviews](https://wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/#reviews)
 *  [Installation](https://wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/#installation)
 * [Development](https://wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/#developers)

 [Support](https://wordpress.org/support/plugin/qaiyo-utm-tracker-for-fluent-forms/)

## Description

You run Meta and Google Ads, the enquiries arrive through Fluent Forms, and the 
question is always the same: which source and which campaign brought this lead? 
Qaiyo UTM Tracker for Fluent Forms answers it on every entry, with no reporting 
tool in between.

Click one button to add the tracking fields to a form. From then on the plugin remembers
where the visitor arrived from — the campaign parameters of the ad, or the search
engine, social network or website that sent them — writes it into those fields when
the form is sent, and Fluent Forms stores it with the entry: visible on the Entries
screen, in exports and in Fluent Forms’ own reports.

#### What makes it different

 * **The values live in the Fluent Forms entry itself.** No extra database table
   and no second dashboard: source, campaign and click ID are ordinary entry fields,
   so Fluent Forms’ own search, exports, reports and (with Fluent Forms Pro) Advanced
   Filter work on them, and they are kept, exported and erased with the entry.
 * **One click per form.** The settings screen lists your forms and the tracking
   fields each one still needs. “Add missing fields” appends them to the form as
   Hidden Fields through Fluent Forms’ own save, the same way the editor does; nothing
   else in the form changes.
 * **Every lead gets a source, not only ad clicks.** Without campaign parameters
   the source comes from the site that sent the visitor: search engines as “organic”(
   google, bing, duckduckgo…), social networks as “social” (facebook, instagram,
   linkedin…), any other site by its domain as “referral”, and a typed-in address
   as “(direct)” / “(none)”. Ad data always wins: an organic or direct visit never
   replaces the parameters or click ID of an ad. Only the referring domain is used,
   never the full address.
 * **The landing page is recorded too**, without its query string, so you see which
   page the lead first arrived on.
 * **Meta (Facebook and Instagram) Ads work out of the box.** Meta appends the UTM
   parameters you set on the ad — source, medium, campaign, content, term — to the
   landing URL, and the plugin stores them with the entry as they are, for example`
   facebook` / `cpc` / your campaign name / the ad ID. Nothing else to configure.
 * **Survives the way people really convert.** Visitors rarely send the form on 
   the page they land on. UTM parameters are kept for the browser session; the Google
   Ads click ID is kept in a first-party cookie (90 days by default, adjustable),
   because it is only in the address of the very first page and people often come
   back days later.
 * **Google Ads without tracking templates.** Google Ads auto-tagging adds only 
   a click ID (gclid) to its links, no UTM parameters, so most trackers record these
   leads with an empty source. This plugin records them as source “google”, medium“
   cpc” — on the server, just before Fluent Forms stores the entry, so it works 
   even when the visitor’s browser blocks scripts. A source the ad link does set
   always wins.
 * **Fixes your older entries too.** Entries saved before the plugin that carry 
   a click ID but no source show “google” on the Entries screen straight away. A
   one-click, batched tool writes it into those entries for exports and reports 
   as well, the way Fluent Forms itself stores an edited entry, and never overwrites
   an entry that already has a source or that someone edits in the meantime.
 * **Last touch wins, campaigns never mix.** A new campaign visit replaces the values
   of the previous one, so a Google Ads click after a Facebook visit is not recorded
   as Facebook, and a new source never travels with an old utm_content.
 * **Consent-aware.** With the WP Consent API plugin (used by Complianz, CookieYes,
   Cookiebot and others), nothing is stored until the visitor allows marketing cookies,
   and stored values are removed when consent is withdrawn. Suggested privacy-policy
   text is added to the WordPress Policy Guide.
 * **Works with the free Fluent Forms.** Hidden fields and entries are part of Fluent
   Forms itself; Fluent Forms Pro is not required.

#### Tracked fields

utm_source, utm_medium, utm_campaign, utm_content, utm_term, gclid and landing_page.
A field that is not on a form is simply not recorded, so you can leave out the ones
you do not need.

#### Built to stay out of the way

The capture script is a few kilobytes, loads deferred in the footer, has no dependencies
and does not watch the page: it fills the fields when the page loads, when Fluent
Forms opens a form (popups, AJAX-loaded forms) and at the moment the form is sent.
The plugin does not touch Fluent Forms’ Entries screen markup, so nothing shifts
or breaks when Fluent Forms updates its interface.

#### Privacy

The plugin does not connect to any external service and sends nothing anywhere. 
The values stay in the visitor’s browser (sessionStorage and the qfut_gclid cookie)
until a form is sent; after that they are part of the Fluent Forms entry and are
kept, exported and erased with it. Of a referring page only its domain is used. 
Recording organic, social, referral and direct visits can be switched off in the
settings.

#### Translations

The interface is translation-ready, and translations are delivered through translate.
wordpress.org. The author prepares Hungarian, German, French, Spanish, Japanese,
Portuguese (Portugal), Italian, Russian, Turkish and Polish.

#### Trademarks

Fluent Forms, Google Ads, Meta, Facebook and Instagram are trademarks of their respective
owners. This plugin is an independent add-on and is not affiliated with, endorsed
by or sponsored by them.

## Installation

 1. Install and activate Fluent Forms.
 2. Install and activate Qaiyo UTM Tracker for Fluent Forms (Plugins  Add New, or upload
    the ZIP).
 3. Open Fluent Forms  UTM Tracker and click “Add missing fields” next to each form
    you want to track.

That is all: new entries record their source from now on. If you prefer to add the
fields yourself, the screen also lists the field names: add one Hidden Field (Advanced
Fields  Hidden Field) per name in the Fluent Forms editor and type the name into
its Name Attribute.

## FAQ

### Do I need Fluent Forms Pro?

No. The hidden fields and the entries are part of the free Fluent Forms plugin.

### Why is utm_source empty for some Google Ads leads in my old entries?

Google Ads auto-tagging adds only a gclid to the link. The Entries screen already
shows these entries as “google” / “cpc”; to have the value in exports and reports
too, use Fluent Forms  UTM Tracker  Update older entries once.

### Can I filter entries by source or campaign?

Yes. Fluent Forms’ search box finds any value across all entries. With Fluent Forms
Pro, the Advanced Filter also works on the hidden fields (for example utm_source
= google). The Advanced Filter reads the stored per-field data, so for older entries
run Update older entries once; new entries are included automatically.

### Is my form changed when I click “Add missing fields”?

Only by appending the missing tracking fields as Hidden Fields at the end. The form
is saved through Fluent Forms’ own form service, so Fluent Forms checks and stores
it exactly as when you press Save in the editor. If the form is open in the editor
at the same time, reload the editor before you save it there, otherwise it saves
its older copy without the new fields.

### What do “(direct)”, “organic”, “social” and “referral” mean?

They describe visits that did not come through a tagged ad link: “(direct)” / “(
none)” is a typed-in address or a bookmark, “organic” a search engine result, “social”
a social network, and “referral” any other website (its domain becomes the source).
They follow the usual Google Analytics conventions. You can switch this off under“
Visits without campaign parameters”; then only visits with campaign parameters or
a click ID are recorded.

### An organic visit came after an ad click. Which one is recorded?

The ad. Organic, social, referral and direct visits never replace the parameters
or the click ID of an ad; a new ad click does replace an older ad visit.

### Can I get the campaign name for Google Ads leads as well?

Yes, by adding UTM parameters to your ads. In Google Ads, set a Final URL suffix(
account, campaign or ad group level), for example: utm_source=google&utm_medium=
cpc&utm_campaign={campaignid}&utm_content={adgroupid}&utm_term={keyword}. The gclid
keeps working alongside it.

### Where do the numbers in utm_content come from?

That is whatever your ad link puts there. Meta ads often use the ad ID ({{ad.id}});
use {{ad.name}} in the URL parameters of the ad if you prefer the ad’s name.

### What if the visitor comes back through a different ad?

The newest campaign visit wins and replaces the previous values completely.

### Can I record something other than “google” / “cpc”?

Yes, with the qfut_gclid_attribution filter, for example:

    ```
    add_filter( 'qfut_gclid_attribution', function ( $values ) { $values['utm_source'] = 'google_ads'; return $values; } );
    ```

### Does it slow down my site?

The front-end script is small, deferred, and does no work while the visitor browses;
it only reads the address once and fills the form fields.

### Does it work with page caching?

Yes. Everything happens in the visitor’s browser, so cached pages behave exactly
like uncached ones.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Qaiyo UTM Tracker for Fluent Forms” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ qaiyo ](https://profiles.wordpress.org/qaiyo/)

“Qaiyo UTM Tracker for Fluent Forms” has been translated into 1 locale. Thank you
to [the translators](https://translate.wordpress.org/projects/wp-plugins/qaiyo-utm-tracker-for-fluent-forms/contributors)
for their contributions.

[Translate “Qaiyo UTM Tracker for Fluent Forms” into your language.](https://translate.wordpress.org/projects/wp-plugins/qaiyo-utm-tracker-for-fluent-forms)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/qaiyo-utm-tracker-for-fluent-forms/),
check out the [SVN repository](https://plugins.svn.wordpress.org/qaiyo-utm-tracker-for-fluent-forms/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/qaiyo-utm-tracker-for-fluent-forms/)
by [RSS](https://plugins.trac.wordpress.org/log/qaiyo-utm-tracker-for-fluent-forms/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.1.0

 * New: “Add missing fields” adds the tracking fields to a form in one click, saved
   through Fluent Forms’ own form service.
 * New: visits without campaign parameters get a source from the referring site —
   organic search, social, referral — or “(direct)” / “(none)”. Ad data always takes
   precedence. Can be switched off.
 * New: the landing page (without its query string) is recorded in a landing_page
   field.
 * Suggested privacy-policy text updated for the landing page and the referring 
   domain.

#### 1.0.0

 * Initial release.

## Meta

 *  Version **1.1.0**
 *  Last updated **5 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.5 or higher **
 *  Tested up to **7.1.2**
 *  PHP version ** 7.4 or higher **
 *  Languages
 * [English (US)](https://wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/)
   and [Spanish (Spain)](https://es.wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/).
 *  [Translate into your language](https://translate.wordpress.org/projects/wp-plugins/qaiyo-utm-tracker-for-fluent-forms)
 * Tags
 * [attribution](https://wordpress.org/plugins/tags/attribution/)[fluent forms](https://wordpress.org/plugins/tags/fluent-forms/)
   [google ads](https://wordpress.org/plugins/tags/google-ads/)[meta ads](https://wordpress.org/plugins/tags/meta-ads/)
   [UTM](https://wordpress.org/plugins/tags/utm/)
 *  [Advanced View](https://wordpress.org/plugins/qaiyo-utm-tracker-for-fluent-forms/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/qaiyo-utm-tracker-for-fluent-forms/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/qaiyo-utm-tracker-for-fluent-forms/reviews/)

## Contributors

 *   [ qaiyo ](https://profiles.wordpress.org/qaiyo/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/qaiyo-utm-tracker-for-fluent-forms/)