tracking-audit
Skill4 starsChanged 30 days agoMITView on GitHub
Audit and fix lead tracking end to end, from Tag Manager tags to GA4 key events to Google Ads conversion actions and goals, so every lead is counted once, by audience. Use when the user says "are my conversions right?", "Ads shows 0 conversions but we got leads", "set up lead tracking", "tracking audit", or before building campaigns on Smart Bidding.
1 other project uses a version of this.
Adopted by
Most recently taken up by
- harrison-ming/chuhai-skillstheir own version, first seen Nov 8, 2026
Other versions1 project uses a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 1
- harrison-ming/chuhai-skills★ 1same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository13 other files it gives its agents.
- ads-auditSkill
- campaign-architectSkill
- consent-auditSkill
- demand-gen-launchSkill
- event-auditSkill
- gtm-buildSkill
- monthly-reportSkill
- performance-insightsSkill
- pre-launch-checkSkill
- search-launchSkill
- setupSkill
- tracking-planSkill
- weekly-checkSkill
The file
We split this skill into the rules it gives an agent
9 rules. About 0 are common, 7 are distinctive, and 2 are very specific to this project.
≈0
Common · estimate
Many files like this have a rule of this kind.
≈7
Distinctive · estimate
This author's own choices. Worth a look.
2
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Very specific: line 13
Before a re-plan or new campaigns (the campaign-architect skill sends you here when goals look broken).
- Distinctive: line 25
Read everything first (steps 1–4), propose the target (step 5), then fix with previews (step 6).
- Distinctive: line 86
no cross-firing between audiences.
- Distinctive: line 87
test leads deleted from the CRM.
- Distinctive: line 98
Never publish Tag Manager without showing the pending changes and getting a yes.
- Distinctive: line 99
Never delete conversion actions.
- Distinctive: line 100
Never judge a campaign as "not converting" without the GA4 reconciliation in step 4.
- Distinctive: line 101
Never report GA4 engagement or lead drops for the last 2 days.
- Very specific: line 102
If the profile is read-only (no write tools), deliver steps 1–5 and tell the user that fixing needs npx google-marketing-agent accounts set …
≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Tracking audit
Smart Bidding is only as good as what it bids on. This skill checks the whole chain and fixes it in a safe order: site → Tag Manager → GA4 → Google Ads → campaign goals.
When to use
- Before a re-plan or new campaigns (the
campaign-architectskill sends you here when goals look broken). - Ads conversions don't match the leads the business actually received.
- New lead types (forms, messaging-app or phone clicks) need tracking.
Inputs
accountwithgtmContainerIdandga4PropertyIdset (check withaccount_profile; thesetupskill adds them).- The lead types that matter (forms, calls, messaging clicks, bookings) and the audiences they belong to (for example business buyers vs consumers, often split by URL path).
Steps
Read everything first (steps 1–4), propose the target (step 5), then fix with previews (step 6).
- Tag Manager.
gtm_overview(live version, unpublished changes), thengtm_listfor tags, triggers and variables, andgtm_geton anything suspicious. Look for:- conversions firing on page views;
- triggers that match visible text (a confirmation message) instead of a data layer event: they break silently when the copy or language changes;
- GA4 event tags without their parameters mapped (GA4 event tags don't forward data layer fields on their own);
- duplicate tags that would count one lead twice;
- triggers that don't separate audiences.
- GA4.
ga4_list_key_events. Thenga4_custom_reportwithdimensions: ["eventName", "landingPage"],metrics: ["eventCount"]for the last 30 days. Leave out the last 2 days: GA4 data for them is still being processed, so enddateTo3 days ago (dateFrom/dateTo). - Google Ads.
- Conversion actions:
SELECT conversion_action.id, conversion_action.name, conversion_action.type, conversion_action.category, conversion_action.counting_type, conversion_action.primary_for_goal, conversion_action.status FROM conversion_action. - Last 30 days per action:
SELECT segments.conversion_action_name, metrics.all_conversions FROM customer WHERE segments.date DURING LAST_30_DAYS. - What each campaign bids on:
campaign_conversion_goalandconversion_goal_campaign_config(seeads-audit). - New conversion actions are created with
ads_create_conversion_action(it prints the ID and label for the tag), or imported from GA4 key events via the GA4 link. Get IDs and labels of existing ones withSELECT conversion_action.id, conversion_action.name, conversion_action.tag_snippets FROM conversion_action. - Identify each action by what it really measures (its tag and label in Tag Manager), not its name: automatically created actions can carry misleading names that can't be changed through the API.
- Conversion actions:
- Reconcile. For the same period, compare GA4 lead events by page and type with Ads conversions per action.
Big gaps mean broken tags, missing actions or wrong goals, not "no leads".
guide("measurement"). Target matrix. Propose one row per lead type, so every lead is counted once and labelled by audience:
Lead Pages Fires on GA4 key event Ads action (counting) Custom goal Business form business pages data layer generate_leadgenerate_lead B2B Lead – Form (one per click) B2B Leads Business contact click business pages messaging or tel:link clickscontact click event B2B Lead – Contact B2B Leads Consumer form / contact consumer path same events on consumer pages … Consumer Lead – … Consumer Leads Page views and micro-events become secondary. Count contact clicks as leads when that's where leads really arrive. For a full plan (data-layer contract, custom dimensions, consent, naming, build order), run the
tracking-planskill.- Fix, in this order. Each change is a preview first and applied only after a yes.
- Site (the user's developers): push a data layer event on real success (not on visible text), with form name,
lead type, product and page language. If GA4 is loaded through Tag Manager, site code must push to the data
layer; calling
gtag()helpers from the site silently does nothing. - Tag Manager:
- Hand the data layer variables, the custom-event triggers split by page path, the GA4 event tags (each
parameter mapped) and the Ads conversion tags to the
gtm-buildskill, which builds them as recipes withgtm_build. - For what stays a raw
gtm_upsert(a Conversion Linker, consent settings), usegtm_geton a similar existing tag first to copy its exact parameter keys (an upsert create preview isn't validated by Google). - Pause junk tags.
gtm_publishonly after showing the full list of pending changes. Rollback = re-publish the previousversionId.
- Hand the data layer variables, the custom-event triggers split by page path, the GA4 event tags (each
parameter mapped) and the Ads conversion tags to the
- GA4:
ga4_set_key_eventfor each lead event. - Google Ads:
- Reuse existing actions to keep their history.
ads_update_conversion_actionrenames, re-categorises and sets one-per-click counting. It can't edit automatically created ("codeless") actions: leave those as they are and group them through the custom goal. ads_set_conversion_primarymakes page views and micro-events secondary.ads_create_custom_goalcreates one goal per audience.ads_assign_custom_goalassigns it to every campaign of that audience.
- Reuse existing actions to keep their history.
- Site (the user's developers): push a data layer event on real success (not on visible text), with form name,
lead type, product and page language. If GA4 is loaded through Tag Manager, site code must push to the data
layer; calling
- Verify with a checklist the user runs:
- one real test per matrix row;
- GA4 DebugView, or Realtime → Event count by Event name, in the GA4 interface. Next day:
ga4_custom_reportwitheventNamefor that date; - no cross-firing between audiences;
- test leads deleted from the CRM;
- the Ads action shows "Recording" after 24–48 hours.
Output
- The current-vs-target matrix, with each gap explained.
- The changes applied, with their change IDs; the Tag Manager version published.
- The verification checklist, with pass/fail as the user reports back.
Never
- Never publish Tag Manager without showing the pending changes and getting a yes.
- Never delete conversion actions; rename, re-categorise or make them secondary instead (history stays).
- Never judge a campaign as "not converting" without the GA4 reconciliation in step 4.
- Never report GA4 engagement or lead drops for the last 2 days.
- If the profile is read-only (no write tools), deliver steps 1–5 and tell the user that fixing needs
npx google-marketing-agent accounts set <alias> writes trueand an MCP client restart.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

