A complete reference for lead generation analytics. All events — from first form view to SQL handoff — with parameters, data types, and data layer examples you can copy into your tracking plan.
Lead gen tracking is deceptively simple. Most teams fire a single form_submit event and call it done. But that tells you nothing about which forms convert, where leads drop off, or how marketing spend connects to pipeline. This reference gives you a structured schema covering the events that actually tie lead generation to revenue.
I’ve implemented this schema across B2B SaaS companies and service businesses in Europe. The structure scales from a simple contact form to a multi-step qualification funnel with demo bookings and call tracking.
Lead Gen Funnel Overview
Lead generation analytics tracks users through four stages. Each stage has distinct events that map to specific pipeline metrics.
| Stage | Key Events | Business Metric |
|---|---|---|
| Discovery | form_view, cta_click, chat_opened |
Engagement rate |
| Capture | form_start, form_submit, demo_requested |
Conversion rate |
| Qualification | lead_qualified, lead_scored, call_completed |
MQL-to-SQL rate |
| Handoff | meeting_booked, proposal_sent, lead_assigned |
Sales-accepted lead rate |
Form Interaction Events
Forms are the backbone of lead generation. But tracking only submissions misses the full picture. Measuring views, starts, and field-level interactions reveals where your forms leak leads.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
form_view |
form_name |
string | Form becomes visible in viewport |
form_id |
string | ||
form_type |
string | ||
page_path |
string | ||
form_start |
form_name |
string | User interacts with first field |
form_id |
string | ||
form_type |
string | ||
form_field_complete |
form_name |
string | User completes a field (blur event) |
field_name |
string | ||
field_position |
number | ||
form_submit |
form_name |
string | Form successfully submitted |
form_id |
string | ||
form_type |
string | ||
field_count |
number | ||
time_to_complete |
number | ||
form_error |
form_name |
string | Validation error shown to user |
error_field |
string | ||
error_type |
string |
The form_type parameter is your segmentation key. Use consistent values like contact, newsletter, demo_request, quote, gated_content, or callback. This single parameter lets you compare conversion rates across all form types without creating separate events.
Track time_to_complete in seconds. When I implemented this for a B2B client in Munich, we discovered their quote request form averaged 4.5 minutes — three times longer than their contact form. Shortening it from 12 fields to 7 increased submissions by 35%.
Data Layer Example: Form Submit
window.dataLayer.push({ "event": "form_submit", "form_name": "contact_main", "form_id": "cf-001", "form_type": "contact", "field_count": 5, "time_to_complete": 42, "page_path": "/contact/" });
CTA & Click Events
Not every lead interaction starts with a form. Tracking CTA clicks, phone number taps, and download buttons shows you what drives users toward conversion — and what gets ignored.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
cta_click |
cta_text |
string | User clicks a call-to-action element |
cta_location |
string | ||
cta_type |
string | ||
destination_url |
string | ||
phone_click |
phone_number |
string | User clicks a tel: link |
click_location |
string | ||
content_download |
content_name |
string | Gated content downloaded/accessed |
content_type |
string | ||
content_topic |
string | ||
chat_opened |
chat_source |
string | User opens live chat or chatbot |
page_path |
string | ||
chat_message_sent |
message_count |
number | User sends a message in chat |
chat_duration |
number |
Use cta_location to track where CTAs perform best: hero, sidebar, inline, footer, exit_intent, or sticky_bar. Combined with cta_type values like button, banner, or text_link, you can optimize placement without guessing.
Data Layer Example: CTA Click
window.dataLayer.push({ "event": "cta_click", "cta_text": "Get a Free Quote", "cta_location": "hero", "cta_type": "button", "destination_url": "/request-quote/" });
Demo & Consultation Events
For B2B companies, demos and consultations are the highest-intent actions. Tracking the full lifecycle — from request to completion — connects marketing spend to actual sales opportunities.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
demo_requested |
demo_type |
string | User submits demo request form |
company_size |
string | ||
industry |
string | ||
source_page |
string | ||
meeting_booked |
meeting_type |
string | Calendar slot confirmed (Calendly, HubSpot) |
meeting_duration |
number | ||
days_until_meeting |
number | ||
meeting_attended |
meeting_type |
string | Meeting actually took place (server-side) |
meeting_duration |
number | ||
attendee_count |
number | ||
meeting_no_show |
meeting_type |
string | Booked meeting not attended (server-side) |
days_since_booking |
number |
The meeting_booked to meeting_attended gap is one of the most undertracked metrics. In my experience, no-show rates for B2B demos range from 15% to 40%. Tracking days_until_meeting helps you optimize: meetings booked 1-2 days out have significantly lower no-show rates than those booked a week ahead.
Note that meeting_attended and meeting_no_show are server-side events — they come from your CRM or calendar API, not from the browser. If you’re running server-side GTM, route these through your server container. Otherwise, fire them via the GA4 Measurement Protocol.
Lead Qualification Events
Qualification events bridge the gap between marketing and sales. They track when a lead moves from “someone who filled out a form” to “someone worth calling.”
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
lead_qualified |
qualification_type |
string | Lead reaches MQL or SQL threshold |
lead_score |
number | ||
qualification_source |
string | ||
days_to_qualify |
number | ||
lead_scored |
score_change |
number | Lead score changes (CRM trigger) |
new_score |
number | ||
score_reason |
string | ||
lead_assigned |
assigned_to |
string | Lead routed to sales rep |
assignment_method |
string | ||
lead_score |
number | ||
lead_disqualified |
disqualify_reason |
string | Lead marked as not qualified |
disqualify_stage |
string |
Use qualification_type values like mql (Marketing Qualified Lead), sql (Sales Qualified Lead), or pql (Product Qualified Lead). The qualification_source parameter tells you what triggered the qualification: score_threshold, manual_review, demo_completed, or product_usage.
These events are almost always server-side. They originate from your CRM (HubSpot, Salesforce, Pipedrive) and should be sent to GA4 via the Measurement Protocol or server-side GTM to close the loop between marketing attribution and sales outcomes.
Data Layer Example: Lead Qualified (Server-Side)
// GA4 Measurement Protocol payload { "client_id": "stored_ga_client_id", "events": [{ "name": "lead_qualified", "params": { "qualification_type": "sql", "lead_score": 85, "qualification_source": "demo_completed", "days_to_qualify": 12 } }] }
Call Tracking Events
Phone calls are still a major conversion channel for service businesses, real estate, healthcare, and high-ticket B2B. If you’re running Google Ads call extensions or have phone numbers on your site, these events connect calls to your analytics data.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
call_started |
call_source |
string | Phone call initiated (via call tracking) |
tracking_number |
string | ||
page_path |
string | ||
call_completed |
call_duration |
number | Call ends (server-side from provider) |
call_outcome |
string | ||
is_qualified |
boolean | ||
call_source |
string |
Use call_outcome values like qualified, voicemail, wrong_number, not_interested, or booked_meeting. The call_duration parameter (in seconds) helps define quality thresholds — calls under 30 seconds are rarely genuine leads, while calls over 120 seconds often indicate high intent.
Proposal & Pipeline Events
These events track what happens after qualification — when leads move through your sales pipeline toward becoming customers. They’re essential for connecting marketing attribution to actual revenue.
| Event | Parameters | Type | When It Fires |
|---|---|---|---|
proposal_sent |
proposal_value |
number | Proposal or quote sent to lead |
currency |
string | ||
proposal_type |
string | ||
proposal_viewed |
proposal_value |
number | Lead opens the proposal |
time_to_view |
number | ||
deal_won |
deal_value |
number | Deal closed successfully |
currency |
string | ||
days_to_close |
number | ||
deal_source |
string | ||
deal_lost |
deal_value |
number | Deal marked as lost in CRM |
lost_reason |
string | ||
competitor |
string |
The deal_won event is your ultimate conversion. When you fire it with the original GA4 client_id via the Measurement Protocol, you can see the full journey: which ad campaign brought the visitor, which page they landed on, which form they submitted, and ultimately how much revenue that generated. This is the closed-loop attribution that most lead gen teams struggle with.
Complete Event Map
Here’s every lead gen event at a glance, organized by funnel stage with recommended GA4 key event status.
| Stage | Event Name | Source | Key Event? |
|---|---|---|---|
| Discovery | form_view |
Client | No |
cta_click |
Client | No | |
chat_opened |
Client | No | |
phone_click |
Client | No | |
| Capture | form_start |
Client | No |
form_field_complete |
Client | No | |
form_submit |
Client | Yes | |
form_error |
Client | No | |
content_download |
Client | Yes | |
chat_message_sent |
Client | No | |
demo_requested |
Client | Yes | |
| Qualification | call_started |
Server | No |
call_completed |
Server | Yes | |
lead_scored |
Server | No | |
lead_qualified |
Server | Yes | |
lead_disqualified |
Server | No | |
| Handoff | lead_assigned |
Server | No |
meeting_booked |
Client/Server | Yes | |
meeting_attended |
Server | Yes | |
meeting_no_show |
Server | No | |
proposal_sent |
Server | No | |
proposal_viewed |
Server | No | |
deal_won |
Server | Yes | |
deal_lost |
Server | No |
Key events (formerly “conversions” in GA4) should be reserved for actions that represent genuine business value. Mark form_submit, demo_requested, lead_qualified, meeting_attended, and deal_won as key events. Keep discovery and micro-interaction events as regular events — they’re valuable for funnel analysis but shouldn’t clutter your conversion reports.
GTM Implementation Guide
Here’s how to implement the core lead gen events in Google Tag Manager. The exact triggers depend on your form technology, but the pattern stays the same.
| Event | GTM Tag Name | Trigger Type | Notes |
|---|---|---|---|
form_view |
GA4 Event – form_view | Element Visibility | Fire once per form per page |
form_start |
GA4 Event – form_start | Custom Event (dataLayer) | First interaction with any field |
form_submit |
GA4 Event – form_submit | Form Submission or Custom Event | Use success callback, not native submit |
cta_click |
GA4 Event – cta_click | Click – All Elements | Filter by CSS class or data attribute |
phone_click |
GA4 Event – phone_click | Click – Just Links | Filter: Click URL contains “tel:” |
chat_opened |
GA4 Event – chat_opened | Custom Event (dataLayer) | Depends on chat provider’s API |
Critical: for form_submit, never trigger on the native form submission event. Most modern forms use AJAX — the page doesn’t reload. Instead, listen for the success callback from your form plugin (HubSpot, Typeform, Gravity Forms all push to the data layer) or use a custom dataLayer.push() after server-side validation confirms the submission went through.
Parameter Naming Conventions
Consistent parameter naming across all lead gen events saves you from GA4’s 50 custom-dimension limit and makes analysis straightforward.
| Parameter | Reused Across | Example Values |
|---|---|---|
form_name |
form_view, form_start, form_submit, form_error | contact_main, quote_sidebar, demo_pricing |
form_type |
form_view, form_start, form_submit | contact, newsletter, demo_request, quote, gated_content |
page_path |
form_view, cta_click, phone_click, chat_opened | /contact/, /pricing/, /product/ |
meeting_type |
meeting_booked, meeting_attended, meeting_no_show | demo, consultation, discovery_call, onboarding |
lead_score |
lead_qualified, lead_scored, lead_assigned | 0–100 numeric score |
This reuse pattern is key. Five shared parameters cover 15+ events. Without it, you’d burn through your custom dimension quota within a single project.
Validation Checklist
Before going live with your lead gen tracking, verify each item:
Implementation Checklist
form_submitfires only on successful submission, not on validation errorsform_viewfires once per form per page load (not on every scroll)form_typevalues are consistent across all form eventstime_to_completeresets if user navigates away and returns- Phone numbers in
phone_clickdon’t contain PII beyond the number itself - Server-side events include the original GA4
client_idfor attribution deal_wonvalue matches actual revenue, not estimated pipeline value- Key events are marked for the right events (form_submit, demo_requested, lead_qualified, deal_won)
- All parameter values are lowercase and use underscores
- Test in GA4 DebugView before deploying to production
FAQ
Should I track every form field individually?
No. Track form_field_complete only for multi-step or high-value forms where you need to identify the exact drop-off point. For simple 3-5 field contact forms, form_start and form_submit are sufficient. Field-level tracking on every form creates unnecessary noise.
How do I connect GA4 leads to CRM data?
Store the GA4 client_id (from the _ga cookie) as a hidden form field. When the form submits, your CRM receives the client_id alongside the lead data. Later, when firing server-side events like lead_qualified or deal_won, use that stored client_id in the Measurement Protocol payload to attribute revenue back to the original session.
What’s the difference between form_submit and demo_requested?
form_submit is the generic event for all form submissions — contact forms, newsletter signups, quote requests. demo_requested is a specific high-intent event for demo or consultation requests. Fire both: form_submit for overall form analytics, and demo_requested as a separate key event with additional parameters like company_size and industry.
Do I need server-side tracking for lead gen?
For basic form tracking, client-side is fine. But if you want to connect CRM events (lead_qualified, deal_won) back to GA4 for attribution, you need server-side tracking via the Measurement Protocol or server-side GTM. This is the only way to close the loop between ad spend and revenue for lead gen businesses.
How many events should I start with?
Start with five: form_view, form_start, form_submit, cta_click, and phone_click. These cover the client-side funnel and take about two hours to implement in GTM. Add qualification and pipeline events later when your CRM integration is ready. Tracking five events well beats tracking twenty poorly.
Related Guides on EU-Medin
Further Reading
- GA4 Recommended Events Reference — Google Analytics
- GA4 Measurement Protocol — Google Analytics
- Key Events in GA4 — Google Analytics Help
- GTM Form Tracking Guide — Analytics Mania
Product Analytics Specialist based in Munich. Helping teams implement clean, actionable analytics since 2015.