doc-site
Architecture

Integrations

Every service the storefront and its orders depend on, what each is used for, and where it is configured.

The storefront talks to two ASC services on Cloud Run, a set of Zapier zaps, and several third-party apps. Most of their configuration lives outside this repository, so this page records the contract visible from here and where the rest is kept.

ASC services on Cloud Run

Both services run in Google Cloud project asc-map-project, region australia-southeast1.

asc-api-membership-pass

PurposeSaved children for the booking form, and membership pass use in the cart
Called byThe customer's browser
Base URLTheme setting ASC - Membership Pass, Google Cloud API URL (gcloud_api_root)
SourcePrivate repository Conversion-Kings/asc-api-membership-pass (Hono, TypeScript)
In production since10 June 2026, replacing the gcloud-api service built from google-cloud-api/
RouteUsed by
GET /v1/customers/{id}/childrenBooking form, to list saved children
POST /v1/customers/{id}/children/saveBooking form, to save a new child
POST /v1/customers/{id}/membership-pass/useCart, to use a pass
GET /v1/customers/{id}/membership-passNot called by the storefront
DELETE /v1/customers/{id}/children/{childId}Not called by the storefront
GET /healthHealth check

Request bodies are JSON, base64-encoded twice and sent as text/plain. Saved children are stored as child metaobjects listed in the customer metafield children.saved_details.

shopify-zoho-integration

PurposeOrders and bookings into Zoho, membership purchases, booking emails, club search, camp uploads, camp swaps
Called byZapier, a daily scheduled job, the booking form, and a Shopify Admin app
Base URLBuilt into the booking form from ZOHO_INTEGRATION_API_ENDPOINT
SourceRepository Conversion-Kings/asc-api-src-zoho-integration (Express, TypeScript). Version 1.13.9 at the time of writing
RouteCallerPurpose
POST /ordersZapierSends a paid order to Zoho
POST /emailsZapierBooking confirmation email
POST /emails/cronScheduled job7-day and 2-day reminder emails
POST /membershipsZapierRecords a membership pass purchase
PUT /membershipsZapierReduces the pass balance after checkout
GET /clubs/searchBooking formClub name search against Zoho
POST /form-submissionsZapierTidies Hulk Forms submission data
POST /campsShopify Admin app "Camp Uploader"Creates or updates camps in Zoho
POST /camp-swapShopify Admin app "Camp Swap"Moves a participant to another camp in Shopify and Zoho
POST /auth, /protected/bookings, GET /bookings/searchShopify Admin app "Order Manager"Booking push, refund, cancel and search
GET /heartbeatMonitoringReturns status and version

The Shopify Admin app that provides Camp Swap, Camp Uploader, Email Reminders by Order and Order Manager appears in both architecture diagrams, but its source code is not in any repository available to this project.

The service's own documentation is in docs/ in its repository.

Zapier

Zapier holds the triggers that connect Shopify to the integration service. None of the zaps are exported to a repository.

ZapTriggerAction
Shopify → Zoho via APIShopify order createdPOST /orders
Confirmation Emails via APIShopify order createdPOST /emails
Membership Pass Purchase via APIShopify order createdPOST /memberships
Auto-archive membership productsSet in ZapierArchives pass products after 15 minutes through the Shopify Admin API
Capture Form SubmissionsCatch hook in theme setting form_submission_webhookAdds the person to prospects
Download Brochure FlowsCatch hooks in theme settings download_brochure_webhook and download_brochure_landing_page_webhookEmails the brochure link and, with consent, adds the person to Klaviyo

A zap also calls PUT /memberships after checkout, but its name is not recorded anywhere in the repositories.

The Shopify → Zoho via API zap sends Zoho OAuth client details in its request body, so those credentials are stored in Zapier as well as in the service.

The code that used to run inside these zaps in 2024 is in misc/zapier-scripts/. It is kept for reference and is not what the zaps run today.

Forms

FormBuilt withWhere the data goes
Contact, coach recruitment, coach enquiriesHulk Form Builder appHulk, plus the form_submission_webhook Zapier hook
Flyer and guide downloads on resource pagesHulk Form Builder, opened from the Resources Grid sectiondownload_brochure_landing_page_webhook Zapier hook, with the metaobject id as cardId
Brochure download on a camp product pageTheme section Brochure Newsletter Subdownload_brochure_webhook Zapier hook, with referrer: 'PDP'
Email sign-upKlaviyo form embedKlaviyo

Hulk forms run in an iframe. src/js/custom.js listens for postMessage events from https://formbuilder.hulkapps.com and forwards form_submit and brochure_download events to the Zapier hooks.

Analytics and tracking

ToolLoaded byNotes
Google Analytics 4Not the themeThe theme settings for Google Tag Manager and Google Ads IDs are blank. GA4 is set up in Shopify Admin, most likely through Customer Events or the Google & YouTube app
Shopify custom eventstheme/snippets/asc-track-checkout.liquid, theme/snippets/custom-gtm-tracking.liquidPublishes checkout_clicked from the cart and seo_page_view on combo landing pages. A Customer Events pixel is needed to forward them
HotjarTheme setting Hotjar IDLoaded on pages using theme.liquid only, so not on product pages
Microsoft ClarityClarity app embed, plus theme/assets/clarity-tracking.jsWrites clarity_uid and clarity_session_id as cart attributes, so they appear on orders
KlaviyoKlaviyo app embedAlso tags visitors to "no camps available" pages with a camp_interest_ property

Klaviyo, Hotjar, Clarity, Google Maps and some map scripts are held back by yett until the visitor first touches the screen, clicks, types, uses the scroll wheel or moves the mouse. The block list is window.YETT_BLACKLIST near the top of both layouts.

Maps and places

ServiceUsed forConfiguration
MapLibre GL with OpenFreeMap tilesAll camp mapsStyle URL in theme/assets/map-renderer.js. No account or key
Google Maps link"View in Google Maps" on the product pageBuilt from the location's latitude and longitude
Google PlacesSchool search in the booking formBrowser key from GOOGLE_PLACES_API_KEY, set in Google Cloud

Payments

Afterpay messaging shows under the price on product pages through theme/assets/shopify-afterpay-javascript.js. Payment itself is handled by Shopify checkout.

Zoho-side systems

These are configured in Zoho and called from Zoho functions. They are listed so their existence is known. This repository does not interact with them.

SystemUsed for
Zoho CampaignsParent and prospect mailing lists
MYOB AccountRightSupplier records for hired coaches
An external PHP serverSMS sending and reports from Zoho's daily functions

Source map

ConcernLocation
API root and webhook URLstheme/config/settings_schema.json groups ASC - Membership Pass and ASC - Webhooks, values in theme/config/settings_data.json
Window globals for those URLstheme/layout/theme.liquid, theme/layout/theme.product.liquid
Browser callssrc/js/custom.js, src/components/
Full request listStorefront requests
Accounts and ownersExternal systems

On this page