$npx -y skills add ominou5/funnel-architect-plugin --skill analytics-setupSets up analytics and tracking for funnel pages. Covers GA4, Meta Pixel, Google Tag Manager, conversion tracking, and UTM parameter handling.
| 1 | # Analytics Setup |
| 2 | |
| 3 | Track everything. If you can't measure it, you can't improve it. |
| 4 | |
| 5 | ## GA4 (Google Analytics 4) |
| 6 | |
| 7 | ### Basic Installation |
| 8 | ```html |
| 9 | <!-- Place in <head> of every page --> |
| 10 | <script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script> |
| 11 | <script> |
| 12 | window.dataLayer = window.dataLayer || []; |
| 13 | function gtag(){dataLayer.push(arguments);} |
| 14 | gtag('js', new Date()); |
| 15 | gtag('config', 'G-XXXXXXXXXX'); |
| 16 | </script> |
| 17 | ``` |
| 18 | |
| 19 | ### Custom Events for Funnels |
| 20 | ```javascript |
| 21 | // Track CTA clicks |
| 22 | document.querySelectorAll('.cta-primary').forEach(btn => { |
| 23 | btn.addEventListener('click', () => { |
| 24 | gtag('event', 'cta_click', { |
| 25 | event_category: 'funnel', |
| 26 | event_label: btn.textContent.trim(), |
| 27 | page_title: document.title |
| 28 | }); |
| 29 | }); |
| 30 | }); |
| 31 | |
| 32 | // Track form submissions |
| 33 | document.querySelectorAll('form').forEach(form => { |
| 34 | form.addEventListener('submit', () => { |
| 35 | gtag('event', 'form_submit', { |
| 36 | event_category: 'funnel', |
| 37 | event_label: form.getAttribute('name') || 'unnamed', |
| 38 | page_title: document.title |
| 39 | }); |
| 40 | }); |
| 41 | }); |
| 42 | |
| 43 | // Track scroll depth |
| 44 | let scrollMarks = [25, 50, 75, 100]; |
| 45 | window.addEventListener('scroll', () => { |
| 46 | const percent = Math.round((window.scrollY / (document.body.scrollHeight - window.innerHeight)) * 100); |
| 47 | scrollMarks = scrollMarks.filter(mark => { |
| 48 | if (percent >= mark) { |
| 49 | gtag('event', 'scroll_depth', { event_category: 'engagement', event_label: mark + '%' }); |
| 50 | return false; |
| 51 | } |
| 52 | return true; |
| 53 | }); |
| 54 | }); |
| 55 | ``` |
| 56 | |
| 57 | ## Meta Pixel (Facebook) |
| 58 | |
| 59 | ```html |
| 60 | <!-- Place in <head> --> |
| 61 | <script> |
| 62 | !function(f,b,e,v,n,t,s) |
| 63 | {if(f.fbq)return;n=f.fbq=function(){n.callMethod? |
| 64 | n.callMethod.apply(n,arguments):n.queue.push(arguments)}; |
| 65 | if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0'; |
| 66 | n.queue=[];t=b.createElement(e);t.async=!0; |
| 67 | t.src=v;s=b.getElementsByTagName(e)[0]; |
| 68 | s.parentNode.insertBefore(t,s)}(window, document,'script', |
| 69 | 'https://connect.facebook.net/en_US/fbevents.js'); |
| 70 | fbq('init', 'YOUR_PIXEL_ID'); |
| 71 | fbq('track', 'PageView'); |
| 72 | </script> |
| 73 | ``` |
| 74 | |
| 75 | ### Key Events to Track |
| 76 | ```javascript |
| 77 | // Lead captured |
| 78 | fbq('track', 'Lead', { content_name: 'Free Guide Opt-In' }); |
| 79 | |
| 80 | // Registration |
| 81 | fbq('track', 'CompleteRegistration', { content_name: 'Webinar' }); |
| 82 | |
| 83 | // Purchase |
| 84 | fbq('track', 'Purchase', { value: 297, currency: 'USD' }); |
| 85 | |
| 86 | // Add to cart |
| 87 | fbq('track', 'AddToCart', { value: 47, currency: 'USD' }); |
| 88 | ``` |
| 89 | |
| 90 | ## UTM Parameter Handling |
| 91 | |
| 92 | ### Standard UTM Parameters |
| 93 | ``` |
| 94 | ?utm_source=facebook |
| 95 | &utm_medium=cpc |
| 96 | &utm_campaign=webinar-launch |
| 97 | &utm_content=headline-a |
| 98 | &utm_term=marketing-course |
| 99 | ``` |
| 100 | |
| 101 | ### Capture and Store UTMs |
| 102 | ```javascript |
| 103 | // Save UTMs to localStorage for attribution |
| 104 | const params = new URLSearchParams(window.location.search); |
| 105 | const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term']; |
| 106 | const utms = {}; |
| 107 | utmKeys.forEach(key => { |
| 108 | const val = params.get(key); |
| 109 | if (val) utms[key] = val; |
| 110 | }); |
| 111 | if (Object.keys(utms).length > 0) { |
| 112 | localStorage.setItem('funnel_utms', JSON.stringify(utms)); |
| 113 | } |
| 114 | |
| 115 | // Append UTMs to form submission as hidden fields |
| 116 | document.querySelectorAll('form').forEach(form => { |
| 117 | const stored = JSON.parse(localStorage.getItem('funnel_utms') || '{}'); |
| 118 | Object.entries(stored).forEach(([key, val]) => { |
| 119 | const input = document.createElement('input'); |
| 120 | input.type = 'hidden'; |
| 121 | input.name = key; |
| 122 | input.value = val; |
| 123 | form.appendChild(input); |
| 124 | }); |
| 125 | }); |
| 126 | ``` |
| 127 | |
| 128 | ## Tracking Checklist |
| 129 | - [ ] GA4 installed on all pages |
| 130 | - [ ] Meta Pixel installed (if running Facebook ads) |
| 131 | - [ ] Custom events for CTA clicks, form submissions, scroll depth |
| 132 | - [ ] UTM parameters captured and stored |
| 133 | - [ ] Conversion goals set up in GA4 |
| 134 | - [ ] Form submissions tracked as conversions |
| 135 | - [ ] Thank-you page tracked as destination goal |