Elementor Pro's Form widget is on a large share of small business websites, and most of them track it wrong. The usual mistakes are firing on the button click, using GTM's generic form trigger, or counting visits to a thank-you page that anyone can open directly.
Elementor fires a JavaScript event called submit_success once the server has accepted a submission. Listening for that event is the clean way to track it. This guide shows how to capture it in Google Tag Manager and send it to GA4, Google Ads and Meta.
How Elementor Form Submission Works
When a visitor submits an Elementor form, the widget sends the data to WordPress by AJAX. If validation passes and the server returns success, Elementor triggers a jQuery event named submit_success on the form element and shows the success message or redirects, depending on your settings.
Because the page does not reload, nothing in GTM fires by default. We need to listen for that event and push it to the dataLayer.
Step 1: Add the Listener in GTM
Create a Custom HTML tag named Listener - Elementor Form Success with this code and fire it on All Pages:
<script>
(function () {
if (!window.jQuery) { return; }
jQuery(document).on('submit_success', function (event) {
var form = event.target;
var formName = form.getAttribute('name') || '';
var formIdField = form.querySelector('input[name="form_id"]');
var formId = formIdField ? formIdField.value : '';
var emailField = form.querySelector('input[type="email"]');
var phoneField = form.querySelector('input[type="tel"]');
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'form_submit_success',
form_tool: 'elementor',
form_name: formName,
form_id: formId,
user_email: emailField ? emailField.value.trim().toLowerCase() : undefined,
user_phone: phoneField ? phoneField.value.trim() : undefined
});
});
})();
</script>
The email and phone values are pushed so they can be used for Google Ads Enhanced Conversions and Meta Advanced Matching. They are hashed before leaving the browser by those tags. If you do not want them in the dataLayer at all, remove those two lines.
Step 2: Create the Variables
Create Data Layer Variables for form_name, form_id, user_email and user_phone.
Step 3: Create the Trigger
Create a Custom Event trigger named CE - form_submit_success with the event name form_submit_success. If you only want a specific form, add a condition where form_name equals your form's name as set in the Elementor widget.
Step 4: GA4 Event
Create a GA4 Event tag with event name generate_lead and parameters form_name and form_id. Fire it on the trigger. In GA4, mark generate_lead as a key event.
Step 5: Google Ads Conversion
Create a Google Ads Conversion Tracking tag with your conversion ID and label and fire it on the same trigger. Make sure a Conversion Linker tag is firing on All Pages.
For Enhanced Conversions, create a User-Provided Data variable with the email and phone variables, then enable "Include user-provided data from your website" in the conversion tag and select it. Turn on Enhanced Conversions in the conversion action settings in Google Ads.
Step 6: Meta Lead Event
If you run Meta ads, fire a Meta Pixel Lead event on the same trigger with the email and phone passed as advanced matching parameters. If you use the Conversions API through server-side GTM, send the same event with a shared event ID for deduplication.
Step 7: Test
- Open GTM Preview and submit the form with real-looking test data.
- In the Preview panel, confirm that
form_submit_successappears in the event list and thatform_nameandform_idare populated. - Confirm the GA4, Google Ads and Meta tags fired once each.
- Use a tag debugger such as the Insighter Debugger extension to check the outgoing requests, including the hashed user data on the Google Ads request.
- Submit an invalid form, for example with an empty required field. Nothing should fire.
Troubleshooting
- Event never fires. Confirm the listener tag fired on page load in Preview. If jQuery is loaded late, change the listener trigger to Window Loaded.
- Fires twice. You have two listener tags, or the form is duplicated in a popup. Add a condition on
form_id. - Redirect happens before tags fire. Elementor redirects quickly. Tags almost always get out in time, but if you see losses, remove the redirect and show the success message instead, or redirect to a thank-you page and track that with a Page View trigger as the fallback.
- Popup forms. Forms inside Elementor popups work the same way. The listener is on the document, so it catches them.
Why This Beats the Alternatives
A thank-you page can be opened directly and counts repeat visits. The generic GTM form trigger counts failed submissions. The button click counts people who never submitted. The submit_success event fires once, only after the server has accepted the lead. That is the number you want in GA4 and Google Ads.
