Sets up GA4, Meta Pixel, and UTM tracking for funnel pages including custom events for CTA clicks, form submissions, scroll depth, and conversions.
npx claudepluginhub ominou5/funnel-architect-pluginThis skill uses the workspace's default tool permissions.
Track everything. If you can't measure it, you can't improve it.
Guides setup, improvement, and auditing of analytics tracking for actionable insights, with event naming conventions, tracking plans, and essential events for marketing sites.
Guides setup, improvement, and auditing of analytics tracking including GA4, GTM, event tracking, UTM parameters, and tracking plans.
Guides GA4 setup, event tracking, conversions, user ID, and CTA attribution for web and app analytics implementation and optimization.
Share bugs, ideas, or general feedback.
Track everything. If you can't measure it, you can't improve it.
<!-- Place in <head> of every page -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>
// Track CTA clicks
document.querySelectorAll('.cta-primary').forEach(btn => {
btn.addEventListener('click', () => {
gtag('event', 'cta_click', {
event_category: 'funnel',
event_label: btn.textContent.trim(),
page_title: document.title
});
});
});
// Track form submissions
document.querySelectorAll('form').forEach(form => {
form.addEventListener('submit', () => {
gtag('event', 'form_submit', {
event_category: 'funnel',
event_label: form.getAttribute('name') || 'unnamed',
page_title: document.title
});
});
});
// Track scroll depth
let scrollMarks = [25, 50, 75, 100];
window.addEventListener('scroll', () => {
const percent = Math.round((window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100);
scrollMarks = scrollMarks.filter(mark => {
if (percent >= mark) {
gtag('event', 'scroll_depth', { event_category: 'engagement', event_label: mark + '%' });
return false;
}
return true;
});
});
<!-- Place 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>
// Lead captured
fbq('track', 'Lead', { content_name: 'Free Guide Opt-In' });
// Registration
fbq('track', 'CompleteRegistration', { content_name: 'Webinar' });
// Purchase
fbq('track', 'Purchase', { value: 297, currency: 'USD' });
// Add to cart
fbq('track', 'AddToCart', { value: 47, currency: 'USD' });
?utm_source=facebook
&utm_medium=cpc
&utm_campaign=webinar-launch
&utm_content=headline-a
&utm_term=marketing-course
// Save UTMs to localStorage for attribution
const params = new URLSearchParams(window.location.search);
const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term'];
const utms = {};
utmKeys.forEach(key => {
const val = params.get(key);
if (val) utms[key] = val;
});
if (Object.keys(utms).length > 0) {
localStorage.setItem('funnel_utms', JSON.stringify(utms));
}
// Append UTMs to form submission as hidden fields
document.querySelectorAll('form').forEach(form => {
const stored = JSON.parse(localStorage.getItem('funnel_utms') || '{}');
Object.entries(stored).forEach(([key, val]) => {
const input = document.createElement('input');
input.type = 'hidden';
input.name = key;
input.value = val;
form.appendChild(input);
});
});