- GTM dataLayer events: add_to_cart (CartContext), begin_checkout,
form_submit_success on all forms and checkout
- UTM: persist landing params in sessionStorage (UtmCapture in layout);
fix field names — forms sent utm_source while /api/leads expects
utmSource, so UTM was silently dropped; LeadFormBlock also sent
'source' instead of required 'formSource' (leads were rejected)
- robots.ts + sitemap.ts (static pages, blog posts, locations)
- PageHero: alt text for hero background
- VideoSection: lazy-load video on scroll into view; hero reels
transcoded 57.5MB -> 9.6MB mp4 / 33.7MB -> 10.9MB webm
- Caddy: HSTS, nosniff, X-Frame-Options, Referrer-Policy headers
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>