Select an important lead form such as newsletter_signup or contact_request. In Tag Manager create a Trigger of type Form Submission and restrict it to the form’s CSS selector. If the form uses JavaScript rather than a native submit, hook the success callback and push a dataLayer event instead.
Add a GA4 Event tag named form_submitted. Include parameters form_name and cta_location so you can test copy and placement later without adding new events.
Publish to staging, submit the form, and confirm in DebugView that form_submitted arrives with both parameters. Then mark it as a conversion in GA4.
With forms flowing inside your own domain, you can capture bookings that happen on external services, which we cover next.
Many marketers book meetings through Calendly or HubSpot. These happen on different domains, so you need cross-domain tracking. The easiest route is a small listener script embedded in the Calendly iframe. Tag Manager listens for the message and fires a booking event.
Create a Custom HTML tag with this script and trigger it on pages where the Calendly iframe appears. For HubSpot Meetings use the built-in webhook to post a JSON payload to your server-side Tag Manager container.
After the tag fires, add a GA4 Event tag named meeting_booked with parameters calendar_name and booking_source. Test in Preview mode, then visit GA4 Realtime to confirm the booking appears. Cross-domain attribution is now intact, making payments the final piece of the puzzle.
Stripe remains the quickest way to log real revenue. In the Stripe dashboard create a webhook that points to your server-side Tag Manager endpoint and listen for checkout.session.completed. Push the following payload to the dataLayer:
{ "event": "service_payment",
"amount": {{amount_total}},
"currency": "{{currency}}",
"plan_type": "{{price_metadata_plan}}"
}
If you do not have a server container yet, redirect successful payments to /checkout/success and reuse the confirmation_page_view pattern. Create a GA4 Event tag named service_payment with the same parameters. Toggle the event as a conversion so revenue appears alongside meetings and form leads.
Verify by running a test payment in Stripe’s test mode, then check GA4 DebugView for service_payment. With payments tracked, your core funnel now reports end-to-end.