Direct answer: Work out where the chain breaks: the event fires, GA4 receives it, it’s marked as a key event, GA4 is linked to Google Ads, and a conversion is created from it in Ads. If the event never reaches GA4, the problem is the tag, and with forms it’s usually firing before the submit succeeds. If GA4 has it but Ads doesn’t, check the key event, the link, and timing. One more thing to know: conversions created from GA are secondary by default, so they won’t drive bidding until you make them primary in Google Ads.
Match the symptom to the cause
Our checklist. The causes are our diagnosis; the access, timing, and primary/secondary details in the third column come from Google’s linking, key events, and primary/secondary help pages.
| What you see | Most likely cause | Where to look |
|---|---|---|
| Event missing from GA4 reports and Realtime | Tag isn’t firing, or fires with empty values | Tag Manager preview (see the walkthrough below) |
| Event in GA4, but not in the Ads import list | Not marked as a key event, or no link | GA4 Admin > Data display > Events (star it); Admin > Product links > Google Ads links |
| Can’t see the Ads account when linking | Missing access | You need Editor or Administrator in GA4 and admin access in Ads |
| Conversion exists in Ads, shows in “All conversions” but not “Conversions” | It’s a secondary action | Ads: Goals > Conversions > Summary, edit the goal, set it as primary |
| Just set up yesterday, still zero | Timing | Google says allow up to 24 hours for key events in reports, and up to 48 hours for new Ads data in GA4 |
| Numbers lower than form fills | Consent settings | See consent below |
| Ads shows more conversions than you expected | Likely cause (our experience): the same action is tracked by both an imported key event and a native Ads tag, and both are primary | Check which actions are primary for that goal |
Primary and secondary, briefly
Per Google Ads Help, primary actions show in the “Conversions” column and are used for bidding. Secondary actions are for observation and show in “All conversions,” unless they’re part of a custom goal. Conversions created from GA start as secondary and can only be switched to primary in Google Ads. Google also notes Smart Bidding may go through a learning period of about 7 to 14 days after changes, so don’t flip settings back and forth.
Consent mode
With consent mode, basic mode blocks Google tags until the visitor agrees, and nothing is sent if they decline. Advanced mode loads tags and sends cookieless pings when consent is denied, and Google models the gaps. If your banner blocks tags by default and many visitors never click it, expect lower reported conversions than actual form fills.
Walkthrough: debugging a form that won’t track
The usual Reddit version of this problem: the tag fires on button click, the form uses AJAX so the page never reloads, and the variables show “undefined.” Here’s a fix that fires only after a successful submit.
1. Push an event from the form’s success handler. Ask whoever built the form to add this where the form confirms success. Example values only:
window.dataLayer = window.dataLayer || [];
dataLayer.push({
'event': 'quote_form_success',
'form_name': 'quote_request',
'lead_value': 0
});
This follows the pattern in Google’s Custom Event trigger docs, which use dataLayer.push({'event':'button1-click','conversionValue':25}); and name form submits as a common use.
2. Create the trigger. In Tag Manager: Triggers > New > Custom Event, event name quote_form_success. Use the exact name. Google’s page warns against matching everything with .*.
3. Read the extra values. Create a Data Layer Variable for form_name (and lead_value if you send one). Use them in the GA4 event tag as parameters.
4. Point the GA4 event tag at the new trigger. Remove the old click trigger so it doesn’t fire twice.
5. Test in preview. Click Preview in the workspace and connect to your site (Tag Manager preview docs). Submit a test form. Google says the previewed site is connected to Tag Assistant “so that you can inspect which tags fired and in which order.” Find the quote_form_success event and check that the GA4 tag fired and that form_name has the value quote_request, not undefined.
If the event never appears, the push isn’t running, so check the success handler. If the event appears but the tag doesn’t fire, the trigger name doesn’t match.
6. Publish, then mark it as a key event in GA4 and create the Ads conversion from it.
A hypothetical before and after
Hypothetical, for illustration. Not a client result. Before: the GA4 event tag fires on the quote button’s click, so it fires even when the form shows a validation error, and form_name reads undefined. After: the tag fires on quote_form_success, which only runs when the form confirms, and form_name carries a value you can report on.
Import or native Google Ads tag?
Importing GA4 key events keeps one definition of a lead across GA4 and Ads. A native Ads tag is set up directly in Ads. Either works. What matters is that each goal has one primary action, so the same lead isn’t counted twice for bidding.
FAQ
Why is my GA4 key event not showing in Google Ads? Usually it isn’t marked as a key event, the accounts aren’t linked, it’s new, or it was created but left as secondary.
How long does a new key event take to show up? Google says allow up to 24 hours in standard reports.
Can I make an imported GA conversion primary? Yes, but only in Google Ads, not in GA.
My GTM variable says undefined. Why? The tag is likely firing before the data exists. Fire on a dataLayer push after a successful submit.


