ActiveCampaign is one of the most widely used CRM and email automation platforms for small and mid-size service businesses. Its combination of contact management, deal pipelines, and marketing automation makes it a practical all-in-one choice.
But like most CRMs, ActiveCampaign has an attribution gap: it records that a lead arrived, but not which campaign, keyword, or ad brought them there. The UTM parameters and click IDs that identify your best-performing channels stay in the browser and never make it into the contact or deal record.
This guide covers how to close that gap — from UTM capture through hidden form fields to custom ActiveCampaign fields, deal-level reporting, and offline conversion upload to Google Ads and Meta.
The Attribution Gap in ActiveCampaign
When a visitor lands on your WordPress site from a paid ad, the URL looks something like this:
https://yoursite.com/contact/?utm_source=google&utm_medium=cpc&utm_campaign=roofing-leads&gclid=abc123
The UTM parameters identify the source, channel, and campaign. The gclid (Google Click ID) ties the visit to a specific ad click for offline conversion reporting.
What happens to those values? By default, they disappear the moment a form is submitted. ActiveCampaign receives a name, email, and phone number — but nothing about where the lead came from.
The result: you know you got a lead. You have no way to know it came from the campaign costing $80 per click, or from an organic search that costs nothing. You cannot see whether the leads from one campaign close at twice the rate of another. You cannot tell Google Ads which clicks are turning into paying clients.
Step 1: Capture UTMs in First-Party Cookies
The fix starts with a JavaScript snippet that runs when a visitor first lands on your site and stores UTM parameters in first-party cookies before they navigate to your contact page or anywhere else.
The snippet captures six values:
- utm_source — the traffic source (google, facebook, email)
- utm_medium — the channel (cpc, organic, social)
- utm_campaign — the campaign name
- utm_term — the keyword that triggered the ad
- utm_content — the specific ad or creative variant
- gclid and fbclid — Google and Facebook click identifiers for offline conversion upload
The cookie persists for 30 days, so a visitor who clicks your ad on Monday and fills out your form on Thursday still carries their original source data.
You can install this snippet via Google Tag Manager (one GTM tag, fires on all pages), WPCode (a free WordPress code injection plugin), or directly in your theme’s functions.php. GTM is generally the cleaner path since it keeps tracking code version-controlled without requiring theme edits.
Full implementation details in UTM Parameter Tracking on WordPress.
Step 2: Create Custom Fields in ActiveCampaign
ActiveCampaign supports custom fields at two levels: on the contact record and on the deal record. You want both.
Contact-level fields capture attribution for every lead and enable email segmentation by source. Deal-level fields carry attribution through the pipeline so you can filter and report on revenue by channel.
Contact-level custom fields to create:
- Lead Source (stores utm_source)
- Lead Medium (stores utm_medium)
- Lead Campaign (stores utm_campaign)
- Lead Term (stores utm_term)
- Lead Content (stores utm_content)
- Landing Page
- GCLID
- FBCLID
To create these: go to Contacts > Manage Fields, add each as a Text field. Note the field IDs — you will need them when mapping form fields to AC fields.
Deal-level custom fields:
Go to Deals > Manage Fields and add a “Lead Source” field at minimum. You can mirror the full set if you want campaign-level deal filtering. These fields get populated automatically via an automation (Step 4), not by the form submission itself.
Step 3: Connect Your WordPress Forms to ActiveCampaign
There are three reliable paths for getting form submissions — including hidden UTM fields — into ActiveCampaign from WordPress.
Option A: WordPress Form Plugin with Native AC Integration
This is the cleanest approach for most setups. Several form plugins have built-in ActiveCampaign integrations that map form fields directly to AC contact fields:
- Gravity Forms with the ActiveCampaign Add-On: full field mapping, supports hidden fields pre-populated from cookies via a small JS snippet
- WPForms with ActiveCampaign integration: similar capability, simpler setup
- Fluent Forms with AC integration: lightweight option with solid field mapping support
The workflow: add hidden fields to your form (one per UTM value), use JavaScript to populate them from the stored cookies on page load, then map each hidden field to the corresponding AC contact field in the plugin’s integration settings.
Option B: ActiveCampaign’s Native WordPress Plugin
ActiveCampaign’s official WordPress plugin lets you embed their hosted forms directly on pages. These forms support hidden fields, but they render in an iframe — which can complicate hidden field injection. Test carefully before relying on this path for attribution capture.
Option C: Webhook to the ActiveCampaign API
For full control without a form plugin dependency, you can POST form data directly to ActiveCampaign’s Contacts API. Your form fires a webhook on submission; a Zapier zap or server-side function creates or updates the AC contact with all attribution fields included.
More setup, but complete flexibility. This path also makes it straightforward to handle duplicate contacts (look up by email first, then update rather than create).
For a deeper comparison of all three paths across CRM platforms, see CRM Integration for WordPress.
Step 4: Copy Attribution to Deals via Automations
When a contact is created from a form submission, an ActiveCampaign automation can immediately create a deal and copy attribution fields from the contact to the deal record.
Build this automation in the Automations builder:
- Trigger: Contact is created (or submits a specific form)
- Action: Create a deal in your pipeline with the contact’s name and source info as the deal title
- Action: Update deal field “Lead Source” = contact field “Lead Source”
- Repeat the Update action for each field you want mirrored (campaign, medium, GCLID, etc.)
This runs at the moment of contact creation, so attribution is on the deal from day one. The sales team sees the source in the deal card without having to cross-reference the contact record.
Step 5: Build Deal-Level Attribution Reports
Once deal-level fields are populated, you can filter your pipeline by channel and see which sources are generating actual revenue — not just lead volume.
Two views worth building:
Open pipeline by source: Filter deals by the “Lead Source” field to see how much pipeline value is sitting from Google Ads vs. organic vs. referral. This shows you where your best-value prospects are coming from before deals close.
Won deals by campaign: Filter closed-won deals by “Lead Campaign” to compare revenue by campaign. A campaign generating $40K in won deals at a $6K cost looks completely different from one generating 30 leads at $120 each with a 5% close rate.
ActiveCampaign’s built-in reporting is limited, but deal-view filtering on custom fields is enough to make channel-level spend decisions without exporting to a spreadsheet. For deeper reporting, export won deals with attribution fields to a Google Sheet and build a simple pivot table.
Step 6: Close the Loop with Offline Conversion Upload
If you are running Google Ads or Meta Ads, you can push won deals back to the ad platforms as offline conversions. This tells the platforms which clicks actually turned into clients — not just form fills.
Google Ads: When a deal is marked won in ActiveCampaign, trigger an automation that fires a webhook containing the stored gclid and a conversion event name. A Zapier zap catches this and uploads the conversion to Google Ads via the Conversions API. Google attributes the closed client back to the specific campaign, ad group, and keyword that drove the click — and Smart Bidding learns to favor the placements that generate revenue, not just form submissions.
Meta Ads: The same process applies using the fbclid stored in the deal record. Send the event to Meta’s Conversions API when a deal closes. This improves Meta’s optimization signal and reduces underreporting caused by iOS privacy restrictions.
Full setup details in Google Ads Conversion Tracking on WordPress and Meta Ads Conversion Tracking on WordPress.
The Full Stack, End to End
Here is what the complete attribution chain looks like for an ActiveCampaign and WordPress setup:
- Visitor clicks a Google Ads ad; URL contains UTM parameters and gclid
- JavaScript fires on landing and stores utm_source, utm_medium, utm_campaign, utm_term, gclid in first-party cookies (30-day expiration)
- Visitor fills out your contact form; hidden fields are populated from the cookies
- Form plugin sends the contact to ActiveCampaign with all attribution fields mapped to custom contact fields
- ActiveCampaign automation creates a deal and copies attribution fields to the deal record
- Sales team works the deal in the pipeline with full source and campaign visibility
- Deal is marked won; automation fires a webhook with gclid to Google Ads offline conversion upload
- Google Ads Smart Bidding now optimizes for closed clients, not form fills
The same chain works for Meta Ads (fbclid), organic search (utm_medium=organic), email campaigns (utm_source=email), and any other channel with UTM tagging.
Related Guides
- CRM Integration for WordPress: Getting Lead Source Data Into Your Pipeline
- UTM Parameter Tracking on WordPress: How to Capture Lead Source and Keep It
- HubSpot and WordPress: How to Track Lead Source Through to Your CRM
- Pipedrive and WordPress: How to Track Lead Source Through to Your CRM
- Salesforce and WordPress Lead Tracking