* feat: v2.0 skill renames and CRO consolidation BREAKING CHANGE: Users must reinstall skills after this update. ## Skill Renames (16) - ab-test-setup → ab-testing - analytics-tracking → analytics - aso-audit → aso - competitor-alternatives → competitors - email-sequence → emails - free-tool-strategy → free-tools - launch-strategy → launch - onboarding-cro → onboarding - paywall-upgrade-cro → paywalls - popup-cro → popups - pricing-strategy → pricing - product-marketing-context → product-marketing - referral-program → referrals - schema-markup → schema - signup-flow-cro → signup - social-content → social ## Consolidations (1) - page-cro + form-cro → cro (form content in references/form.md) ## Why 2.0? - Shorter, cleaner skill names - Consistent naming (no -strategy, -setup, -cro suffixes) - All cross-references updated across 100+ files Total skills: 40 Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com> * fix(v2.0): update evals for renamed skills, fix validate script, clear warnings - Update 32 evals.json files to reference new skill names (page-cro → cro, product-marketing-context → product-marketing, etc.) — these were missed in the initial v2.0 rename pass since only SKILL.md and marketplace.json were updated. - Fix validate-skills.sh: replace GNU-only `head -n -1` with portable awk so frontmatter extraction works on macOS. - Move Copy Editing Checklist (56 lines) to references/checklist.md to bring copy-editing SKILL.md under the 500-line limit (508 → 457). - Add "see X" pointers to marketing-psychology description for skill discovery (cro, pricing, copywriting). - Update skill-request.yml issue template placeholder (page-cro → cro). All 40 skills now pass validation with zero warnings. * fix(v2.0): add evals for 8 missing skills, strip stale frontmatter from cro/form.md Adds 48 new eval cases (6 per skill) for skills that previously had no evals: aso, co-marketing, community-marketing, competitor-profiling, directory-submissions, image, lead-magnets, video. All 40 skills now have eval coverage (251 total cases). Strips leftover frontmatter from skills/cro/references/form.md — it was inherited from the old form-cro SKILL.md before consolidation. Reference files don't need frontmatter. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(v2.0): rename paid-ads → ads One more v2.0 simplification — drops the redundant 'paid-' qualifier. Updates the skill directory, SKILL.md frontmatter, evals.json, README skill table, the v2.0 rename table in VERSIONS.md (now 17 renames), and all cross-references in related skills (ad-creative, aso, competitor-profiling, customer-research, lead-magnets, marketing-ideas) plus the tools/integrations guides. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(v2.0): bump SKILL.md frontmatter version to 2.0.0 for all 40 skills VERSIONS.md was already updated to 2.0.0 but the metadata.version field inside each SKILL.md was still on 1.x. That mismatch would have caused the update-check flow to perpetually report 'update available' since it compares VERSIONS.md against local SKILL.md metadata versions. Caught by codex review (P1). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(v2.0): add legacy product-marketing-context.md filename fallback Before this fix, users upgrading from v1.x who had a `product-marketing-context.md` file would lose automatic context loading — every skill only checked the new `product-marketing.md` filename. Now all 40 skills also accept the legacy filename (in either `.agents/` or `.claude/`), and the README migration command covers both legacy and current filenames. Caught by codex review (P1 + P2). Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(v2.0): re-sort README skills table alphabetically, fix ads box width The skills table had a few entries out of alphabetical order from the renames (co-marketing was after cold-email, ads was at the renamed position). Re-sorted alphabetically per sync-skills.js. Also padded the 'ads' cell in the ASCII flow diagram to keep the box width consistent. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> * fix(v2.0): document folder cleanup on upgrade, stop sync-skills from re-adding skills array README upgrade guide now includes: - A clear cleanup step for stale v1.x skill folders (renamed + consolidated) so users don't end up with both old and new folders side-by-side after upgrading - The full v1 to v2 rename map for reference - Existing product-marketing-context.md migration steps (preserved) sync-skills.js no longer (re-)introduces a `skills` array on marketplace.json -- Claude Code's plugin schema discovers skills via the `skills/` directory, and the explicit array was failing validation. The script now refreshes the description count and strips the stale array if present. Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 4.5 <noreply@anthropic.com>
11 KiB
Conversion Tracking Setup
How to set up conversion tracking pixels across ad platforms. This guide covers installation, event configuration, and validation — everything a marketer needs to ensure ad spend is properly attributed.
Why This Matters
Without conversion tracking:
- Ad platforms can't optimize for your actual goals
- You're flying blind on ROAS and CPA
- Retargeting audiences can't be built
- You'll waste budget on impressions that don't convert
Get tracking right before spending a dollar on ads.
Platform Pixels Overview
| Platform | Pixel/Tag Name | Events API | Key Events |
|---|---|---|---|
| Google Ads | Google tag (gtag.js) | Enhanced Conversions | purchase, sign_up, generate_lead |
| Meta | Meta Pixel + CAPI | Conversions API | Purchase, Lead, ViewContent, AddToCart |
| Insight Tag | Conversions API | conversion (URL or event-based) | |
| TikTok | TikTok Pixel | Events API | Purchase, ViewContent, AddToCart, CompleteRegistration |
| Twitter/X | Twitter Pixel | - | Purchase, SignUp, Download |
Google Ads
Install the Google tag
Add to every page, in <head>:
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'AW-XXXXXXXXX');
</script>
Replace AW-XXXXXXXXX with your Conversion ID from Google Ads > Tools > Conversions.
Set up conversion actions
In Google Ads > Goals > Conversions > New conversion action:
| Conversion | Category | Value | Count |
|---|---|---|---|
| Purchase | Purchase | Dynamic (order value) | Every |
| Sign up / Lead | Sign-up | Fixed ($X estimated value) | One |
| Demo request | Lead | Fixed ($X estimated value) | One |
| Free trial start | Sign-up | Fixed ($X estimated value) | One |
Fire conversion events
// Purchase
gtag('event', 'conversion', {
'send_to': 'AW-XXXXXXXXX/CONVERSION_LABEL',
'value': 99.00,
'currency': 'USD',
'transaction_id': 'ORDER-123'
});
// Lead / Sign up
gtag('event', 'conversion', {
'send_to': 'AW-XXXXXXXXX/CONVERSION_LABEL',
'value': 50.00,
'currency': 'USD'
});
Enhanced Conversions
Sends hashed first-party data (email, phone) to improve attribution after cookie restrictions. Enable in Google Ads > Goals > Settings > Enhanced conversions.
gtag('set', 'user_data', {
'email': 'user@example.com', // auto-hashed by gtag
'phone_number': '+11234567890'
});
Google Tag Manager alternative
If using GTM instead of inline gtag.js:
- Install GTM container on all pages
- Create Google Ads conversion tags in GTM
- Set triggers for conversion events (form submissions, purchases)
- Use the Data Layer to pass dynamic values (order amount, transaction ID)
- Test with GTM Preview mode before publishing
Meta (Facebook/Instagram)
Install the Meta Pixel
Add to every page, in <head>:
<script>
!function(f,b,e,v,n,t,s)
{if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');
fbq('init', 'YOUR_PIXEL_ID');
fbq('track', 'PageView');
</script>
Replace YOUR_PIXEL_ID from Meta Events Manager.
Standard events
// View a product or key page
fbq('track', 'ViewContent', {
content_name: 'Pro Plan',
content_category: 'Pricing',
value: 29.00,
currency: 'USD'
});
// Lead capture (form submit, demo request)
fbq('track', 'Lead', {
content_name: 'Demo Request',
value: 50.00,
currency: 'USD'
});
// Purchase
fbq('track', 'Purchase', {
value: 99.00,
currency: 'USD',
content_type: 'product',
contents: [{ id: 'pro-plan', quantity: 1 }]
});
// Add to cart (e-commerce)
fbq('track', 'AddToCart', {
content_ids: ['SKU-123'],
content_type: 'product',
value: 49.00,
currency: 'USD'
});
Conversions API (CAPI)
Server-side tracking that works alongside the pixel. Required for accurate tracking after iOS 14+ and cookie restrictions.
Set up via:
- Direct integration — send events from your server to Meta's API
- Partner integrations — Shopify, WooCommerce, Segment, etc. have built-in CAPI support
- Conversions API Gateway — Meta's managed solution via AWS
Key: send the same events from both pixel (browser) AND CAPI (server), with a shared event_id for deduplication.
Aggregated Event Measurement
Required for iOS 14+ tracking. In Events Manager > Aggregated Event Measurement:
- Verify your domain
- Configure and prioritize your top 8 events in order of business importance
- Purchase should typically be #1, Lead #2
Install the Insight Tag
Add to every page, before </body>:
<script type="text/javascript">
_linkedin_partner_id = "YOUR_PARTNER_ID";
window._linkedin_data_partner_ids = window._linkedin_data_partner_ids || [];
window._linkedin_data_partner_ids.push(_linkedin_partner_id);
(function(l) {
if (!l){window.lintrk = function(a,b){window.lintrk.q.push([a,b])};
window.lintrk.q=[]}
var s = document.getElementsByTagName("script")[0];
var b = document.createElement("script");
b.type = "text/javascript";b.async = true;
b.src = "https://snap.licdn.com/li.lms-analytics/insight.min.js";
s.parentNode.insertBefore(b, s);})(window.lintrk);
</script>
Conversion tracking
LinkedIn supports two methods:
URL-based: Fires when someone visits a specific URL (e.g., /thank-you).
Set up in Campaign Manager > Analyze > Conversion Tracking > Create Conversion.
Event-based: Fire manually on specific actions:
window.lintrk('track', { conversion_id: YOUR_CONVERSION_ID });
LinkedIn CAPI
For server-side tracking, LinkedIn offers a Conversions API. Set up via partner integrations (Segment, Tealium) or direct API calls. Deduplicates with the Insight Tag automatically when configured correctly.
TikTok
Install the TikTok Pixel
Add to every page, in <head>:
<script>
!function (w, d, t) {
w.TiktokAnalyticsObject=t;var ttq=w[t]=w[t]||[];
ttq.methods=["page","track","identify","instances","debug","on","off",
"once","ready","alias","group","enableCookie","disableCookie","holdConsent",
"revokeConsent","grantConsent"],ttq.setAndDefer=function(t,e)
{t[e]=function(){t.push([e].concat(Array.prototype.slice.call(arguments,0)))}};
for(var i=0;i<ttq.methods.length;i++)ttq.setAndDefer(ttq,ttq.methods[i]);
ttq.instance=function(t){for(var e=ttq._i[t]||[],n=0;
n<ttq.methods.length;n++)ttq.setAndDefer(e,ttq.methods[n]);return e};
ttq.load=function(e,n){var r="https://analytics.tiktok.com/i18n/pixel/events.js",
o=n&&n.partner;ttq._i=ttq._i||{},ttq._i[e]=[],ttq._i[e]._u=r,
ttq._t=ttq._t||{},ttq._t[e]=+new Date,ttq._o=ttq._o||{},
ttq._o[e]=n||{};var s=document.createElement("script");
s.type="text/javascript",s.async=!0,s.src=r+"?sdkid="+e+"&lib="+t;
var a=document.getElementsByTagName("script")[0];
a.parentNode.insertBefore(s,a)};
ttq.load('YOUR_PIXEL_ID');
ttq.page();
}(window, document, 'ttq');
</script>
Standard events
// View content
ttq.track('ViewContent', {
content_id: 'pro-plan',
content_type: 'product',
content_name: 'Pro Plan',
value: 29.00,
currency: 'USD'
});
// Complete registration / sign up
ttq.track('CompleteRegistration', {
content_name: 'Free Trial'
});
// Purchase
ttq.track('Purchase', {
content_id: 'pro-plan',
content_type: 'product',
value: 99.00,
currency: 'USD',
quantity: 1
});
// Add to cart
ttq.track('AddToCart', {
content_id: 'SKU-123',
content_type: 'product',
value: 49.00,
currency: 'USD'
});
Events API (server-side)
TikTok's Events API works like Meta's CAPI — send the same events from your server for better attribution. Use event_id for deduplication with browser pixel events.
Advanced Matching
Pass hashed user data for better attribution:
ttq.identify({
email: 'user@example.com', // auto-hashed
phone_number: '+11234567890'
});
Validation Checklist
After installing any pixel, verify before going live:
Browser-side checks
- Pixel fires on every page (check via browser extension)
- Conversion events fire at the right moment (after confirmed action, not on button click)
- Event parameters contain correct values (currency, amount, content IDs)
- No duplicate events firing on the same action
- Events fire on both desktop and mobile
Platform-side checks
- Events appear in the platform's event manager/diagnostics
- Test conversions show correct values
- Event match quality is acceptable (Meta: score > 6)
- Server-side events are deduplicating with browser events (not double-counting)
Debugging tools
| Platform | Tool |
|---|---|
| Google Tag Assistant, Chrome DevTools Network tab | |
| Meta | Meta Pixel Helper (Chrome extension), Events Manager Test Events |
| Insight Tag Validator in Campaign Manager | |
| TikTok | TikTok Pixel Helper (Chrome extension), Events Manager |
| All | GTM Preview Mode (if using Google Tag Manager) |
Common Mistakes
- Firing purchase events on button click instead of confirmed payment — always fire on the success/thank-you page or after server confirmation
- Missing deduplication between pixel and server events — without a shared
event_id, you'll double-count conversions - Not testing on mobile — many pixels break on mobile browsers or in-app webviews
- Hardcoded test values — remove test transaction amounts before going live
- Forgetting to exclude internal traffic — your team's visits inflate conversion data
- Installing pixels without consent management — GDPR/CCPA require user consent before firing tracking pixels in applicable regions
- Pixel installed but no conversion actions created — the pixel collects data, but the ad platform won't optimize without defined conversion actions
When to Use Server-Side Tracking
Browser-only tracking is increasingly unreliable due to:
- iOS 14+ App Tracking Transparency
- Third-party cookie deprecation
- Ad blockers (30%+ of tech audiences)
Use server-side (CAPI/Events API) when:
- Running Meta or TikTok ads (strongly recommended)
- Your audience is tech-savvy (higher ad blocker usage)
- You need accurate purchase/revenue attribution
- You're spending >$5K/month on any platform
Server-side is optional when:
- Running Google Ads only (Enhanced Conversions covers most gaps)
- Low ad spend / testing phase
- B2B with LinkedIn only (Insight Tag is still reliable)