Pioneer Golf
Launch prep, Core Web Vitals, technical SEO, and AI search visibility for a golf travel operator on Webflow.

The Challenge
Pioneer Golf is a custom golf tour operator, Scottish-owned and based in Austin, Texas, founded in 1971. The company plans bespoke group golf trips with guaranteed tee times, accommodation, and transport to Scotland, Ireland, England, Iceland, and eight other destinations, primarily for American and Canadian travelers.
The team was preparing to switch domains from their old site to a new Webflow build and brought me in for a pre-launch technical audit, working alongside their in-house developer. The engagement started in late November 2025, ran through launch in December, and continues as an ongoing partnership covering UI polish and a Core Web Vitals and payment-flow audit in early 2026.
The audit found a fast-looking site carrying heavy technical debt:
- Homepage Lighthouse at 40 on mobile (97 desktop), with a network payload of roughly 13.2 MiB; the Destinations page weighed about 12.5 MiB, including a hidden 5.5 MiB background video that still downloaded because it was hidden with CSS rather than removed from the DOM.
- A Lottie map animation injected two to three times per page through a mix of site settings, page head code, and embed blocks, one of them throwing a SyntaxError from broken nested script tags.
- Roughly 1.2 MiB of webfonts the design barely used, inherited from the template, plus six overlapping font loaders running side by side.
- 38 files served as SVG that were actually heavy raster exports, and dozens of images served far larger than their rendered size, loading eagerly even offscreen.
- GSAP enabled globally with every feature on, and three slider libraries loading together on the About page.
- Webflow launch settings misconfigured: crawler access off, staging-domain indexing on, sitemap off, no global canonical, no JSON-LD anywhere, no llms.txt.
- Crawl-level SEO debt: the About page alone carried 307 H1s, and CMS pagination was generating 82 duplicate page titles via query-string URLs.
- After the domain switch: 11 legacy URLs returning 404, 8 canonical conflicts, and 39 plain-HTTP URLs traced to rules at the DNS layer rather than Webflow.
What I Shipped
Page Weight and Lottie Optimization
Consolidated the map animation into a single on-demand load path: the JSON preloads via a fetch preload, and initialization is gated behind an IntersectionObserver so the library and animation only load as the section approaches the viewport. Compressed the animation files; the Testimonials ball animation dropped from 2,750 KiB to 129 KiB. Stopped the hidden Destinations background video from downloading by using Webflow's Visibility setting, which removes the element from the DOM, instead of CSS display none, cutting that page's payload from 12,458 KiB to 5,155 KiB.
Image and SVG Audit
Converted the 38 raster-as-SVG files to webp at roughly 95 percent smaller per file, ran an AVIF and webp pass across the hero slider, reviews, courses, team, and footer with correct rendered-size targets, and added lazy loading to background images.
Font and Icon Cleanup
Replaced the icon webfonts with inline SVG for every icon actually in use, removed the unused template fonts and a duplicate import, and consolidated six overlapping font loaders down to Webflow's native font loading. None of the removed fonts load on the live site today.
Script and Global Code Cleanup
Enabled JS minification on publish, disabled the unused GSAP globals after confirming no animations depended on them, removed the duplicate slider libraries, and stripped redundant scripts page by page. Flagged the tag setup for consolidation into scoped tags inside a single GTM container.
Technical SEO Launch Hygiene
Turned on search-engine and AI crawler access, disabled indexing on the staging domain, enabled the auto-generated sitemap, and set the global canonical. Filled in titles and descriptions across all pages, and resolved the 82 duplicate page titles with a short-name CMS field strategy plus nofollow on the paginated query-string URLs. Added llms.txt, which Webflow serves natively.
Redirect Remediation
Mapped the 11 post-migration 404s to their new slugs via Webflow 301s, and added a redirect for an old trip-planner URL that 15 blog articles still pointed at. Traced the 39 plain-HTTP URLs to DNS-layer rules outside Webflow and documented the inspection path for the client.
Heading Hierarchy
Rebuilt the About page from 307 H1s to a single H1, 6 H2s, and 18 H3s. Collapsed duplicate mobile H1s on destination sub-pages, demoted the homepage's second H1 to an H2, and promoted FAQ questions to H3 to prepare for FAQPage schema.
Structured Data
Built a sitewide JSON-LD graph (Organization, WebSite, WebPage, BreadcrumbList) in the global head, with FAQPage markup on the homepage and per-page schema on the Course template wired to CMS fields, validated through Google's Rich Results Test.
JotForm LCP-First Loading
Replaced the synchronous JotForm embed with a PerformanceObserver that injects the form script only after the page's LCP event fires, with a fallback for browsers without support, and CSS containment on the form container so the tall iframe stops dominating mobile LCP measurements. Live today on six landing pages, including the trip planner.
Payment Flow Stabilization
Worked through the candidate causes of an intermittent checkout error on the JotForm and Authorize.Net form, using the standalone form URL as a control; checkout no longer throws the error.
Changelog and Score Tracking
Stood up a Notion changelog and a per-page PageSpeed score tracker so every change carries a before, after, reason, and date, coordinated with the in-house developer to avoid Designer conflicts.
AI Search Visibility Program
Stood up monthly AI Overview citation tracking across 19 target queries, with per-domain citation league tables as the outreach target list. The tracking exists because these citations rotate: between two pulls eleven days apart, 6 of the 19 queries flipped their AI Overview on or off, and the site's own citation for its biggest commercial query ("scotland golf trips", 1,600 US searches per month) appeared in July 2026 and was gone on the next check. ChatGPT cited the site's Old Course page for the client's core product query, observed May 2026. The backlink and authority gap was quantified against 6 competitors, with a 224-domain link-prospect list extracted, and llms.txt is live at the root.
Analytics and Attribution Diagnosis
Root-caused why the client could not see which page drives enquiries: every conversion tag fired on a thank-you pageview trigger, so GA4 attributed all key events to /thank-you. Diagnosed from a GTM container dump and scoped an additive fix without touching the ad-platform tags. Also traced inconsistent ad-campaign attribution in form submissions to a script race condition compounded by cross-origin iframe behavior. Built the client a repeatable measurement stack on their own accounts (Search Console, GA4, PageSpeed and CrUX, Bing Webmaster, GTM, Webflow Insights, plus scripted SERP and backlink pulls), snapshotted monthly against a baseline table.
Course Content Pipeline with a Verification Gate
The 219-course content program moved to a pipeline where every course lives as a file with per-field status and a facts-with-sources ledger, behind a validator gate; the Scotland set migrated first: 69 course files with 138 of 138 prose fields byte-matched against the CMS. The gate exists because of a hard lesson: the client caught three factual errors in the AI-drafted copy for one course (Carnoustie), and my own same-day re-check across the six top courses found that five of the six carried at least one wrong or unverifiable claim, with the sixth checking clean. The process was rebuilt within a week around a rule that every factual claim needs a named source before it ships, and that a missing fact beats an unverified one; client review packs now present each claim with its source for approval.
Content Integrity Monitoring
A three-layer integrity system now guards the site: a field-level CMS baseline across 321 items and 950 text fields that alarms on shrunk or emptied content, a rendered-page baseline across 269 pages catching meta, robots, canonical, and content drift, and a monthly full-content archive in git as a restore source. Weekly and monthly scheduled runs.
The Results
- Homepage mobile Lighthouse Performance: 40 (December 2025 baseline) to 81 (April 2026).
- Homepage desktop, as of April 2026: Performance 96, LCP 1,215 ms, TBT 26 ms, CLS 0.000.
- St Andrews landing page: mobile Performance 56 to 98. Scotland landing page: desktop Performance 62 to 98.
- Destinations page payload: 12,458 KiB to 5,155 KiB. Testimonials animation: 2,750 KiB to 129 KiB.
- 82 duplicate page titles resolved, 11 post-migration 404s redirected.
- About page heading structure: 307 H1s to exactly 1 H1, 6 H2s, and 18 H3s, verified live.
- Live today: single H1 per page across sampled templates, sitewide JSON-LD graph with FAQPage markup, auto-generated sitemap, global canonical, staging noindexed, and llms.txt at the root.
- Real-user Core Web Vitals pass site-wide (CrUX field data, 2026-07-09): LCP p75 of 2.18s on mobile and 1.15s on desktop, INP 87ms and 64ms, CLS 0. Stated site-wide, not per-page, since CrUX served origin-level data.
- Site-wide metadata audit score raised from 93.4 to 97.0 out of 100 on my own 100-point rubric, with 15 pages rewritten and verified live (June 2026).
- Structured data at full coverage: multi-node @graph schema on all 13 destination pages and a corrected GolfCourse plus BreadcrumbList template covering 170 plus course pages, alongside 10 static pages and an enriched site-wide Organization node.
- GA4's "AI Assistant" channel measured at 78% engagement across 41 sessions, the highest-engagement traffic segment on the site (June 2026 snapshot; small sample, quoted for engagement quality only).
- The schema-enriched destination pages engage 2 to 3 times better than the paid landing pages (69.5% vs 48.9% engagement, 175s vs 61s average time), the data case behind the client's organic investment.
One caveat worth stating with any Lighthouse numbers: mobile scores on this property vary up to 20 points between runs due to CPU throttling, so before and after figures are medians across multiple passes. Production Best Practices currently caps at 81 because a third-party pixel calls a deprecated Chrome API, not fixable without tag-manager access.
Have a Build Like This One?
Thirty minutes, your project on screen. You leave with a scoped plan and a number, whether or not we work together.