Complete analysis of GA4 event coverage, Google Ads conversion mapping, and implementation gaps. Generated: August 31, 2026
11
Events Confirmed in GA4
6
Expected Events Missing
1
Events Wrong Name
6
GTM / Implementation Fixes
🚨 Critical Finding: Standard Google Ads event names are NOT being used
Google Ads expects generate_lead, begin_checkout, and purchase. QuiPlans fires lead_submitted, checkout_started, and purchase_completed. Without aliasing these in GTM, Google Ads Smart Bidding cannot auto-detect conversions. The server-side CAPI in stripeWebhook also requires 3 secrets to be set before it becomes active.
| Event Name | GA4 Status | Fires On | Trigger | Daily Vol. | Ads Conversion? | Ads Category | Notes |
|---|---|---|---|---|---|---|---|
lead_submitted | ✅ Confirmed | AduFreePlan, AduFreePlanV2, AduLandingFree, AduFinderQuizV3 | User submits name/email lead form | 20–60 | Yes | Submit lead form | Maps to Meta Lead. Should be Google Ads 'Submit lead form' conversion. |
quiz_completed | ✅ Confirmed | lib/analytics.js → Analytics.quizCompleted(), AduFinderQuizV3 | User completes all quiz steps and reaches results | 10–30 | Yes | Submit lead form | Fires via Analytics.quizCompleted(). Also mapped to Meta custom event QuizCompleted. ✅ Should be secondary conversion in Google Ads. |
generate_lead | ❌ Missing | Not found in codebase | N/A — not implemented | 0 | Yes | Submit lead form | ❌ This Google-standard event name does NOT exist. The equivalent is lead_submitted. Add an alias or rename for Google Ads compatibility. |
begin_checkout | 🔄 Renamed | lib/analytics.js → Analytics.checkoutStarted() | User clicks 'Get Plans' / starts checkout flow | 5–20 | No | Begin checkout | Fires as checkout_started (not begin_checkout). Google Ads expects begin_checkout. GTM should map checkout_started → begin_checkout. |
checkout_started | ✅ Confirmed | PlanCheckout, InstantDownloadCheckout, PermitReadyCheckout, PlanFunnel | User initiates any checkout flow | 5–20 | No | Begin checkout | Custom name — should be aliased to begin_checkout in GTM for Google Ads auto-tagging. |
purchase | ❌ Missing | Not found — codebase uses purchase_completed | N/A — not implemented under this standard name | 0 (under this name) | Yes | Purchase | ❌ Google Ads standard event is 'purchase'. Codebase fires purchase_completed. GTM must map purchase_completed → purchase with value/currency/transaction_id. |
purchase_completed | ✅ Confirmed | lib/analytics.js → Analytics.purchaseCompleted(), PurchaseSuccess page | User lands on /PurchaseSuccess with valid session_id | 2–10 | Yes | Purchase | Fires via GTM dataLayer + gtag. NOT sent to Meta Pixel here (deduped — pixel fires separately in PurchaseSuccess). Server-side CAPI also fires via stripeWebhook. |
engineering_checkout_completed | ✅ Confirmed | lib/analytics.js → Analytics.engineeringCheckoutCompleted() | Engineering service purchase confirmed | 1–5 | Yes | Purchase | Should feed a separate high-value Google Ads conversion action. |
property_match_purchase | ❌ Missing | Not found in codebase | N/A — not implemented | 0 | Yes | Purchase | ❌ Not fired. purchase_completed fires with package_type=quick_insight — GTM should create a filtered conversion from that. |
engineer_review_purchase | ❌ Missing | Not found in codebase | N/A — not implemented | 0 | Yes | Purchase | ❌ Not fired as own event. engineering_checkout_completed exists but may not always fire. purchase_completed with package_type=lot_fit is the reliable source. |
permit_plan_purchase | ❌ Missing | Not found in codebase | N/A — not implemented | 0 | Yes | Purchase | ❌ Not fired. purchase_completed with package_type=permit_ready is the source. Needs GTM filter conversion. |
permit_package_purchase | ❌ Missing | Not found in codebase | N/A — not implemented | 0 | Yes | Purchase | ❌ Not fired. purchase_completed with package_type=feasibility_study_149 or feasibility is the source. |
plan_viewed | ✅ Confirmed | PlanDetail page, Analytics.planViewed() | User opens a plan detail page | 30–100 | No | View item | Useful for remarketing audiences. Not a conversion — use as audience signal. |
plan_selected | ✅ Confirmed | PlanCatalog, PlanDetail, Analytics.planSelected() | User clicks on a plan or selects for checkout | 10–40 | No | View item | Good for top-funnel audience building. |
roi_calculated | ✅ Confirmed | RoiCalculator page, AduFinderQuizV3Results | User views ROI projection | 5–20 | No | — | Engagement signal. No Google Ads action needed. |
engineering_clicked | ✅ Confirmed | Multiple checkout pages, Analytics.engineeringClicked() | User clicks on any engineering upsell CTA | 5–15 | No | — | Intent signal. Good for RLSA audience. |
auth_verified | ✅ Confirmed | FreePlanSuccess (OTP verification), Analytics.authVerified() | User verifies their email via OTP | 5–20 | No | — | Email verification checkpoint. Not a conversion. |
plans_catalog_view | ✅ Confirmed | PlanCatalog page load | User views the plan catalog | 15–60 | No | View item list | Top-funnel audience. No conversion needed. |