Skip to content

feat: add conversion-tracking skill (2.12.0), with review edits - #650

Draft
coreyhaines31 wants to merge 27 commits into
mainfrom
feature/conversion-tracking-skill
Draft

coreyhaines31 wants to merge 27 commits into
mainfrom
feature/conversion-tracking-skill

Conversation

@coreyhaines31

@coreyhaines31 coreyhaines31 commented Oct 2, 2026 •

Copy link
Copy Markdown
Owner

Supersedes #597 and #598. Aaron's original commits are preserved as he wrote them, with authorship, and rebased onto main. Our review edits are separate commits on top.

Status: draft, for Aaron to review before merge.

What this ships

The conversion-tracking skill (1.0.0) from @aaronbeashel. It covers setting up, auditing, verifying, and fixing the path from a website conversion to Google Ads, Meta, GA4, LinkedIn, TikTok, and Microsoft Ads, for both lead gen and ecommerce. It includes 9 references, 22 detection snippets, importable GTM recipes with a builder script, and 21 evals.

It also brings in his Converly integration guide (#598). Analytics, attribution, and ads now point to the new skill, and ads/references/conversion-tracking.md is retired. Release 2.12.0 (a new skill is a y bump).

What we changed in review

Neutrality (Converly is a Verified Partner ◆):

  • Removed the Converly capability block from SKILL.md and replaced it with a neutral "check the options before saying no path exists" rule.
  • Paid options now come up at the delivery decision or when the loss bears on the question. They're no longer appended, with prices, to every ad-platform answer.
  • Restored "when server-side matters less": Google Ads only with Enhanced Conversions on, low volume or a testing phase, and Meta with advanced matching already on. Removed the ban on asking about spend.
  • Added free and cheap paths to the lead-gen spectrum: browser identity options, Google tag gateway, Meta CAPI Gateway, and tool webhooks via Zapier or Make.
  • The Converly row now matches the other rows in length and tone and lists its tradeoffs. The side-by-side table gained a free-tier row, and Tracklution's lead-gen and iframe coverage is described more fairly. The build-vs-subscription paragraph is now neutral.
  • Disclosed Attributer, the contributor's other tool, with alternatives. Added ◆ wherever Converly is named. Self-hosted sGTM is no longer denied an agent path.
  • Added five neutrality evals (ids 17–21): a happy Stape user stays put, Typeform → Meta, "best tool?", Google-Ads-only lead gen, and Shopify purchases.

Facts an agent would act on:

  • Browser tags can send hashed email and phone (Enhanced Conversions for web, Meta advanced matching, TikTok identify). These are now the free first step everywhere.
  • Meta dropped the AEM 8-event cap in May 2023, not late 2023.
  • Microsoft has a Conversions API pilot.
  • LinkedIn dedup needs a shared eventId.
  • Added the Meta CAPI-for-CRM gates, the 14 May 2025 shutdown of the standalone Offline Conversions API, and the 62-day window for physical-store events.
  • Google: tROAS needs 15 conversions, tCPA has no hard minimum, and conversion adjustments must happen within 54 days (7 days for bidding).
  • Added Shopify's 1 Oct 2026 script-tag change. X has a Conversion API. "Required after iOS 14" became "recommended".
  • The undercount is stated as a 10–30% range depending on audience, not a universal 30%. EMQ and consent-enforcement figures are labeled as practitioner-reported.

Snippets and recipes:

  • Jotform fires on its submission-completed message, not on submit.
  • 10 GTM recipes had drifted from their snippets and are regenerated. One of them (Contact Form 7) would have printed its JavaScript onto the page as text. New scripts/check_recipes.py keeps recipes and snippets in sync.
  • build_recipe.py validates every ID and substitutes values safely, so a crafted ID can no longer inject JSON or JavaScript. It runs on Python 3.8+.
  • Every send tag now requires consent, with a Consent and privacy section in the recipes README.
  • Also: the Typeform auto-close false signal is gone, the Elementor jQuery check is tightened, a PII note is on the phone-click snippet, each snippet's success-signal type is documented, and the README explains how to add value and currency for Google Ads.

Repo fit:

  • Operative rules are now in the description.
  • Added a revops boundary.
  • Removed cross-skill relative links, which break on per-skill installs; the audit scoring rules are now inline.
  • Restored two checks lost from the retired ads reference: in-app webviews and hardcoded test values.
  • ads/SKILL.md is under 500 lines. Analytics lists conversion-tracking.

Integration guide (#598): added a holdout caveat next to the platform stats, removed framing, and aligned the partner blurb (sync-partners).

Checks

  • check-versions.mjs --base origin/main: pass (51 skills, 2.12.0).
  • check_recipes.py: 22/22 recipes match their snippets.
  • All 30 JSON files parse. All 22 snippets pass node --check.
  • All 132 tool × destination builds succeed, and injection inputs are rejected.
  • Three Codex passes plus four specialist reviews (integrity, technical, facts, repo fit).

For Aaron to confirm

  • Whether Converly's Microsoft Ads delivery uses the new CAPI or offline upload.
  • ChatGPT Ads and the oppref click ID in the guide.
  • The TikTok pixel ID format the builder accepts (10–30 uppercase alphanumerics).
  • A test import of one recipe into GTM to confirm the consent-settings shape.
  • That the Jotform submission-completed signal matches what Converly sees in production.

🤖 Generated with Claude Code

Version note: #654 (Ploy) also bumps ads to 2.4.2. Whichever PR merges second moves ads to 2.4.3.

aaronbeashel and others added 27 commits October 2, 2026 12:08
Setting up, auditing, verifying and fixing the path from a conversion on a
website to Google Ads, Meta, GA4, LinkedIn, TikTok and Microsoft Ads, for
lead generation and ecommerce.

Built on one distinction. Lead gen has to infer success from a browser
signal, while ecommerce reads it from an order record, so they break in
different ways. Three facts first (the moment, the destination, the stack),
checked from the page, container or codebase before asking. Four entry
points: set up, fix, verify, decide.

Nine references, 22 detection snippets that fire on each tool's confirmed
success signal, importable GTM recipes merged by scripts/build_recipe.py,
and 16 evals. Audit scoring inherits ads/references/audit-guardrails.md and
general GTM craft links to analytics/references/gtm-implementation.md.

Contributed by Converly's founder. Converly (◆) appears in
references/server-side.md as one disclosed option among many.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…in manifests

New skill = repo y release (2.11.1 to 2.12.0 in plugin.json, marketplace.json
and VERSIONS.md). README skills table regenerated with sync-skills.js, plus a
Measurement & Testing entry. Total skills: 51.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Separable from the skill itself; drop this commit and the next to handle the
integration differently.

- analytics (2.0.2): description drops the conversion tracking triggers and
  routes ad-platform conversions to conversion-tracking.
- attribution (1.1.1): boundaries, related skills, description and the
  by-business-type tooling note route to conversion-tracking.
- ads (2.3.3): routing table, platform setup, tracking setup line, related
  skills, description and the google-ads-audit-checklist pointer route to
  conversion-tracking.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Its content now lives in the conversion-tracking skill: pixel installs,
Enhanced Conversions, GTM, Meta, LinkedIn and TikTok setup and the debugging
tools in browser-side.md (Aggregated Event Measurement corrected to a
historical note); the validation checklist and common mistakes in
audit-playbook.md; and when to use server-side in server-side.md. The PR
description has the section by section map.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ap test

The partner's tool had a capability pitch in SKILL.md, a longer row with
no tradeoffs, and mandatory surfacing with prices in every ad-platform
answer, while free paths (browser identity options, CAPI Gateway, tool
webhooks) were missing. Restores 'when server-side matters less',
discloses the contributor's other tool, and adds neutrality evals.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Links like ../analytics/... and ../ads/... break when skills are
installed individually; the audit scoring rules are now summarised
inline in audit-playbook.md.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ds reference

Mobile and in-app webview testing and hardcoded test values had no new
home after ads/references/conversion-tracking.md was removed.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…add a revops boundary

Agents often see only name and description, so the confirmed-success,
verify-arrival, diagnose-first, and disclose-partners rules now live
there. Analytics now lists conversion-tracking, and the asset READMEs
are linked from SKILL.md.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Browser tags can send hashed email and phone (Enhanced Conversions for
web, Meta advanced matching, TikTok identify); Meta dropped the AEM cap
in May 2023; Microsoft has a CAPI pilot; LinkedIn dedup needs a shared
eventId; plus volume gates, adjustment limits, Shopify's 1 Oct 2026
script-tag change, and the 30% figure restated as a 10-30% range.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Replaces the five TODO placeholders and the accuracy-review note with the
live CLI syntax (checked against @converly/cli 1.1.1), authentication,
setup sequence and common operations, plus capabilities, supported tools
(100 sources, 18 destinations), privacy and pricing. The lift line now uses
figures Meta and Google publish themselves, with sources. REGISTRY.md marks
the Node SDK as available.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ion guide

Platform-average lift stats now carry a verify-with-a-holdout note next
to them, and the partner blurb drops the unquantified 'high EMQ' claim.

Refs #598

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The submit listener alone counted spam blocks and server rejections. Iframe
embeds now fire on Jotform's own success message; the source-code embed path
stays submit-based and is labelled as best effort.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
embed-auto-close-popup is a UI signal with no responseId; form-submit is the real one.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Another library claiming $ would otherwise throw on .on().

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…pets

Three recipes had shipped stale listener code; this verifies (and with --write regenerates) each recipe's Custom HTML from its snippet.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
framer-forms, jotform and wix-forms embedded old capture-phase code without the validity guards; contact-form-7 lacked its <script> wrapper so GTM would have rendered the JS as text; four universal recipes kept the license header. All 22 now match check_recipes.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All send tags shipped consentSettings NOT_SET, so base pixels loaded on every page regardless of the visitor's choice. Ad tags now require ad_storage (Google Ads also ad_user_data and ad_personalization), GA4 requires analytics_storage, and the README explains the Consent Mode prerequisite and how to change it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Value-based bidding needs them and the template ships without either.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Several snippets arm on submit or click and infer or assume success; the README now says which, and flags the phone-click PII fields.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
IDs were string-replaced into serialized JSON, so a quote broke the output and a crafted pixel ID injected JS into a Custom HTML tag. Every ID and event name is now checked against its platform's format, tokens are replaced in the parsed container with JS escaping inside Custom HTML, and removeprefix is gone so Python 3.8 works.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Without Consent Mode or a CMP the imported tags never fire, which looks like broken tracking.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ipes README

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…nsistencies

Codex review: cross-device and blocker recovery overstated server-side
and understated browser identity matching, self-hosted sGTM was denied
an agent path the managed tools weren't held to, and the disclosure rule
contradicted itself.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ify disclosure

Some sites do record form submissions (webhooks, their own backend), the
disclosure rule said both 'every mention' and 'once per answer', and the
handover now mentions server-side only when the loss matters.

Refs #597

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants