The internet is full of articles telling you to use Google Tag Manager to send conversions to Google Ads, Meta Ads, Google Analytics, etc whenever someone fills in a form on their website.
It's not bad advice, but the tricky part is letting Google Tag Manager know a WPForms form was actually submitted. Depending on how you set it up, WPForms can submit the form with AJAX and show a message without reloading, or it can reload the page and then show a success message, or it can redirect the visitor somewhere else after the form is submitted. GTM's built-in form submission trigger can't detect any of these.
The only way to do it properly is to write custom code that listens for the various signals WPForms sends when a form is successfully submitted, and then send an event to the dataLayer (which you can then use to create a Trigger in GTM which fires your conversion tags).
If that all sounds technical and complicated, then don't worry, because this template takes care of the hard part for you. Add it from Google's Community Template Gallery and every successful WPForms form submission shows up in GTM as a wpforms_form_submitted event that you can fire your conversion tags from.
How to Use the Template
Below are the steps to add the template, build a Trigger in GTM and connect your conversion tags, so that every WPForms submission ends up as a conversion in Google Ads, Meta Ads, Google Analytics or anywhere else you need.
Install It
First, add the template to your container from Google's Community Template Gallery and set it to fire on every page.
- 1
Head to the Tags screen in your container, click New, then click the Tag Configuration box to pick a tag type.

- 2
Click Discover more tag types in the Community Template Gallery at the top of the list and search for "WPForms".

- 3
Select WPForms Listener from Converly, click Add to workspace and then Add to confirm.

- 4
Set the trigger to All Pages, name the tag something you'll recognise (like WPForms Listener) and click Save. Once this is done, the tag will run on every page of your site and listen for WPForms submissions, and push an event called
wpforms_form_submittedto the dataLayer.
Create the Trigger
Now create a Trigger that waits for the wpforms_form_submitted event to appear in the dataLayer.
Google doesn't let gallery templates include Triggers, so you need to create this manually. Go to Triggers, click New and enter the settings shown below.
Exact Settings
- Trigger Type
- Custom Event
- Event Name
- wpforms_form_submitted
- Name It
- CE - WPForms Submitted

Connect Your Tags
The last step is to create conversion tags for each destination you want to send conversions to (Google Ads, Google Analytics, Meta Ads, etc) and set them to fire on the Trigger you just made. Here's how to set up the most common ones:
Example 1: Google Analytics
Choose the Google Analytics: GA4 Event tag type, enter your Measurement ID and give the event a name such as generate_lead. Then, under Triggering, pick the Trigger you made in step 2.
Google Tag Manager will now send an event to GA4 every time someone successfully submits a WPForms form on your website.

Example 2: Google Ads
Create a new Tag with Google Ads Conversion Tracking as the tag type. You'll need a couple of details from your Google Ads account here, so open the conversion action you want to use in Google Ads and copy its Conversion ID and Conversion Label into the tag. Then pick the Trigger you made in step 2 under Triggering. Google Ads will now receive a conversion every time someone successfully submits a WPForms form on your website.

Example 3: Meta Ads
For Meta, either add a Meta Pixel tag from the community gallery or write a Custom HTML tag that sends the standard Lead event. Then set CE - WPForms Submitted (or whatever you called the Trigger you made in step 2) as its firing trigger, and Meta Ads will receive a conversion each time someone completes one of the WPForms forms on your site.

Test in Preview Mode
Before you publish, click the Preview button in Google Tag Manager, load a page that has your WPForms form on it, and send a test entry. In Tag Assistant you should see:
- One
wpforms_form_submittedevent in the left timeline for each submission. - Your conversion tags listed under Tags Fired when that event is selected.
- The form's number under
form_idon the Data Layer tab.
If everything checks out, click Submit, give the version a name and description, and then click Publish to make it live.

What It Sends
Each time WPForms accepts a submission on your site, the WPForms GTM Template adds the following to the dataLayer:
window.dataLayer.push({
"event": "wpforms_form_submitted",
"form_id": "22"
});| Key | Type | What It Is |
|---|---|---|
event | string | Always the same (wpforms_form_submitted). This is the value the GTM Trigger you built above listens for. |
form_id | string | Which WPForms form was submitted. It's handy if you only want conversion tags to fire for some forms (for example, your Quote Request form but not your Newsletter signup). It's the number in the form's shortcode, so [wpforms id="22"] is form 22. |
Permissions & Privacy
Why Does Google Tag Manager Show a Warning?
Google's Community Gallery lists the access every template asks for. Because this tag pulls its code from Converly's servers, the listing shows a red "Injects scripts" warning, like the one below:
Injects scripts
https://gtm-templates.converly.io/wpforms-listener.jsLoads the WPForms detection script from Converly's servers only
Why This Is Actually The Best Approach
- Secure Code can only come from
gtm-templates.converly.io. No other domain is allowed, so nothing but Converly's own script can run. - Automatic updates. It's the same WPForms detection code Converly runs for its customers, checked regularly on live WPForms forms. When WPForms changes how its forms work, we fix the script once and every site using the template gets the fix.
Compatibility
This WPForms listener is built on the same core code as Converly's own WPForms detection, so it has been thoroughly tested and has already picked up thousands of real submissions for Converly customers.
| Setup | Status | Note |
|---|---|---|
| AJAX on, confirmation message | Works | Fires a single event when the message shows, without a reload. |
| AJAX off, confirmation message | Works | Fires once on the reloaded page, when the message appears. |
| AJAX off, redirect to a page on your site | Works | Fires once on the page the visitor is sent to. |
| Rejected submissions | Works | Entries WPForms sends back with errors never fire. |
| Fixing errors and resubmitting | Works | Fires once, when the corrected entry is accepted. |
| Double clicks | Works | One click or two, each submission fires once. |
Tested with WPForms 1.6.7, WordPress 7.0.7, Chromium 145.0.7632.6.
Troubleshooting & FAQ
In Preview, check the listener tag fired when the page first loaded. If it didn't, its trigger is probably the custom event rather than All Pages.
With AJAX turned off, WPForms reloads the page and the event fires on the page that loads next, so the tag has to run there too. All Pages takes care of that. The browser also has to allow storage for the tab, which some strict privacy settings block.
An entry WPForms rejects never fires, and neither does a redirect to another website when the page reloads. Ad blockers and privacy extensions can also stop GTM loading, so test in a clean browser window.
Preview runs your unpublished workspace. Your live site only gets the changes after you click Submit in Google Tag Manager.
Still nothing? A caching plugin may be serving an older copy of the page, so clear it and test again.
A cookie banner can also hold GTM back until the visitor consents, which means visitors who decline aren't tracked.
No. It only listens. Your AJAX setting, confirmation messages and redirects all behave exactly as you set them up in WPForms.
The template never submits or edits your forms, and it doesn't read the answers people give. It watches for the confirmation and pushes one event.
No. It's a small script that loads asynchronously, so your page never waits for it.
Install it in your web container, which is where the submission happens. Your GA4 tag can pass the event on to a server container, but the template can't be added to a server container directly.
Pick the template if you'd rather not maintain anything, since detection fixes reach your site on their own. Pick the recipe if you want the tag, trigger and variable in a single import with all the code kept in your container, knowing it won't change until you import a newer version.
| This Template | The Recipe | |
|---|---|---|
| Getting it into GTM | One click in Google's template gallery | Download a file and import it |
| Comes with | A single tag, plus a trigger you make | A ready tag, trigger and variable |
| Code location | Hosted by Converly | Stored in your container as Custom HTML |
| When detection improves | You get the fix automatically | Nothing changes until you re-import |
Changelog
| Version | Date | Changes |
|---|---|---|
| v1.0.0 | 25 Oct 2026 | First release of the template. |
Any fix to the detection script reaches your site on its own, and it's recorded here as well.



