{"id":377836,"date":"2026-09-29T09:08:48","date_gmt":"2026-09-29T09:08:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/qaiyo-utm-tracker-for-fluent-forms\/"},"modified":"2026-09-29T09:08:39","modified_gmt":"2026-09-29T09:08:39","slug":"qaiyo-utm-tracker-for-fluent-forms","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/qaiyo-utm-tracker-for-fluent-forms\/","author":23510315,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.2","requires":"6.5","requires_php":"7.4","requires_plugins":null,"header_name":"Qaiyo UTM Tracker for Fluent Forms","header_author":"Qaiyo","header_description":"Keeps the UTM parameters and the Google Ads click ID (gclid) of a visit with every Fluent Forms submission, so each entry shows which source and campaign brought the lead.","assets_banners_color":"","last_updated":"2026-09-29 09:08:39","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/qaiyo-plugins.com\/plugins\/","header_author_uri":"https:\/\/qaiyo-plugins.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"qaiyo","date":"2026-09-29 09:08:39","revision":3718610}},"upgrade_notice":{"1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[9067,185045,985,239143,24188],"plugin_category":[],"plugin_contributors":[267332],"plugin_business_model":[],"class_list":["post-377836","plugin","type-plugin","status-publish","hentry","plugin_tags-attribution","plugin_tags-fluent-forms","plugin_tags-google-ads","plugin_tags-meta-ads","plugin_tags-utm","plugin_contributors-qaiyo","plugin_committers-qaiyo"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/qaiyo-utm-tracker-for-fluent-forms.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>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.<\/p>\n\n<p>Add six hidden fields to a form once. From then on the plugin remembers the campaign parameters of the page where the visitor arrived, writes them into those fields when the form is sent, and Fluent Forms stores them with the entry \u2014 visible on the Entries screen, in exports and in Fluent Forms' own reports.<\/p>\n\n<h4>What makes it different<\/h4>\n\n<ul>\n<li><strong>Meta (Facebook and Instagram) Ads work out of the box.<\/strong> Meta appends the UTM parameters you set on the ad \u2014 source, medium, campaign, content, term \u2014 to the landing URL, and the plugin stores them with the entry as they are, for example <code>facebook<\/code> \/ <code>cpc<\/code> \/ your campaign name \/ the ad ID. Nothing to configure beyond the hidden fields.<\/li>\n<li><strong>Survives the way people really convert.<\/strong> 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.<\/li>\n<li><strong>Google Ads without tracking templates.<\/strong> 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\" \u2014 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.<\/li>\n<li><strong>Fixes your older entries too.<\/strong> 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.<\/li>\n<li><strong>Last touch wins, campaigns never mix.<\/strong> 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.<\/li>\n<li><strong>Consent-aware.<\/strong> 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.<\/li>\n<li><strong>Works with the free Fluent Forms.<\/strong> Hidden fields and entries are part of Fluent Forms itself; Fluent Forms Pro is not required.<\/li>\n<\/ul>\n\n<h4>Tracked parameters<\/h4>\n\n<p>utm_source, utm_medium, utm_campaign, utm_content, utm_term and gclid. Add only the fields you need: a field that is not on a form is simply not recorded.<\/p>\n\n<h4>Built to stay out of the way<\/h4>\n\n<p>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.<\/p>\n\n<h4>Privacy<\/h4>\n\n<p>The plugin does not connect to any external service and sends nothing anywhere. Campaign 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.<\/p>\n\n<h4>Translations<\/h4>\n\n<p>The interface is translation-ready. Translations for Hungarian, German, French, Spanish, Japanese, Portuguese (Portugal), Italian, Russian, Turkish and Polish are maintained by the author.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate Fluent Forms.<\/li>\n<li>Install and activate Qaiyo UTM Tracker for Fluent Forms (Plugins \u2192 Add New, or upload the ZIP).<\/li>\n<li>Open Fluent Forms \u2192 UTM Tracker. Copy the field names shown there.<\/li>\n<li>In the Fluent Forms editor, add a Hidden Field (Advanced Fields \u2192 Hidden Field) for each name and type the name into its Name Attribute. Leave the default value empty. Save the form.<\/li>\n<\/ol>\n\n<p>That is all: new entries record their source from now on.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20fluent%20forms%20pro%3F\"><h3>Do I need Fluent Forms Pro?<\/h3><\/dt>\n<dd><p>No. The hidden fields and the entries are part of the free Fluent Forms plugin.<\/p><\/dd>\n<dt id=\"why%20is%20utm_source%20empty%20for%20some%20google%20ads%20leads%20in%20my%20old%20entries%3F\"><h3>Why is utm_source empty for some Google Ads leads in my old entries?<\/h3><\/dt>\n<dd><p>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 \u2192 UTM Tracker \u2192 Update older entries once.<\/p><\/dd>\n<dt id=\"can%20i%20filter%20entries%20by%20source%20or%20campaign%3F\"><h3>Can I filter entries by source or campaign?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"can%20i%20get%20the%20campaign%20name%20for%20google%20ads%20leads%20as%20well%3F\"><h3>Can I get the campaign name for Google Ads leads as well?<\/h3><\/dt>\n<dd><p>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&amp;utm_medium=cpc&amp;utm_campaign={campaignid}&amp;utm_content={adgroupid}&amp;utm_term={keyword}. The gclid keeps working alongside it.<\/p><\/dd>\n<dt id=\"where%20do%20the%20numbers%20in%20utm_content%20come%20from%3F\"><h3>Where do the numbers in utm_content come from?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"what%20if%20the%20visitor%20comes%20back%20through%20a%20different%20ad%3F\"><h3>What if the visitor comes back through a different ad?<\/h3><\/dt>\n<dd><p>The newest campaign visit wins and replaces the previous values completely.<\/p><\/dd>\n<dt id=\"can%20i%20record%20something%20other%20than%20%22google%22%20%2F%20%22cpc%22%3F\"><h3>Can I record something other than \"google\" \/ \"cpc\"?<\/h3><\/dt>\n<dd><p>Yes, with the qfut_gclid_attribution filter, for example:<\/p>\n\n<pre><code>add_filter( 'qfut_gclid_attribution', function ( $values ) { $values['utm_source'] = 'google_ads'; return $values; } );\n<\/code><\/pre><\/dd>\n<dt id=\"does%20it%20slow%20down%20my%20site%3F\"><h3>Does it slow down my site?<\/h3><\/dt>\n<dd><p>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.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20page%20caching%3F\"><h3>Does it work with page caching?<\/h3><\/dt>\n<dd><p>Yes. Everything happens in the visitor's browser, so cached pages behave exactly like uncached ones.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<\/ul>","raw_excerpt":"Every Fluent Forms entry shows which Meta or Google ad and campaign brought the lead: UTM parameters and click IDs, kept across pages and days.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/377836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=377836"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/qaiyo"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=377836"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=377836"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=377836"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=377836"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=377836"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=377836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}