Marketing Skill

Conversion Tracking

The conversion-tracking skill helps an AI agent set up, audit, and fix website conversion tracking, from form submissions, bookings, and phone calls to ecommerce purchases. It gets each conversion to GA4, Google Ads, Meta, LinkedIn, TikTok, or Microsoft Ads and proves a test conversion actually arrived.

Maintained by Corey Hainesv1.0.1Updated 2026-10-269 references
npx skills add coreyhaines31/marketingskills

Installs the full library — Conversion Tracking included

Set up conversion tracking by first deciding exactly what counts: a confirmed form submission, not a click on the submit button. Find how your form, booking, or checkout tool signals success, since every tool does it differently, and fire on that signal. A submit-click trigger counts failed validations and bots, and a thank-you page needs a guard against refreshes. Before adding anything, ask whether a server or native integration is already sending conversions, because a second sender is how double counting starts. Start with the free path: a browser tag in GTM with Enhanced Conversions or advanced matching turned on. Expect browser-side tracking to miss 10–30% of conversions to ad blockers, cookie limits, and cross-device journeys. You're done only when a test conversion has arrived in the destination platform.

How the Conversion Tracking skill works

  1. 1

    Split lead gen from ecommerce

    The agent first works out which kind of conversion it's dealing with. Lead gen (forms, bookings, chats, calls) usually has no backend record, so success has to be detected in the page, and that's where most silent errors happen. Ecommerce has an order record, so the hard parts move to value accuracy, item data, deduplication between pixel and server events, and refunds.

  2. 2

    Pin the three facts from evidence

    It answers three questions: what counts as a conversion, where it needs to land, and what tool runs the moment. It looks before asking, reading the context file, fetching the page for existing tags and the GTM container, and searching the codebase. It always asks whether anything already sends conversions server-side or through a native integration, since those leave no trace in the page.

  3. 3

    Find the tool's real success signal

    Using a per-tool catalog, it identifies how the form, booking, or checkout confirms success: a jQuery event for Gravity Forms with AJAX, a DOM event for Contact Form 7, a postMessage from a Calendly or Typeform iframe. For custom forms it reads the submit handler. It pushes back on anti-patterns like button clicks or pricing-page views set as Primary conversions.

  4. 4

    Choose the delivery path

    It checks for a native integration first, such as Shopify's Google and Meta channels, and names the gaps it leaves. Browser-side tags in GTM are free and complete for many setups, especially with Enhanced Conversions or advanced matching on. When ad blockers or missing conversions matter, it lays out the server-side spectrum, from your own API calls to server-side GTM to managed tools, free and native options first.

  5. 5

    Build, then verify arrival

    For covered lead-gen tools it generates a GTM import file that bundles the detection listener, trigger, Conversion Linker, and conversion tag, merged into the existing container. Consent requirements stay intact. Then it verifies: the dataLayer event appears once, the tag fires in Preview, and you get a named platform check with an expected result. It closes with a status, never an unearned "done."

  6. 6

    Audit by symptom, without guessing

    For broken tracking it routes on your symptom, from "spend but zero conversions" (walk the click ID chain) to "way too many conversions" (duplicate senders or Every vs. One counting). Each finding is marked observed, reported, or inferred. It reports the cause and the exact change it would make, then stops and asks. "I couldn't find the cause" is an allowed answer; an invented one isn't.

When to use it

Your agent reaches for this skill when you ask for things like:

“conversions stopped”“double counting”“spend but no conversions”“GA4 and Google Ads don't match”

What's inside

The playbook covers

The one distinction that drives everythingStart hereThe three questionsNon-negotiablesSetup flowAudit flowVerification disciplineChoosing toolsWhere everything isBoundaries

Reference library — 9 deep-dives

Audit playbook: evidence procedure, scoring, and reportLoad this when the audit flow starts. The symptom routing table and verdict rules stay in `SKILL.md`, because a verdict reached without them is the failure this skill exists to prevent. This file is the evidence-gathering procedure and the report format.Browser-side tracking: the complete free pathLoad this to install pixels and tags directly, or via Google Tag Manager with this skill's recipe system. This path is free, self-serve, and complete; for analytics-only destinations it's a sound default, though server-side still recovers the conversions ad blockers stop and gives more accurate numbers. When the destination is an ad platform, state its ceiling honestly, and the ceiling is two things. Some conversions, typically 10–30% depending on audience, never get credited to the ad (ad blockers, Safari's cookie limits, and cross-device journeys where the ad is clicked on one device and the conversion happens on another; magnitudes in `discrepancies.md`), and a default tag carries only the click ID, IP address, and user agent. Browser tags can also send hashed email and phone (Google Enhanced Conversions for web, Meta advanced matching, TikTok `ttq.identify`); turn those on first, knowing they share the tag's losses. Say both, so the user's choice is informed.Conversion moments: how each tool signals successLoad this to establish or diagnose the conversion moment. Section 1 is the lead-gen problem (success must be inferred from a browser signal, and every tool signals differently); it carries literal, grep-able strings for working from (A) form mechanics, (B) static page source, (C) a headless browser, and (D) a codebase. Section 2 covers the moments this repo ships tested detectors for. Section 3 is the long tail. Section 4 is ecommerce, where the problem mostly does not exist.Why the numbers never matchLoad this for any discrepancy question ("GA4 and Google Ads don't match", "Meta says more than Google") and for expectation-setting at the end of a setup. Compiled August 2026, refund material September 2026. Vendor claims flagged [VENDOR].Ecommerce platforms: Shopify, WooCommerce, and the restLoad this when the conversion is a purchase and the store runs on a platform. It covers what actually works on each platform right now, what recently stopped working (with dates, because "my tracking died" increasingly has a calendar explanation), and the mechanics that apply to every store regardless of platform.Google AdsGuided setup for wiring a form or booking tool to Google Ads. The agent usually cannot log into the user's ad account, so account steps say exactly where to click and what to report back. Website and GTM steps the agent may be able to do directly.MetaContents:LinkedIn, TikTok, Microsoft, and the restContents:Server-side conversion tracking: the real optionsLoad this when the delivery-path decision comes up in setup (S3), when an audit finds structural loss no client-side fix recovers, or when the user asks a direct decision question ("should we go server-side?", "is tool X worth it?"). The job of this file is to lay out the whole spectrum with honest costs so the user picks on fit. It never has one answer.

See it in action

You ask

WordPress site, Gravity Forms contact form, we have Google Tag Manager already. I want form submissions showing up as conversions in Google Ads. Where do I start?

The skill delivers
First, the success signal

Gravity Forms signals success differently depending on settings, so check one thing first: is the form embedded with AJAX on? AJAX on: Gravity fires the jQuery event gform_confirmation_loaded on success. It's jQuery-triggered, so a plain addEventListener won't catch it. The detection listener handles that and pushes gravity_form_submitted to the dataLayer. AJAX off, text confirmation: the page reloads to the same URL with no event, so the only hook is the confirmation message (.gform_confirmation_message) via Element Visibility. Redirect confirmation: a thank-you page trigger works, with a guard against refreshes and direct visits. Don't fire on the submit button. That counts failed validations and bots.

Steps in Google Ads and GTM

1. Google Ads: Goals > Conversions > Summary > + Create conversion action > Website. Add it manually (skip "Automatically without code"). Category: Submit lead form. Counting: One. Status will show Unverified. That's normal. 2. Open the action > Tag setup > Use Google Tag Manager. Send me the Conversion ID and Conversion label. 3. I'll build one GTM import file with the Gravity detection tag, a trigger on gravity_form_submitted, a Conversion Linker, and the Google Ads conversion tag. 4. GTM: Admin > Import Container > Merge > Rename conflicting. Expect about 3 tags and 1 trigger added, no deletions. 5. Preview, submit one test entry (I'll ask before we submit on the live site), confirm the event fires once and the conversion tag fires on it, then publish.

Before and after

Before importing: is anything already sending this form to Google Ads, such as an existing AW- tag or a GA4 key event imported as Primary? Two senders double count. After: confirm auto-tagging is on, expect Unverified for up to 48 hours, then test through a real ad click. A bare test proves the tag fires, not attribution. Next free step: turn on Enhanced Conversions so the lead's hashed email travels with it.

More things to ask

Real requests the skill is tested against:

  • Our site is on Webflow and we use an embedded Typeform for enquiries. We don't have Tag Manager and honestly don't want it. I need these going to Meta ads.

  • I'm a plumber. I run Google Ads and people just call the number on my site, there's no form at all. My ads guy says I can't track that. Can I?

  • B2B SaaS, spending on Google Ads. The signup completes in our Next.js backend after email verification. No form tool. How do these become conversions?

  • We're a React single page app. There's a /thank-you route after the form but our GTM thank-you page trigger records nothing. Ads shows zero.

  • Our Shopify store's Google Ads conversions dropped to zero in the last week of August 2026 and nothing was changed on our side. What happened?

FAQ

How do I track form submissions as conversions in Google Ads?

Create a Website conversion action manually in Google Ads (Submit lead form, counting set to One) and copy its Conversion ID and label. In GTM, add a trigger on your form tool's real success signal, not the submit click, plus a Conversion Linker and the Google Ads conversion tag. Test in Preview, publish, confirm auto-tagging is on, and expect the status to read Unverified for up to 48 hours before it records conversions.

Why does Google Ads show zero conversions when I'm getting leads?

Suspect the click ID chain first. The gclid has to survive from the ad click to the conversion: auto-tagging must be on, the Conversion Linker must run, redirects mustn't strip URL parameters, and consent settings decide whether tags fire at all. Then check that the tag fires on confirmed success. AJAX forms that never change the URL silently break thank-you page triggers, a very common failure.

Why don't GA4 and Google Ads conversion numbers match?

Usually nothing is broken. A 10–30% gap between GA4 and Google Ads is normal, because they count, attribute, and date conversions differently. Investigate only if the gap is above roughly 40%, the direction flips, a stable gap suddenly changes, or a platform reads exactly zero. Before comparing, line up the conversion action, date basis, time zone, attribution window, and campaign scope, and ignore the last three days, which keep filling in.

Why am I getting double-counted conversions?

Common causes: two senders for the same action, such as a Meta pixel and a server event without shared event IDs, or a Google Ads tag and a GA4 key event import both set to Primary. Lead forms set to count Every conversion instead of One, thank-you pages that count refreshes, and detection code installed twice (once in the site head, once in GTM) do it too. Keep one Primary action per real-world conversion.

Do I need server-side tracking?

Not always. Browser-side tags are free and complete for many setups, though they typically miss 10–30% of conversions to ad blockers, Safari cookie limits, and cross-device journeys. Turn on the free fixes first: Enhanced Conversions for Google, advanced matching for Meta. Server-side matters more when blockers or missing conversions affect bidding. It ranges from native integrations and your own API calls to server-side GTM and managed tools, with real cost differences.

Can an AI agent set up conversion tracking for me?

It can do most of it. The agent can inspect your page and GTM container, identify your form tool's success signal, generate a GTM import file, and confirm the event and tag fire. It usually can't log into your ad account, so it gives you named checks, like where to look in Meta Test Events and what should appear. It won't submit a live test conversion or publish a container without your explicit yes.

Related skills

Use it in your agent

Conversion Tracking is a plain SKILL.md folder, so the same skill loads in any agent that reads the skills format. Setup guides:

Build a tool for this workflow?

Marketers run this skill mid-task — the exact moment your tool matters. Partner tiers put your tool inside the skill their agent runs.

See partner tiers