Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use when the user needs to set up or fix conversion tracking before running ads: Meta Pixel and Conversions API, Google Ads conversion tracking with Enhanced Conversions, GA4, TikTok Pixel and Events API, server-side GTM, consent management for GDPR and CCPA, UTM conventions, iOS ATT attribution windows, and the pre-launch verification checklist. Trigger on 'tracking setup', 'pixel setup', 'conversions API', 'CAPI', 'GA4 setup', 'server-side tracking', 'consent mode', 'UTM convention', or 'conve
.claude/skills/minhnv0807-53-tracking-setup-global/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | 9% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 20% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 28% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 113% | 0% |
| case-17 | ✗→✓ | ▲ Improved | 134% | 0% |
Ads without verified tracking is driving blind. Hard rule: do not launch ads until tracking verifies green. Every dollar spent before verification is unmeasurable. Set it up correctly the first time — changing events mid-campaign destroys historical comparability.
> Full per-platform install steps and the consent mode parameter reference: read references/platform-tracking-setup.md.
Ask up to 4 questions:
| Layer | Purpose | Minimum | |-------|---------|---------| | Client-side pixel/tag | Fast setup, on-page events | Meta Pixel, Google tag, TikTok Pixel | | Server-side API | Recovers events lost to blockers and ITP | Meta Conversions API, TikTok Events API, Google Enhanced Conversions | | Analytics | Cross-channel truth, funnel analysis | GA4 with key events configured | | Consent layer | Legal gate in front of everything above | CMP plus Google consent mode v2 | | CRM / offline | Connects leads to actual revenue | CRM with source fields, offline conversion import |
Server-side GTM is the recommended container for anything beyond a simple store: it centralizes event forwarding, improves data quality, and keeps first-party cookie lifetimes usable under ITP.
This is a first-class requirement, not an optional extra.
EU / UK — GDPR and ePrivacy:
ad_storage, analytics_storage, ad_user_data, ad_personalization. Default them to denied for EEA/UK before the banner is answered, then update on consent.California — CCPA/CPRA (and comparable US state laws):
Email and SMS: CAN-SPAM in the US and GDPR in the EU require documented opt-in for marketing sends and a working unsubscribe. Any list uploaded as a Custom Audience or Customer Match list must have that consent on record — see 14-email-marketing-global.
Record the decision in the output file: which CMP, which regions gated, who verified.
Full step-by-step checklists live in references/platform-tracking-setup.md. Summary of what must exist:
| Platform | Client-side | Server-side | Verification tool | |----------|-------------|-------------|-------------------| | Meta | Pixel with standard events (PageView, ViewContent, AddToCart, Lead, Purchase) | Conversions API with event_id deduplication, Event Match Quality >= 6.0 | Meta Pixel Helper, Test Events | | Google Ads | Google tag / GTM conversion actions | Enhanced Conversions (hashed email/phone), consent mode v2 | Tag Assistant, conversion diagnostics | | GA4 | GA4 tag, key events marked as conversions | Measurement Protocol or server-side GTM | GA4 DebugView, Realtime | | TikTok | TikTok Pixel (ViewContent, AddToCart, SubmitForm, CompletePayment) | Events API with deduplication | TikTok Pixel Helper, Events diagnostics | | LinkedIn | Insight Tag with conversion rules | Conversions API for CRM-side events | LinkedIn Insight Tag Helper |
Only one primary conversion action per objective should be enabled for bidding. Extra enabled conversions inflate counts and confuse smart bidding.
Since iOS 14.5, a large share of iOS users opt out of app tracking, so platform-reported conversions are partly modeled rather than observed.
https://domain.com/lp?utm_source=[source]&utm_medium=[medium]&utm_campaign=[campaign]&utm_content=[ad_name]| Parameter | Convention | Example | |-----------|-----------|---------| | utm_source | meta / google / tiktok / linkedin / klaviyo | meta | | utm_medium | paid_social / paid_search / display / email / organic | paid_social | | utm_campaign | [product]_[audience]_[market]_[MMYY] | course-a_cold_us_0726 | | utm_content | [creative-type]_[hook-type]_[version] — matches the ad name | vid_pain_v1 |
Lowercase, no spaces, no special characters. utm_content must equal the ad name defined in 52-account-structure-global so ads manager and GA4 reconcile in both directions. Add utm_term only for search keywords.
| GA4 event | Trigger | Platform equivalent | |-----------|---------|---------------------| | page_view | All pages | PageView (Meta), ViewContent (TikTok) | | view_item | Product or offer page | ViewContent (Meta) | | add_to_cart | Cart add | AddToCart (Meta/TikTok) | | begin_checkout | Checkout started | InitiateCheckout (Meta) | | generate_lead | Form submit or qualified message | Lead (Meta), SubmitForm (TikTok), Conversion (Google) | | purchase | Payment confirmed, with value and currency | Purchase (Meta/TikTok/Google) |
Each action fires exactly one event. Mark the event that matches the ads objective as a key event in GA4. Always send value and currency on purchase — without them ROAS cannot be computed and multi-market revenue cannot be normalized.
Required whenever the sale closes off-site (B2B, high-ticket, coaching, agency, phone or DM sales):
Uploaded CRM data must be hashed and covered by consent.
All must pass. One missing item means do not launch:
Daily (2 minutes): events flowing in the last 24 hours on every platform; Google Ads conversions recording; GA4 showing paid sessions.
Weekly: server-side match rate above 70%; no duplicate events; lead counts across ads manager, GA4, and CRM within 20% of each other; every live link carries a correct UTM; consent banner still firing correctly after any site release.
| Problem | Common cause | Fix | |---------|--------------|-----| | Pixel does not fire | Tag missing on the page or blocked by consent gate | Check GTM preview and the consent state; confirm the tag is allowed after consent | | Duplicate events | GTM and hardcoded tag both installed | Remove one; verify event_id deduplication | | Low match rate / low EMQ | No hashed email or phone sent server-side | Add customer parameters to the server payload | | Conversion not recorded | Wrong event name or wrong trigger page | Check spelling and that the trigger is the confirmation page | | GA4 far below ads manager | Different attribution windows plus modeled conversions | Compare on the same window; treat one source as decision-grade | | Remarketing audiences shrinking in the EU | Consent mode v2 missing or misconfigured | Implement all four consent signals and a certified CMP | | Leads arrive with no source | No CRM source capture | Add hidden UTM/click-ID fields to every form |
File name: tracking-setup-[product]-[YYYYMMDD].md
markdown# Tracking Setup — [Product/Campaign] Platforms: [list] · Site platform: [x] · Markets: [x] · Objective: [Lead/Purchase] ## 1. Measurement architecture [client, server, analytics, consent, CRM] ## 2. Consent plan [CMP, regions gated, consent mode v2, LDU, log owner] ## 3. Platform setup status [table with status per item] ## 4. Attribution settings [window per platform, AEM priority list] ## 5. UTM convention [parameters and real project examples] ## 6. Event mapping [GA4 to platform events] ## 7. CRM / offline conversions [fields captured, import cadence] ## 8. Pre-launch verification [green checklist, verified by, date] ## 9. Ongoing check schedule [who, when, alert thresholds]
52-account-structure-global: build campaigns only after tracking is green; utm_content must match ad names.54-media-plan-global: the objective in the plan determines which events must be tracked.21-ads-audit-global: periodic tracking audit (match rate, duplicates, EMQ).12-landing-page-brief-global: the landing page must expose the events and form fields this setup needs.13-data-analysis-global: reads the clean data this system produces.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→pass | 50,126 | 37,692 | -25% | 1 | 1 | 0% | 8,306 | 9,092 | +9% | 0 | 0 | — |
case-02 | fail→pass | 48,856 | 44,039 | -10% | 1 | 1 | 0% | 8,313 | 9,970 | +20% | 0 | 0 | — |
case-03 | fail→pass | 47,094 | 44,400 | -6% | 1 | 1 | 0% | 8,320 | 10,686 | +28% | 0 | 0 | — |
case-04 | pass→fail | 25,231 | 35,144 | +39% | 1 | 1 | 0% | 5,121 | 10,012 | +96% | 0 | 0 | — |
case-05 | pass→fail | 12,809 | 16,777 | +31% | 1 | 1 | 0% | 2,435 | 6,281 | +158% | 0 | 0 | — |
case-06 | pass→fail | 19,507 | 34,352 | +76% | 1 | 1 | 0% | 3,266 | 9,088 | +178% | 0 | 0 | — |
case-07 | pass→pass | 13,108 | 8,260 | -37% | 1 | 1 | 0% | 2,540 | 4,823 | +90% | 0 | 0 | — |
case-08 | pass→pass | 16,271 | 17,823 | +10% | 1 | 1 | 0% | 2,978 | 6,332 | +113% | 0 | 0 | — |
case-09 | pass→pass | 19,907 | 22,932 | +15% | 1 | 1 | 0% | 3,506 | 7,020 | +100% | 0 | 0 | — |
case-10 | pass→pass | 20,299 | 23,293 | +15% | 1 | 1 | 0% | 3,598 | 7,456 | +107% | 0 | 0 | — |
case-11 | fail→fail | 18,002 | 21,693 | +21% | 1 | 1 | 0% | 2,961 | 6,875 | +132% | 0 | 0 | — |
case-12 | fail→fail | 16,758 | 19,855 | +18% | 1 | 1 | 0% | 3,213 | 6,759 | +110% | 0 | 0 | — |
case-13 | fail→pass | 15,123 | 12,133 | -20% | 1 | 1 | 0% | 2,427 | 5,160 | +113% | 0 | 0 | — |
case-14 | pass→pass | 10,749 | 10,998 | +2% | 1 | 1 | 0% | 2,066 | 5,082 | +146% | 0 | 0 | — |
case-15 | pass→pass | 16,353 | 14,072 | -14% | 1 | 1 | 0% | 2,698 | 5,609 | +108% | 0 | 0 | — |
case-16 | pass→pass | 12,665 | 10,378 | -18% | 1 | 1 | 0% | 2,037 | 4,811 | +136% | 0 | 0 | — |
case-17 | fail→pass | 15,444 | 17,877 | +16% | 1 | 1 | 0% | 2,674 | 6,261 | +134% | 0 | 0 | — |
case-18 | fail→pass | 15,201 | 13,874 | -9% | 1 | 1 | 0% | 3,054 | 5,760 | +89% | 0 | 0 | — |
case-19 | fail→pass | 6,227 | 3,093 | -50% | 1 | 1 | 0% | 1,157 | 3,771 | +226% | 0 | 0 | — |
case-20 | pass→pass | 14,101 | 13,210 | -6% | 1 | 1 | 0% | 2,401 | 5,316 | +121% | 0 | 0 | — |
case-21 | pass→pass | 12,413 | 11,995 | -3% | 1 | 1 | 0% | 2,145 | 5,286 | +146% | 0 | 0 | — |
case-22 | fail→pass | 15,550 | 10,885 | -30% | 1 | 1 | 0% | 2,558 | 4,984 | +95% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +23 percentage points is the difference between those two pass rates over the 22 comparable cases. 3 cases got worse with the skill loaded, and they are included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.