doc-site
Architecture

Catalogue model

How sport products, camp variants, locations, cities and landing pages fit together, and what decides whether a camp is shown.

A sport is a Shopify product and each camp is one of its variants. Camp details that Shopify has no field for, such as dates and venue, are stored in variant metafields and metaobjects. Pages decide which sports they list through page metafields.

The All Sports Collection contains sport products. Each sport product has camp variants. A variant's Location Details metafield points at a Location metaobject, which points at a City metaobject. A city or sport page reads Sport Products and City Metadata metafields.

Sports

Each sport or program is one product.

KindHow the theme recognises itShown as
ASC campProduct metafield Partner Camp is not trueStandard camp card, listed first
Partner programPartner Camp is trueCard with a "Partner Program" label, link suffix -programs
Community Sports Camps (CSC)Title contains Community Sports Camps and Partner Camp is trueCard with a "Community Sports Camps" label. One product, with the sport set on each variant

The product tag sport switches the product page to the booking form and makes the cart render the line as a camp. It does not decide whether a product is listed.

Camps

Each camp is a variant. Variant options are read by name, case-insensitive:

OptionUsed for
WeekWeek filter and map data. Week is stripped from the value
LocationSuburb label on the camp card and map data
Any other option, for example Days AttendingJoined with • on landing page cards for partner programs

The details that drive the storefront live in variant metafields. The main ones are Location Details, Camp Dates, Camp Start Date, Camp End Date and In Season. The full list is in Metafields.

Locations and cities

A Location metaobject holds one venue: name, description, address, suburb, latitude, longitude and a reference to a City metaobject. Several camps can share one location.

A City metaobject holds the city name, map centre, state, a sort priority and an optional page reference. The Cities menu, city filters, the Camp Finder and city pages all read the city list from these entries.

The Location definition also has week, December and January date fields. The theme does not read them. Dates shown on the storefront come from the variant's Camp Dates metafield.

What decides whether a camp is shown

A variant appears in listings, maps and menus only if all of the following are true.

  1. Its product is in the collection set as All Sports Collection in theme settings (currently camps), or, on a city or sport page, its product is in that page's Sport Products metafield.
  2. The variant has a SKU. A variant without a SKU is skipped everywhere.
  3. The variant's In Season metafield is not false. A blank value counts as in season.
  4. For maps, the variant's Location Details metafield is set.
  5. On a city page, the location's city matches the page's City Metadata city.

The exception is Expose For Testing. An ASC camp with Expose For Testing set to true still appears in the Camp List section while out of season, so staff can test it. It does not appear on maps, and its Book Camp button stays disabled.

A variant that is in season but has no available stock shows a "SOLD OUT" badge instead of a price.

Ordering

WhereOrder
Camp cards on city and sport pagesASC camps first, then earliest Camp Start Date. Camps with no start date go last
Pages whose URL contains badminton-programsLongest duration first, then start date
SEO combo landing page cardsHighest price first
Cities in menus, filters and the Camp FinderCity Sort Priority, higher first
Tabs on the Tabbed CarouselProduct Sort Priority, higher first
FAQs and static reviewsTheir Sort Priority field, higher first

The variant Sort Priority metafield is not used for ordering, even though its description says it is.

Camp duration

The "N Days" pill counts the day numbers in Camp Dates. The theme removes commas, splits the value on spaces and counts tokens that are whole numbers from 1 to 31. "8, 9, 10 October 2026" gives 3 days. Write Camp Dates in that format, otherwise the duration and the duration sort are wrong. The pill only shows when Camp Start Date or Camp End Date is set.

Pages

City and sport landing pages are ordinary Shopify pages on shared JSON templates. The page metafields fill in the parts that change between pages.

TemplatePage typeMetafields it relies on
page.find-a-camp-sportOne sport, all citiesSport Products, Hero Video, Thumbnail Image, SEO Copy
page.find-a-camp-sport-partnerOne partner programAs above. The template differs only in static copy
page.find-a-camp-locationOne city, all sportsSport Products, City Metadata, Hero Video, School Holiday Description
page.no-camps-availableCity with no camps yetCity Metadata. Shows a Klaviyo sign-up form
page.combo-landing-pageOne sport in one city, for search enginesSEO Landing Page: Sport Filter, SEO Landing Page: City Filter, Landing Page Subtitle
page.camp-landing-pageHand-picked campsSEO Landing Page: Variants, Camp Card Heading
page.cscCommunity Sports CampsNone. Lists the csc-only collection

Several parts of the theme build page links from names rather than storing them:

LinkBuilt from
/pages/{city}City name, lower case with spaces as hyphens
/pages/{sport}-campsSport Safe Name, for ASC camps
/pages/{sport}-programsSport Safe Name, for partner programs
/pages/{city}-{sport}-campsBoth, from the Camp Finder

A page whose handle does not follow these patterns is not reached from the Camp Finder or the City List section.

Source map

ConcernFile
Visibility rules and card renderingtheme/sections/camp-list.liquid
Camp card markup, badge, durationtheme/snippets/camp-card.liquid, theme/snippets/camp-card-badge.liquid, theme/snippets/asc-camp-duration.liquid
Sorting and client-side city filtertheme/assets/camp-list.js
Map datatheme/snippets/camps-geojson.liquid, theme/snippets/geojson-variant.liquid, theme/assets/map-renderer.js
Site-wide camp data (window.theme.allCamps)theme/layout/theme.liquid
Session and suburb filterstheme/snippets/camp-facet-filters.liquid, theme/assets/camp-facet-filters.js
Camp Finder linkstheme/assets/camp-finder.js

Operator instructions are in Sports and Camps and locations. If a camp is missing, use A camp is not showing.

On this page