The Website Measurement Plan: Events, Lead Quality, and Consent-Aware Reporting
A form fire is not a commercially useful lead. Name the events from call-to-action view through qualified inquiry, wire Google’s recommended generate_lead, and set consent defaults before you trust the graph.

You can have a beautiful form and a useless graph. The graph counts button clicks. Sales counts people who can buy. A measurement plan is the dictionary that stops those two teams from using the same word for different things.
This sits next to websites that convert without feeling salesy. How the form is built is the Supabase and edge functions spoke. How search clicks connect to this pipe is SEO beyond rankings.
The event dictionary (write this before you open Tag Manager)
One row per action. Name, trigger, owner, and whether it is allowed to be a key event. If a row has no owner, it will rot.
| Event | Fires when | Key event? | Owner |
|---|---|---|---|
| cta_view | Primary call to action (CTA) is in view (optional, diagnostic) | No | Web |
| form_start | First interaction with the contact form (GA4 can collect this) | No | Web |
| form_submit | The form POST succeeds, not merely a click | No, too wide | Web |
| generate_lead | Contact (or equivalent) request succeeded | Yes, if this is the on-site goal | Web |
| qualify_lead | A human marks the row as matching the who-line | Optional, usually customer relationship management (CRM) | Sales |
Sourced: GA4 automatically collected events include form_start and form_submit when Enhanced Measurement is on (Automatically collected events). Recommended lead events, including generate_lead and qualify_lead, are listed in [GA4] Recommended events (checked 16 September 2026). Send recommended events with their prescribed parameters if you want the Lead acquisition report to populate as Google designed it.
flowchart LR
V["CTA in view"] --> S["Form start"]
S --> X["Submit succeeds"]
X --> G["generate_lead"]
G --> Q["Human qualify"]
Q --> P["Proposal"]
X -.-> SP["Spam / test"]
SP -.-> D["Do not qualify"]
Fire generate_lead on success, not on hope
Google’s key-event help says you should not mark every form_submit as the business goal. Narrow it. Either create an event that copies form_submit when form_name matches the contact form, or push generate_lead yourself after the server accepts the row. Source: How to measure key events.
JavaScript
// After a successful fetch to your form endpoint
gtag('event', 'generate_lead', {
currency: 'KES',
value: 0,
});dataLayer
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'generate_lead',
form_id: 'contact',
});Hypothetical contact form. Push only after the edge function returns 200. A click listener on the button will count failures as leads.
value is optional. Do not invent a lead value to make the report look expensive. Zero is honest until you have a real average from closed work.
Consent defaults before the first event
If you run a banner, set consent mode defaults before config or event commands. Google’s developer guide: set the default, then update after the visitor chooses. Consent mode v2 (November 2023) added ad_user_data and ad_personalization. For European Economic Area (EEA) traffic, Google asks you to upgrade if you still run the older pair. Source: Set up consent mode on websites. This is not a privacy-law opinion. It is how the tag behaves.
gtag('consent', 'default', {
ad_storage: 'denied',
ad_user_data: 'denied',
ad_personalization: 'denied',
analytics_storage: 'denied',
});
// Later, after the banner:
gtag('consent', 'update', {
analytics_storage: 'granted',
});
If analytics_storage stays denied, your “we got 40 leads from the site” graph is a subset. Say so in the Monday review. Do not “correct” the number by counting CRM rows into GA4 by hand. Keep both. They answer different questions.
Attribution limits (say them out loud)
- Last click is a convenience: the last non-direct source gets the key event. A person who read three articles and then searched your name is not “branded search did it.”
- Thank-you page views duplicate: refresh, back button, and preview bots. Prefer a server-confirmed generate_lead.
- WhatsApp and phone: they will not hit the form. Tag the click if you must, then still qualify in the sheet. A tap is not a conversation.
What this does not prove
A key event is not a qualified conversation. A qualified conversation is not a win. Consent-denied traffic is not “the site is dead.” It is a hole in the graph. Report the hole.
If you want the form itself to be boring and reliable, that is a websites job. Send the event dictionary with the who-line. We can tell in one pass whether you are counting submits or buyers.
Frequently asked questions
What is a website measurement plan?
A written list of the on-site actions you care about, the event names you will send, who owns qualification, and what happens when the visitor has not consented to analytics storage. If that list lives only in a Google Analytics 4 (GA4) property, you do not have a plan. You have a default.
What is the difference between form_submit and generate_lead?
form_submit is an automatically collected web event in GA4 Enhanced Measurement: a form was submitted. generate_lead is a recommended event you send when someone submits a form or request for information. Google’s Analytics Help says to send recommended events with their prescribed parameters. A spam submit can still fire both. Qualification is a later event or a CRM field.
What is consent mode?
Google consent mode lets tags adjust collection based on the visitor’s consent for advertising and analytics. You set a default (often denied in regions that require a banner), then update after the choice. Consent mode v2 added ad_user_data and ad_personalization. This is a technical control, not legal advice. Ask counsel which defaults your market needs.
Should every form submit be a key event?
No. Google’s key-event guide says you want the specific form that is the business goal, not every form on the site. Newsletter, search, and contact are different jobs. Mark generate_lead (or a narrowed copy of form_submit) as the key event. Leave the rest as diagnostics.
Where does lead quality live if Analytics cannot see the sales call?
On the intake sheet or customer relationship management (CRM) system. GA4’s lead-generation recommended events include qualify_lead, disqualify_lead, working_lead, and close_convert_lead for when conversion happens offline. Most small studios start by marking qualified by hand each Monday. That is enough until volume demands a write-back.
Do I need Google Tag Manager?
Only if the form does not change the URL and Enhanced Measurement cannot see a real submit. AJAX and embedded widgets often need a dataLayer push on success, not on button click. Test in DebugView. A thank-you page view is the boring version that still works.