SEO Audit 10 May 2026

Combo Camps

combocamps.com
Whistler, BC
Squarespace
Kids day-camp operator
778-793-9199
31
out of 100
Grade F

Audit Summary

Combo Camps offers kids day camps in Whistler. The site is reachable, served over HTTPS, has a published sitemap, and links Facebook and Instagram from the footer. A phone number, an email address, and a Whistler postal address are all visible in the rendered HTML.

The remaining issues stem from Squarespace platform limitations rather than from any lack of SEO effort. Squarespace ships robots.txt with every major AI crawler blocked by default. Squarespace's password-gate widget injects <h1>Enter Password</h1> into the static HTML of every page across the site, including the homepage and the About page — a platform behaviour that cannot be overridden through normal page settings. The LocalBusiness JSON-LD Squarespace emits is a near-empty stub with no name, address, phone or geo. Lighthouse mobile measured Largest Contentful Paint at 13.3 seconds, driven primarily by Squarespace's render-blocking platform CSS bundle, which is not configurable from inside the editor.

The recommended path forward is the planned migration to a file-based site with a custom backend. The migration removes the platform-bound LCP, schema, H1-injection and AI-crawler limits in one move and bakes the Sprint 1 fixes (clean HTML, populated meta, full schema, AI-friendly robots.txt, security headers) into the build itself. The four-sprint roadmap below assumes the migration as the foundation and projects the score from 31 today to ~92 after content and authority work.

Technical SEO 42
Weight: 22%
Content Quality & E-E-A-T 41
Weight: 23%
On-Page SEO (SXO) 29
Weight: 20%
Schema / Structured Data 8
Weight: 10%
Performance (CWV) 22
Weight: 10%
AI Search Readiness 6
Weight: 10%
Images & Visual 60
Weight: 5%
Local SEO 19
Supplementary
Sitemap & Architecture 48
Supplementary
E-E-A-T Assessment
Experience, Expertise, Authoritativeness, Trustworthiness. Combined score 41/100.
Experience 10 / 20

The /testimonials page contains eight named, attributed parent reviews with specific outcomes ("my son came home covered in mud and grinning") — strong first-hand experience signal. The same content carries no Review schema, so the signal is wasted on machine readers. There are no parent guides, no day-in-the-life narratives, and no first-person staff content.

Expertise 5 / 25

Bio pages exist for four staff (Jamie, Olly, Jane, Chloe), but their content is shallow and they are not linked from any program page. Coaching credentials, first-aid certifications, and child-safety qualifications — the things parents check before booking — are not declared. Google's September 2025 Quality Rater Guidelines now require demonstrated expertise to be attached to identifiable individuals on commercial pages. They are not.

Authoritativeness 8 / 25

No press citations. No Tourism Whistler directory entry. No accreditation badges (BC Camping Association, the Canadian Camping Association). No Wikidata entity. The /parents-hub/certifications page implies certifications exist; they are not surfaced as named bodies with verifiable links. Facebook and Instagram are linked in the footer but not declared in the schema sameAs property.

Trustworthiness 18 / 30

A privacy policy and cancellation policy are published. The cookie policy exists. NAP is internally consistent where it appears. The trust collapse is the WINTER 2022/2023 H1 still rendering on the live winter pricing page in May 2026, the /covid19 page still being indexed, and the Squarespace template names ("General 1", "Reviews 1", "Gallery 3") leaking into <title> tags on five pages.

Local Service Search in 2026
Why structured data and AI surfacing now decide whether parents find you

Current Foundations

The website is reachable and indexable. HTTPS is active. The Squarespace CDN is healthy with 24-hour cache age. A sitemap is published at /sitemap.xml with 61 URLs. The site ranks for the brand name "Combo Camps" in Google. The CampBrain registration system is integrated. Facebook and Instagram profiles exist and are linked from the footer.

What Has Changed in Local Service Search

Three changes in how parents find local activity providers since this site was last meaningfully reviewed affect the recommended work below.

First, Google leads almost every "[activity] camp [city]" query with a Map Pack. The Google Business Profile, not the website, is the primary surface a parent first sees. Second, AI assistants (Google AI Overviews, ChatGPT, Perplexity) now answer queries like "best summer camps in Whistler for 7 year olds" inline, and they require structured data (LocalBusiness, Event, AggregateRating, FAQPage) before they will reliably name a specific provider. Third, parents shortlist from a phone in 30 seconds: ages, dates, price, and a "book now" link have to be visible above the fold or the page is rejected.

Most of the diagnosed issues are platform-bound and resolve cleanly inside the planned migration to a file-based site with custom backend. The work falls into two tracks:

•  Baked into the migration build: clean HTML semantics (one H1 per page, no global password-widget leak); hand-authored titles and 18 meta descriptions; full LocalBusiness/Event/FAQ/Review schema generated from CMS data records; AI-friendly hand-authored robots.txt; security headers (HSTS, CSP, XFO, Permissions-Policy) at the host; programmatic sitemap from the route tree.

•  Post-migration content and authority work: above-the-fold ages/dates/price/book card on every program page; richer /find-us/ location page; bio pages with surfaced certifications and Person schema; six evergreen parent guides; press outreach; directory citations (Tourism Whistler, Apple Business Connect, Bing Places).

Doing the SEO work as part of the migration is faster, cheaper, and more durable than retrofitting it onto Squarespace and migrating afterwards. The migrated site removes today's hard ceilings (LCP, security headers, the H1-injection widget, the AI-crawler block) at the platform level rather than working around them.

Critical & High Issues
Issues blocking or significantly impacting rankings and AI visibility
Squarespace password-gate widget injects <h1>Enter Password</h1> on every page Critical
A site-wide password-gate widget renders <h1>Enter Password</h1> directly into the static HTML of all 18 pages crawled, including the homepage, the About page, every program page, and every pricing page. JavaScript hides the visual overlay on most pages but the H1 stays in the DOM. Googlebot reads it as the first H1 on every page. The visual content underneath is hidden from crawlers entirely on About, Gallery, and Parents Hub.

This single bug simultaneously breaks: Technical SEO (multiple H1s per page), Content Quality (the founder origin story on /about-1 is invisible to Google), SXO (the wrong H1 is prioritised), and Local SEO (key business information sits behind the gate).
How to fix (resolved in the migration)
The migrated build has no global password-gate widget. Each page renders exactly one H1 lifted from its own page heading. The two or three URLs that genuinely need access control (camper portal, manager apply) get page-level auth that does not affect the H1 of unrelated pages. The pattern cannot recur because the platform behaviour causing it does not exist in the new stack.
robots.txt blocks every major AI crawler Critical
Squarespace's default robots.txt applies a Disallow: / rule to every major AI crawler: GPTBot, ClaudeBot, anthropic-ai, OAI-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended, CCBot, plus 20 others. The site is invisible to AI search by default.

This is not a deliberate decision by the site owner. It is a platform default that has not been overridden. For "best summer camps Whistler", "kids day camp Whistler village" and similar tourist-intent queries — exactly the queries AI engines now answer inline — Combo Camps cannot be cited at all.

Platform-by-platform GEO score: Google AIO 4/100, ChatGPT 3/100, Perplexity 3/100, Bing Copilot 5/100.
How to fix (resolved in the migration)
The migrated build ships a hand-authored robots.txt at the site root. Allow GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, anthropic-ai, PerplexityBot, Applebot-Extended, Google-Extended, CCBot. Disallow only genuine private paths (/admin/, /api/private/). Sitemap reference at the bottom. No more platform-default behaviour to reverse.
Every meta description is empty across all 18 pages crawled Critical
Every page sampled — homepage, About, Summer/Fall/Winter Programs, Pricing, FAQs, Apply, Testimonials, Gallery, Parents Hub, Leadership, Adult/Family, Club Programs, Kiddy Summer, all three pricing pages — emits <meta name="description" content=""/>. Empty.

Google has to autogenerate snippets, and on the homepage the only content it has to work with is the tagline "THE BEST DAY EVER" — which contains no decision-relevant information. SERP click-through rates suffer accordingly.
Fix (write during the migration build)
Every page in the new build ships with a hand-written 140–155 character meta description as a build acceptance criterion. Lead with the parent's question (price, age, dates, location) and end with a verb. Examples:
• Homepage: "Whistler day camps for ages 5–13. Action sports, art, leadership programs. Summer 2026 dates from $735. Book your spot today."
• /summerprograms: "Summer 2026 day camps in Whistler — biking, skating, climbing, art. Ages 5–13. June 15–Aug 28 from $735/week. See dates and pricing."
• /faqs: "Common questions about Combo Camps day programs in Whistler — what to bring, age groups, refund policy, drop-off times, and more."
Winter pricing page H1 still reads "WINTER 2022/2023" in May 2026 Critical
The H1 on /winterpricesdates reads WINTER 2022/2023. The audit was run in May 2026 — the dates on this commercial pricing page are four years out of date.

A returning parent checking next winter's availability sees abandoned data, assumes the business is no longer running winter camps, and leaves. AI engines decline to cite contradictory or stale dates. The page also signals to Googlebot that this section of the site is no longer maintained, depressing freshness signals across /winter* URLs.
Fix (architectural — resolved in the migration)
In the migrated build, season dates are stored as data (a CMS field or a YAML/JSON record) and referenced everywhere they appear — the program page, the pricing page, the homepage hero, the schema. Updating winter dates updates everywhere in one edit. The four-year-stale H1 pattern cannot recur because there is no longer a separate hand-edited H1 to forget about.
LocalBusiness JSON-LD has no name, address, phone, or geo Critical
The LocalBusiness JSON-LD block currently emitted is essentially empty: only an image field and "openingHours": "" (a literal empty string). Name, address, telephone, geo, priceRange, and sameAs are all absent.

All of the underlying NAP information is present in the rendered page (4500 Northlands Blvd, Whistler BC V8E 1C7; 778-793-9199; info@combocamps.com; Facebook and Instagram profiles in the footer). None of it is exposed to crawlers in machine-readable form. For a Whistler-area business attempting to surface in the Map Pack and AI Overviews, this is the single largest gap identified.
Fix (baked into the migration build)
The new build emits a fully-populated multi-type ["LocalBusiness","SportsActivityLocation","Organization"] JSON-LD block from a single LocalBusiness data record. Fields populated: name, address (PostalAddress), geo (50.115, -122.954), telephone, email, openingHoursSpecification, priceRange, sameAs (Facebook + Instagram + GBP), founder (Jamie Grant). Renders on every page. Pre-written block in agent-schema.md; validation gate in CI via Google's Rich Results Test.
Largest Contentful Paint is 13.3 seconds on mobile (Lighthouse) Critical
Lighthouse mobile measured: LCP 13.3s (FAIL), FCP 6.7s (FAIL), CLS 0.00 (PASS), TBT 130ms (PASS). The element-render-delay of the LCP itself is 1,912 ms — the dominant cost.

Drivers, in order of magnitude:
• Squarespace platform site.css blocks for 3,207 ms (111 KB)
• Google Fonts 3-hop waterfall blocks for 834 ms
• 379 KB of unused JavaScript (Squarespace bundle plus Meta Pixel)
• 6 oversized images served at 750×500 displayed at ~635×423, no explicit width/height attributes

The Squarespace platform CSS blocking is structural and not fully recoverable inside the platform. Even with every available Squarespace optimisation applied, the LCP ceiling is ~11.5s.
Fix (resolved by the migration)
The migrated build on a static-first stack (Astro / Next.js + Cloudflare Pages or Vercel) eliminates the 3.2s render-blocking platform CSS bundle entirely. Self-hosted woff2 fonts with font-display: swap; properly-sized AVIF/WebP images via <picture> with explicit width/height; Meta Pixel deferred to window load; no Squarespace bundle. Realistic mobile LCP target: 1.8–2.4s, vs the current 13.3s. Core Web Vitals move from FAIL to PASS on every metric.
/springprogram is linked from the homepage navigation but returns 404 Critical
The homepage navigation includes a link to /springprogram. The actual page lives at /kiddycombo/springprogram. The advertised path returns HTTP 404 with no redirect.

Every visitor who clicks Spring in the nav lands on a 404. Googlebot follows the same link and records a 404 against an internal nav target — a strong negative quality signal for an e-commerce-style local site.
Fix (resolved in the migration cutover)
The migration includes a 301 redirect map covering every URL in the current Squarespace sitemap. Broken nav links cannot ship — the build fails CI if any internal link does not resolve. Spring is given a single canonical URL (likely /spring-camp/) with a 301 from any legacy path.
HSTS is effectively disabled (max-age=0) High
The HTTP response carries strict-transport-security: max-age=0. This is technically a header, but with a max-age of zero it instructs browsers to forget any previous HSTS commitment immediately. The site has effectively no HSTS protection.

Squarespace also does not surface CSP, X-Frame-Options, or Permissions-Policy on the response. Those three are platform-bound and only fixable by routing the domain through a reverse proxy such as Cloudflare. HSTS is the one that is fixable inside Squarespace.
Fix (resolved at the new host)
The migrated build sits behind Cloudflare Pages or Vercel, both of which let HSTS, CSP, X-Frame-Options, Permissions-Policy, and Referrer-Policy be set explicitly on the response. Recommended HSTS: max-age=31536000; includeSubDomains; preload. All four headers Squarespace cannot set natively land in the same configuration step.
og:image and twitter:image use http:// (mixed-content fail on socials) High
Both the Open Graph image and the Twitter Card image are declared as http://static1.squarespace.com/.... Facebook, LinkedIn, and Apple Messages block insecure image URLs from HTTPS pages. The result is a broken or missing preview when anyone shares a Combo Camps page on social.

The image is also the logo (a 335×198 PNG), not a hero image. Even when the URL is fixed, the preview will be a small logo in a large grey card, not a photo of children at camp — which is the real conversion driver in this category.
Fix (baked into the migration build)
New build emits og:image as a 1200×630 photograph over HTTPS, with a sensible per-page default (children at camp, not the logo) and per-page overrides for programme-specific imagery. twitter:card set to summary_large_image globally. Optionally add per-page generated OG images via Cloudflare Image Resizing or Vercel OG.
Squarespace template names leaking into <title> on five pages High
Five live page titles still use Squarespace template defaults instead of real titles:

/leadership: "General 1 — Combo Camps"
/kiddysummer: "General 1 — Combo Camps"
/testimonials: "Reviews 1 — Combo Camps"
/gallery: "Gallery 3 — Combo Camps"
/apply: "Combo Camps — Combo Camps" (brand name twice)

These appear in Google's SERP exactly as written. They contain no keywords and no value proposition. The /apply title in particular is a transactional page where title-tag clarity directly affects conversion.
Fix (hand-authored during the migration build)
Every page in the new build has a hand-authored title using the format [Topic + geo modifier] | Combo Camps Whistler, max ~60 characters. No template-leaked names possible — there are no templates with default names in the new stack. Examples:
• /leadership: Leadership Camp for Teens (Ages 13–17) | Combo Camps Whistler
• /testimonials: What Parents Say About Combo Camps | Whistler Reviews
• /apply: Apply for Summer 2026 Camps | Combo Camps Whistler
Zero of 18 page titles contain a geo keyword High
Not one of the 18 page titles sampled mentions Whistler, BC, or any geographic identifier. For a local-service business operating in a high-volume tourist destination, this is the single most consequential on-page omission.

Parents searching "kids day camp whistler", "whistler summer camp", or "spring break camp whistler village" need to see "Whistler" in the SERP title or they scroll past. Tourist-intent searches in particular weight geo-match heavily because parents are filtering for "while we're up the mountain" timing.
How to fix (~1 hour for titles, ~3 hours for the location page)
1. Add "Whistler" to the title of every existing program and pricing page. Format: [Topic] | Combo Camps Whistler.
2. Build a richer /find-us/ or /location/ page with the venue address, an embedded Google Map, parking and drop-off instructions, the route from Whistler Village, and a "what to expect on the first morning" section.
No FAQPage, Review, or Event schema anywhere on the site High
The /faqs page contains well-organised Q&A across multiple sections — the canonical use case for FAQPage schema — and emits zero structured data. The /testimonials page contains eight named, attributed parent reviews with no Review or AggregateRating wrapping. Each program page (Summer, Fall, Winter, Kiddy Summer, Leadership) lists real dates and prices with no Event schema.

FAQPage rich-result eligibility is now restricted to government and health sites in Google's documentation, but the markup remains the single highest-leverage signal for AI Overview citation. Review/AggregateRating is the primary signal Google uses for star ratings in the Map Pack. Event schema is required for the dates panel.
Fix (generated from CMS data records in the new build)
The migrated build emits FAQPage from FAQ records, Review/AggregateRating from testimonial records, Event from program-page date/price records, BreadcrumbList from the route tree, and Person from staff bio records — all generated by the build, not hand-maintained per page. Adding a Q&A in the CMS adds it to both the page and the schema. Nine pre-written ready-to-paste blocks are in agent-schema.md as the starting templates.
No /llms.txt, no Wikidata entity, no AI grounding signals High
/llms.txt returns 404. There is no curated entity summary for AI systems. Combined with the missing LocalBusiness schema fields and empty sameAs, AI engines have no canonical entity record to ground claims against. Wikidata also has no entry for "Combo Camps" — a low-cost, high-leverage AI grounding signal that does not require Wikipedia notability.

For tourist queries such as "best kids camps Whistler", "summer camp whistler village", "winter break camp BC" — exactly the queries AI engines now answer inline — Combo Camps is missing from every grounding source AI engines consult.
Fix (during and post-migration)
1. The migrated build serves /llms.txt as a static file at the root. Markdown sections: Entity summary · Programs · Location (Whistler) · Pricing · Booking · Contact. Draft in agent-geo.md.
2. Create a Wikidata Q-ID separately (no Wikipedia notability required). Properties: P31 summer camp, P131 Whistler, P625 50.115/-122.954, P856 https://www.combocamps.com.
3. Once the migrated site is live with AI crawlers allowed and the full schema in place, both ChatGPT and Perplexity typically index within 2–6 weeks.
No GBP signals on the site (no sameAs, no Maps embed, no AggregateRating) High
There is no Google Maps embed on any page. No sameAs property points to a Google Business Profile. No AggregateRating widget surfaces real review data. The site provides no on-page evidence that a GBP listing exists at all.

The Map Pack is the primary surface a Whistler tourist sees when searching local activities. If the GBP exists, the website does not reinforce it. If it does not exist, that is itself the single highest-ROI fix in the local SEO category.
How to fix (1–2 hours)
1. Verify a Google Business Profile exists for Combo Camps at the Whistler address; create one if not.
2. Add the GBP URL to the sameAs array in the LocalBusiness schema.
3. Embed a Google Maps iframe on /find-us (or equivalent) and on the footer.
4. Add a review-pull widget that surfaces live Google reviews on the homepage and /testimonials.
Sitemap problems: /home in place of /, stale lastmod, /covid19 still indexed Medium
The Squarespace-generated sitemap has 61 URLs but several structural issues:

• The root / is absent; /home is in its place — backwards.
/covid19 and /parents-hub/covid19policy last updated 2022 are still in the sitemap in 2026.
• 30 of 61 entries carry lastmod dates from 2021. The last bios update was 2024-06-07.
/applicationcomplete (a thank-you confirmation page) is indexed and in the sitemap.
• Internal staff pages (/managerapply, /programmanager) appear in the sitemap when they should be noindex.
/faq (linked from the footer) and /faqs (in the sitemap) are split — they need a 301 to one canonical.
priority and changefreq are populated on every entry. Google has ignored both since 2023.
Fix (resolved in the migrated route tree)
The migrated build generates sitemap.xml programmatically from the route tree. The route tree itself does not include /home (the homepage is /), /covid19, /applicationcomplete, /managerapply, /programmanager, or any of the duplicate variants. /faq and /faqs resolve to one canonical URL with a 301 from the other. lastmod is sourced from real edit timestamps in the CMS. priority and changefreq are dropped (Google ignores both).
No content programme — zero blog, zero parent guides, no topical authority Medium
The site has no blog, no parent guides, no day-in-the-life narratives, no packing lists, no "what to expect on day one" content. The 18 indexed pages are all commercial: programs, prices, apply, contact, FAQs.

Long-tail capture ("what to pack for whistler summer camp", "do kids need to know how to bike", "spring break camp vs day care") is entirely uncaptured. AI engines reward sites that publish answer-shaped content; this site has the answers (the FAQs page is good) but no answer-shaped pages designed for citation.

Topical authority compounds. Competitors who publish six Whistler-specific camp guides per year build linkable assets and long-tail traffic; Combo Camps does not.
How to fix (~12-15 hours for first 6 posts)
Publish six evergreen articles, 1,200–1,800 words each, optimised for parent-intent long-tail queries. Suggested titles: Whistler Summer Camp Packing List for Ages 5–10 · What to Look For in a Kids' Day Camp: A Parent's Checklist · Spring Break Camp vs Day Care: Which Is Right for Your Child? · How Combo Camps Groups Children by Skill, Not Just Age · A Parent's First-Day Drop-Off Guide for Whistler Camps · When Should Kids Start Mountain Biking? A Whistler Coach's View.
SXO persona scoring: returning customers score the page 11/100 Medium
The page-type mismatch is the fundamental SXO problem. Parents searching "kids summer camps whistler" expect a commercial landing page with price, age range, dates, and a booking CTA visible on arrival. Combo Camps delivers a brand hub whose hero says "THE BEST DAY EVER" and whose first H1 in the DOM is "Enter Password".

Three persona scores from the SXO subagent:
Returning customer checking dates: 11/100 — sees December 2021 dates on the winter page, abandons.
New parent from search: 16/100 — no orientation, no price/age/dates above the fold, no clear "what is this".
Comparing parent (multiple tabs open): 16/100 — no single page summarises price + age + activity + booking path.
How to fix (~3 hours)
Add a four-cell summary card above the fold on every program page: Ages | Dates | Price | Book. Make the booking CTA visible without a scroll. Replace the homepage tagline hero with a card that contains the four cells plus a one-line "what we do, where, for whom" paragraph.
Action Plan
Migration-led roadmap. Four sprints to lift the score from 31 to ~92.
1
Sprint 1: Migration foundation
Approximately 3 weeks · Score impact: 31 to 58 · Lift-and-shift to a file-based site with custom backend, baking the critical SEO fixes into the build itself.
Build the new site on a static-first stack with custom backend
Recommended: Astro or Next.js for the front end on Cloudflare Pages or Vercel; custom backend (Workers / Node) for the booking/CRM integrations CampBrain currently fronts. No global plugins, no platform-injected widgets, full control over HTML, headers, and scripts.
migration scopeCritical impact
One H1 per page; no global "Enter Password" widget
Page-level auth on the small number of URLs that genuinely need it (camper portal, manager apply). Public pages emit exactly one H1 lifted from the page heading. The site-wide H1-leak pattern disappears at the platform level.
build reqCritical impact
Hand-author robots.txt; allow AI crawlers
Allow GPTBot, ClaudeBot, OAI-SearchBot, PerplexityBot, Google-Extended, Applebot-Extended, CCBot. Disallow only genuine private paths. Sitemap reference at the bottom.
build reqHigh impact
Hand-written meta description on every page
All 18 pages ship with a 140–155 char meta description as a build acceptance criterion. Lead with parent's question (price/age/dates/location), end with a verb. Templates pre-written in agent-content.md.
build reqHigh impact
Hand-authored titles with Whistler keyword
No template-leak titles ("General 1", "Reviews 1", "Gallery 3"). Format: [Topic] | Combo Camps Whistler. Apply page in particular gets a real, programme-context title.
build reqHigh impact
Full LocalBusiness/SportsActivityLocation schema baked into the build
Multi-type entity rendered from a single LocalBusiness data record with name, address (4500 Northlands Blvd, Whistler), geo (50.115, -122.954), telephone, openingHoursSpecification, priceRange, sameAs (Facebook + Instagram + GBP), founder Jamie Grant. Pre-written block in agent-schema.md.
build reqCritical impact
Dates from a single source of truth (kill the WINTER 2022/2023 pattern)
Season dates stored as data (CMS field or YAML), referenced by every page that displays them. Updating the winter dates updates everywhere. The four-year-stale H1 problem cannot recur.
build reqHigh impact
Real og:image (1200×630 photo) over HTTPS
Children-at-camp photograph, not the logo. twitter:card set to summary_large_image. Built into the per-page metadata layer with a sensible default.
build reqMedium impact
Security headers set at the host (Cloudflare Pages / Vercel)
HSTS with a 1-year max-age and includeSubDomains, CSP, X-Frame-Options, Permissions-Policy, Referrer-Policy. All four headers Squarespace cannot set natively.
build reqMedium impact
Programmatic sitemap.xml; clean route tree
No /home, /covid19, /applicationcomplete, /managerapply, /programmanager. /faq and /faqs canonicalised to one URL with a 301 from the other. /springprogram routed correctly. lastmod populated from real edit timestamps.
build reqMedium impact
301 redirect map for legacy Squarespace URLs
Cutover plan: every URL currently in the Squarespace sitemap maps to either a new canonical URL (301) or a documented removal (410). No traffic or link-equity loss at switchover.
migration taskHigh impact
2
Sprint 2: Performance, UX, location page
Approximately 2 weeks (post-migration) · Score impact: 58 to 72
Hit Core Web Vitals on every page (LCP <2.5s, INP <200ms, CLS <0.1)
Self-hosted woff2 fonts with font-display: swap; properly-sized AVIF/WebP images via <picture>; explicit width/height on every img; Meta Pixel deferred to window load; no render-blocking platform CSS bundle. Realistic mobile LCP target: 1.8–2.4s, vs the current 13.3s.
3 daysCritical impact
Above-the-fold ages/dates/price/book card on every program page
Four-cell summary: Ages | Dates | Price | Book button. No scroll required. Lifts the SXO persona scores from 11–16/100 toward 50+. The single biggest conversion-and-search-experience fix in the audit.
3 hoursCritical impact
Build /find-us/ as a real location page
Venue address, embedded Google Map of the meeting point, parking and drop-off instructions, route from Whistler Village, photos of the first-morning meeting spot. Strong local-SEO signal and parent-trust builder.
4-6 hoursHigh impact
Bio pages with surfaced certifications and Person schema
First-aid, child-safety, mountain-biking, ski/snowboard instructor — whichever applies to each staff member. Person schema with sameAs to LinkedIn or governing-body profiles. Cross-link from program pages so expertise is attached to the relevant programme.
4 hoursHigh impact
Refresh stale pages and decommission /covid19
Migrate Winter 2026/27 dates and pricing into the dates data record. Decide whether /covid19 should 410 or 301 to /parents-hub. Remove the four-years-old vaccine reference entirely.
2 hoursMedium impact
3
Sprint 3: Schema depth, AI surfacing, local signals
Approximately 1 week · Score impact: 72 to 82
FAQPage schema rendered from the FAQ data records
Q&As stored as structured data, rendered to both the visible /faqs page and a FAQPage JSON-LD block. Adding a Q&A in the CMS updates both. Block template in agent-schema.md.
3 hoursHigh impact
AggregateRating + Review schema on /testimonials
Activates eight currently-wasted attributed parent testimonials as authority signal. ratingCount sourced from verified GBP review count, not estimated.
2 hoursHigh impact
Event schema generated from program-page date records
Each program page emits Event JSON-LD with real start/end dates, real prices, real age range, real venue. Eligibility for Google's Events panel. Generated automatically by the build, not hand-maintained.
3 hoursHigh impact
Publish /llms.txt at the site root
Static markdown at /llms.txt. Sections: Entity summary · Programs · Location (Whistler) · Pricing · Booking · Contact. Draft in agent-geo.md.
1 hourHigh impact
Create a Wikidata Q-ID for entity grounding
No Wikipedia notability required. Properties: P31 summer camp, P131 Whistler, P625 50.115/-122.954, P856 https://www.combocamps.com.
1 hourMedium impact
GBP signals: Maps embed, sameAs, review widget
Verify or create the Google Business Profile. Embedded Google Map on /find-us and the footer. GBP URL added to LocalBusiness sameAs. Review-pull widget on the homepage and /testimonials surfaces real Google reviews live.
2 hoursHigh impact
4
Sprint 4: Authority and content programme
Approximately 4 weeks (then ongoing) · Score impact: 82 to ~92
Publish six evergreen parent guides
Whistler packing list · Day-camp parent's checklist · Spring break vs day care · Skill-based age grouping · First-day drop-off guide · When should kids start mountain biking. 1,200–1,800 words each.
12-15 hoursHigh impact
Press outreach: Pique Newsmagazine, Mountain Life, Whistler Insider
Pitch the founder story (Jamie Grant) and any seasonal angles. Local press citations are the fastest authority builder for a Whistler business.
3 daysMedium impact
Submit to Tourism Whistler and Whistler Chamber directories
Highest-ROI Whistler-specific citations. Both authoritative, both tourist-intent aligned.
2 hoursMedium impact
Apple Business Connect, Bing Places, Foursquare
Apple Maps reaches every iPhone tourist; Bing Places feeds Copilot; Foursquare seeds many secondary directories.
2 hoursMedium impact
SEO drift baseline + quarterly review
Capture an SEO drift baseline once the migrated build is stable, so future regressions (a renamed page, a stripped meta tag, a broken H1) are caught before they ship. Run a 30-minute review quarterly.
recurringLow impact
Today (Squarespace)
31
Grade F
After migration
58
+27
After perf + UX
72
+41
After schema + content
82
+51

Summary

Combo Camps is a real, operating Whistler day-camp business held back by the limits of its current platform. The fundamentals — an existing brand, social presence, and a real address and phone — are intact. What's missing is the layer of clean HTML, structured data, current content, performance, named expertise, and AI-crawler access that Google and AI engines now use to identify and rank a local service business. Most of those gaps are platform-bound and the cleanest way to close them is to migrate.

Sprint 1 — the migration to a file-based site with custom backend — bakes the largest fixes (clean H1s, populated meta, full schema, AI-friendly robots.txt, security headers) into the build itself rather than retrofitting them. Sprint 2 hits Core Web Vitals and ships the SXO and location-page work. Sprint 3 layers in the schema depth, AI surfacing, and GBP signals. Sprint 4 is the ongoing content programme and authority work that compounds. End state: a site engineered for both Google and AI search from the foundation up, projected at ~92.