If you are trying to figure out how do I track form submissions and bookings in GA4, you are likely feeling the frustration of Google's transition away from Universal Analytics. In the old system, setting up a conversion was simple: you pasted a thank-you page URL into a goal field, and it worked.
Google Analytics 4 does not work this way. In GA4, conversions do not exist until you define, capture, and register them as custom events. If you do not explicitly build the event first, GA4 will treat every valuable interaction, from a booked appointment to a contact form submit, as a simple, anonymous page view.
This event-based architecture is highly flexible, but it trips up almost everyone who assumes the platform tracks conversions automatically. Setting up conversion tracking requires a deliberate process of event creation, tag configuration, and real-time validation.
The GA4 conversion philosophy: events first
In GA4, every action a user takes is an event. When someone loads a page, it triggers a page_view. When they scroll, it triggers a scroll.
To track a conversion, you must:
- Identify or create the event that represents the conversion (such as
generate_leadorappointment_booked). - Pass the correct parameters with that event to identify the context (such as the form ID or conversion value).
- Toggle that specific event name as a conversion inside the GA4 admin interface.
This means that if you want to track a booking form, you cannot just tell GA4 to watch a URL. You must configure your website or Google Tag Manager to fire a custom event when the user successfully submits that form, and then tell GA4 that this event is a conversion.
Step 1: Tracking standard form submissions
Most websites capture leads through a standard contact or inquiry form. There are two primary ways to track these: using GA4's native Enhanced Measurement or using Google Tag Manager.
Option A: Enhanced Measurement (The basic way)
GA4 includes a feature called Enhanced Measurement, which attempts to track form submissions automatically by listening for browser form submit events.
To check if this is active, go to Admin, select Data Streams, click your web stream, and click the gear icon under Enhanced Measurement. Ensure the Form Interactions toggle is active.
However, this feature is notoriously unreliable. It often misses Ajax-based forms (which submit without reloading the page) and frequently records false positives when a user clicks a button that does not actually submit the form. If you rely on this, your data will likely be incorrect.
Option B: Google Tag Manager (The reliable way)
To get clean data, you should use Google Tag Manager (GTM).
- Create a Trigger: In GTM, create a new trigger. Select Form Submission as the trigger type. Check the boxes for Wait for Tags and Check Validation. Set the trigger to fire on Page URL matches regex
.*to listen to all forms, or specify a Form ID if you want to target a specific one. - Create a GA4 Event Tag: Create a new tag in GTM. Choose GA4 Event as the tag type. Select your GA4 configuration tag. Name the event
generate_lead. - Add Parameters: Under Event Parameters, add
form_nameand set the value to the specific form name (e.g.,contact_us). This allows you to differentiate between forms in your reports. - Link and Publish: Attach your form submission trigger to the GA4 Event tag, save, and publish the container.
Want a website that turns visitors into customers, not just compliments?
Book a 15-min introStep 2: Tracking embedded schedulers (Calendly, Acuity, etc.)
If you use a booking tool like Calendly or Acuity embedded on your site, tracking conversions is more complex. Because these tools load inside an iframe, standard form triggers in GTM cannot see what happens inside them.
For Calendly, the tool emits a JavaScript message event to the parent window when a user books a meeting. You can capture this message using a custom listener in GTM:
- Create a Custom HTML Tag: In GTM, paste a listener script that listens for the
calendly.event_scheduledmessage event. - Push to DataLayer: When the event fires, the script should push an event named
calendly_bookingto the GTM dataLayer. - Trigger on DataLayer Event: Create a custom event trigger in GTM that fires on
calendly_booking. - Send to GA4: Create a GA4 Event tag named
appointment_bookedtriggered by that custom event.
This method bypasses the iframe limitation and ensures you capture the exact moment a booking completes.
Step 3: Verifying your events in DebugView
Before you mark an event as a conversion, you must verify that it is firing correctly with all its parameters. If you skip this step, you risk registering duplicate events or capturing empty parameters.
The GA4 DebugView is the only reliable tool for this validation.
- Activate Debug Mode: Install the Google Tag Assistant Chrome extension or preview your GTM container. This automatically sets a debug cookie in your browser.
- Open DebugView: In GA4, go to Admin and select DebugView.
- Perform the Action: Go to your live site and fill out your form or book a test meeting.
- Verify the Timeline: Watch the DebugView timeline. Within a minute, you should see your custom event (e.g.,
generate_leadorappointment_booked) appear as a blue icon. Click on it to expand and verify that the parameters (likeform_nameorbooking_type) show the correct values.
If the event does not appear, or if the parameters are missing, check your GTM variables and trigger settings. Do not proceed until the event fires cleanly in DebugView.
Step 4: Marking the event as a conversion
Once your custom event is verified and has fired at least once on the live site, it will eventually show up in your GA4 reports.
- Go to GA4 Admin and click Events under Data Display.
- Locate your custom event in the table (e.g.,
generate_lead). - Toggle the switch under Mark as conversion to active.
If the event is brand new and has not yet populated in the table, you do not have to wait. Go to Conversions in the Admin panel, click New Conversion Event, enter the exact name of the event (case-sensitive, e.g., generate_lead), and click Save. GA4 will begin tracking it as a conversion immediately.
Focusing on business outcomes, not vanity clicks
A common mistake is marking every minor interaction as a conversion. If you mark button clicks, PDF downloads, and newsletter signups all as conversions, your conversion rate metric becomes meaningless.
Attribution models and Google Ads bidding algorithms rely on conversion data to optimize. If you feed them low-value actions, they will optimize your campaigns to find users who click buttons, not users who buy. Keep your GA4 conversions restricted to high-value actions: forms that indicate buying intent, booking confirmations, and completed checkout transactions.
If your GA4 setup is failing to capture these critical actions, or if you suspect your conversion rates are skewed, a professional analytics implementation and audit can restore order. Clean conversion tracking is the foundation of every marketing decision you make. If you do not trust your tracking, you cannot trust your ROI.