Conversion tracking

Most Google Ads campaigns fail because conversion tracking is broken or incomplete. VibeAds wires the entire chain automatically. You never touch tag manager unless you want to.

GTM and GA4 (per account)

Every paid-tier user gets a dedicated GTM container and a GA4 property provisioned on first campaign publish. The containers are owned by VibeAds (so we can sync tags atomically) but scoped to your account.

Auto-created tags:

  • GA4 page view + scroll + form_submission + phone_call_click
  • Google Ads conversion (awct) firing on both events with conversion_value from dataLayer
  • Meta Pixel (Pro+) firing on form_submission with hashed PII
  • TikTok and LinkedIn pixels (Max) firing on form_submission

On config changes (new conversion action, new pixel), the agent reconciles tags via sync-gtm-tags.

The four conversion actions

Every published campaign auto-creates a 4-action conversion split on your Google Ads account:

  1. UPLOAD_CLICKS_LEAD. Form submissions uploaded via GCLID. Primary at launch. Drives Smart Bidding.
  2. UPLOAD_CLICKS_REVENUE. Paid invoices from Jobber uploaded via GCLID. Starts secondary, promoted to primary once you have 30 paid invoices in a rolling 30-day window. Category PURCHASE.
  3. AD_CALL. Native Google call tracking, call duration as a conversion signal. Primary if business_phone is set. Category CONTACT.
  4. WEBPAGE. GTM form_submission and phone_call_click events. Primary. Category LEAD.

Why start REVENUE as secondary: Smart Bidding needs ~30 conversions in 30 days on a primary action before it can reliably optimize. Most new campaigns get 5 to 15 paid invoices in their first month. Secondary status lets the agent collect signal without choking spend.

dataLayer events

Every funnel and landing page fires dataLayer events the GTM container consumes:

  • landing_page_view on boot. Carries campaign_id + ad_group_id from server-injected meta tags.
  • funnel_step_complete on each step. Carriesstep_name, time_on_step_ms.
  • scroll_depth at 25/50/75/100%.
  • form_submission on lead form submit. Carriesconversion_value (the category lead value) +conversion_currency.
  • phone_call_click on any click-to-call link.

Offline conversion upload

Pro and Max tiers upload offline conversions back to Google Ads:

  • Form submissions. Once a lead is qualified (score over 30 or human review), upload-conversions uploads it to UPLOAD_CLICKS_LEAD.
  • Qualified calls. upload-call-conversions runs every 15 min and uploads calls with score over 30 (Twilio + Deepgram + Gemini pipeline) to UPLOAD_CLICKS_LEAD.
  • Paid invoices (Max + Jobber). upload-jobber-conversions uploads paid invoices to UPLOAD_CLICKS_REVENUE. Recurring categories get predictive LTV (cleaning 10x, pool 12x, pest 8x). One-time invoices upload actual revenue. GCLID expiration handled at 85 days (Google's window is 90).
Double-counting protection: when Jobber is connected, the call upload skips leads with a jobber_job_id because the eventual paid invoice will upload anyway. One gclid, one conversion.

Signal quality and retraction

When a lead is marked as spam in the CRM, the system automatically retracts the conversion from Google Ads via the Adjustment API. Smart Bidding stops over-bidding on the source keyword. Same mechanism for marking a call as spam.

Verifying installation

Every campaign detail page has a Tracking tab with a Verify Installation panel. Paste any landing page URL and it runs 7 checks:

  • GTM container present
  • GA4 measurement ID firing
  • Conversion Linker present
  • Google Ads conversion tag present
  • Block 1 campaign_id init
  • form_submission handler
  • phone_call_click handler

Useful when you bring your own landing page and need to confirm the GTM + GA4 + DNI snippets are pasted correctly.