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.
Sports
Each sport or program is one product.
| Kind | How the theme recognises it | Shown as |
|---|---|---|
| ASC camp | Product metafield Partner Camp is not true | Standard camp card, listed first |
| Partner program | Partner Camp is true | Card with a "Partner Program" label, link suffix -programs |
| Community Sports Camps (CSC) | Title contains Community Sports Camps and Partner Camp is true | Card 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:
| Option | Used for |
|---|---|
Week | Week filter and map data. Week is stripped from the value |
Location | Suburb label on the camp card and map data |
Any other option, for example Days Attending | Joined 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.
- 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. - The variant has a SKU. A variant without a SKU is skipped everywhere.
- The variant's In Season metafield is not
false. A blank value counts as in season. - For maps, the variant's Location Details metafield is set.
- 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
| Where | Order |
|---|---|
| Camp cards on city and sport pages | ASC camps first, then earliest Camp Start Date. Camps with no start date go last |
Pages whose URL contains badminton-programs | Longest duration first, then start date |
| SEO combo landing page cards | Highest price first |
| Cities in menus, filters and the Camp Finder | City Sort Priority, higher first |
| Tabs on the Tabbed Carousel | Product Sort Priority, higher first |
| FAQs and static reviews | Their 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.
| Template | Page type | Metafields it relies on |
|---|---|---|
page.find-a-camp-sport | One sport, all cities | Sport Products, Hero Video, Thumbnail Image, SEO Copy |
page.find-a-camp-sport-partner | One partner program | As above. The template differs only in static copy |
page.find-a-camp-location | One city, all sports | Sport Products, City Metadata, Hero Video, School Holiday Description |
page.no-camps-available | City with no camps yet | City Metadata. Shows a Klaviyo sign-up form |
page.combo-landing-page | One sport in one city, for search engines | SEO Landing Page: Sport Filter, SEO Landing Page: City Filter, Landing Page Subtitle |
page.camp-landing-page | Hand-picked camps | SEO Landing Page: Variants, Camp Card Heading |
page.csc | Community Sports Camps | None. Lists the csc-only collection |
Several parts of the theme build page links from names rather than storing them:
| Link | Built from |
|---|---|
/pages/{city} | City name, lower case with spaces as hyphens |
/pages/{sport}-camps | Sport Safe Name, for ASC camps |
/pages/{sport}-programs | Sport Safe Name, for partner programs |
/pages/{city}-{sport}-camps | Both, 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
| Concern | File |
|---|---|
| Visibility rules and card rendering | theme/sections/camp-list.liquid |
| Camp card markup, badge, duration | theme/snippets/camp-card.liquid, theme/snippets/camp-card-badge.liquid, theme/snippets/asc-camp-duration.liquid |
| Sorting and client-side city filter | theme/assets/camp-list.js |
| Map data | theme/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 filters | theme/snippets/camp-facet-filters.liquid, theme/assets/camp-facet-filters.js |
| Camp Finder links | theme/assets/camp-finder.js |
Operator instructions are in Sports and Camps and locations. If a camp is missing, use A camp is not showing.