Every tracking project that went wrong in my experience went wrong before GTM was opened: nobody had agreed what counted as a lead, which pages were in the funnel, or what the developer needed to push. A measurement plan fixes that in a couple of pages. This guide gives the structure, a template, worked examples, and the hand-off to a dataLayer specification.
The Five Layers
- Business objectives. Why the site exists in business terms.
- Goals and KPIs. What success looks like, with numbers.
- Key actions. What a visitor does on the site that moves a KPI.
- Events and parameters. How each action is captured, with the data that describes it.
- Conversions per platform. Which events become key events in GA4, conversion actions in Google Ads, and events in Meta, and which are primary.
Work top down. If an event cannot be traced back to an objective, it does not go in the plan.
The Template
1. Business objectives
One or two sentences. "Generate qualified enquiries for tracking services from ecommerce and lead-gen businesses in the US, UK and Australia."
2. Goals and KPIs
| Goal | KPI | Target | Source of truth |
|---|---|---|---|
| Win clients | Qualified audit bookings per month | 12 | Calendar plus CRM |
| Grow reach | Guide reads per month | 2,000 | GA4 content_read |
| Product adoption | Chrome extension installs | 150 per month | Chrome Web Store, GA4 click |
3. Key actions
| Action | Where | Why it matters |
|---|---|---|
| Book an audit call | Calendly embed, contact section | Primary business outcome |
| Submit contact form, qualified | Contact form with role field | Secondary lead path |
| Click WhatsApp | Floating button, contact section | Lead path for some regions |
| Read a guide | Guide pages | Audience and SEO value |
| Click Install on Chrome | Extension section and page | Product adoption |
4. Events and parameters
| Event | Trigger | Parameters | Platform mapping |
|---|---|---|---|
| calendly_booking | Calendly scheduled message | booking_tool, calendly_event_uri | GA4 generate_lead, GAds Booking, Meta Schedule |
| form_submit_success | Form server success | form_name, lead_role, lead_service, lead_qualified, user_email | GA4 generate_lead, GAds Lead if qualified, Meta Lead |
| whatsapp_click | Click on wa.me link | click_location | GA4 custom, secondary |
| content_read | 50 percent scroll plus 60 seconds | content_type, content_category | GA4 custom |
| extension_install_click | Click on store link | click_location | GA4 custom, GAds secondary |
5. Conversions per platform
| Platform | Primary | Secondary |
|---|---|---|
| GA4 key events | generate_lead | content_read, whatsapp_click |
| Google Ads | Booking, Qualified Lead | WhatsApp click, Install click |
| Meta | Schedule, Lead | none |
Worked Examples
Ecommerce
Objective: profitable online sales. KPIs: revenue, ROAS, new customer rate. Key actions: view product, add to cart, begin checkout, purchase. Events: GA4 recommended ecommerce events with full items arrays. Conversions: purchase primary everywhere with value; add_to_cart and begin_checkout secondary in Google Ads. Extra parameters: customer_type new or returning on purchase, payment_method. Offline: refunds imported.
Lead generation
Objective: qualified leads for a service business. KPIs: qualified leads, cost per qualified lead, close rate by channel. Key actions: call, form, booking. Events: phone_click with location, form_submit_success with qualification fields, booking event from the scheduler. Conversions: qualified form and booking primary; raw form and phone click secondary; CRM stage uploaded as Enhanced Conversions for Leads. Extra: capture gclid and UTMs into the CRM.
SaaS
Objective: paid subscriptions. KPIs: trials, trial to paid rate, MRR by channel. Key actions: sign up, start trial, activate, subscribe. Events: sign_up with method, start_trial, activation_complete, purchase with plan as item. Conversions: subscribe primary in Google Ads and Meta once volume allows, trial primary until then. User properties: plan, trial status. User ID for cross-device.
From Plan to dataLayer Specification
Each event row becomes a specification entry the developer implements:
// form_submit_success: push after the server confirms the submission
window.dataLayer.push({
event: 'form_submit_success',
form_name: 'Contact', // string, the visible form title
form_id: 'contact-main', // string, stable identifier
lead_role: 'business_owner', // string from the role dropdown
lead_service: 'ga4_setup', // string from the service dropdown
lead_qualified: true, // boolean, role in the qualified set
user_email: 'name@example.com', // string, lowercased
user_phone: '+15551234567' // string, E.164 if provided
});
Add for each event: when exactly it fires, what must not trigger it, and an example payload. The dataLayer guide on this site covers conventions.
Governance
- Version and date on the first page.
- An owner named for the plan and for each platform.
- A change log at the end.
- A quarterly review that compares the plan with the live container and the audit findings.
Outcome
Agreement on what matters before any tag is built, a specification the developer can implement without a meeting, a container that maps one to one to business goals, and a document that outlives any one person working on the site.
