CCWork
CC
Email me

Work

Wildtide

Bookable expeditions for Wildtide Crew on Shopify, without a bookings SaaS. Trip dates are variants, so Shopify's own inventory enforces capacity, and trips are paid as a deposit, then the balance.

Role
Solo designer, builder and operator
When
2026
Client
Wildtide Crew, independent
Stack
Shopify Liquid (OS 2.0), Metaobjects and metafields, Admin GraphQL, Remix 2.8, React 18, Polaris 13.9, and 6 more
Status
Live ↗
wildtidecrew.com
Wildtide Crew home page: a freediver gliding through blue water under the headline "Elevated experiences. Wild times."
Wildtide Crew home page, Aug 2026.

Context

Wildtide Crew runs small-group ocean expeditions and sells underwater photography. Shopify is good at selling things in boxes. It has no idea what a trip date is, what capacity means, or how to take a deposit now and the balance closer to departure. The usual answer is a bookings SaaS bolted on the side, with its own database, its own checkout and a sync job between them.

I wanted Shopify itself to be the booking system.

What I built

I designed, built, deployed and maintained it alone, as an independent contractor.

  • An embedded Shopify app (Remix, TypeScript, Polaris) where the merchant writes expeditions, trip dates, galleries and reviews. On install it provisions the metaobject and metafield definitions it needs, checking what already exists first, so a re-install or a half-finished setup converges instead of failing.
  • Each trip date becomes a variant on the expedition's deposit product, with inventory equal to its capacity. When a trip is full, Shopify stops selling it.
  • A paid-order webhook works out the outstanding balance and due date and stores them on the order. The merchant sends the balance as a Shopify Draft Order invoice, and a second webhook marks the original order paid when it clears.
  • A custom Online Store 2.0 theme renders any number of expedition pages from a single dynamic template and its sections, reading the app's data directly in Liquid.
  • There's also a media picker built on Shopify's staged uploads, health checks with one-click repair of broken links between pages, products and variants, GDPR webhooks, and a move from SQLite to Neon Postgres for sessions.

The same platform also runs a second client's build, a black-and-white editorial theme layer with scroll-driven sections.

wildtidecrew.com
Wildtide Crew expeditions: cards for Sardine Run and Mobula Ray Migration, the expedition calendar and an ocean photo strip
The calendar and the cards read the same metaobjects the admin app writes. Photography: Wildtide Crew.

Key decisions

All the domain data lives in Shopify metaobjects and metafields, and the app stores nothing but sessions. The app writes and the theme reads. Nothing on the storefront calls back to the app server, so a slow or sleeping app can't take the shop down.

Using inventory for capacity means there's no custom sold-out logic to get wrong, though the page itself doesn't show a sold-out state beyond what Shopify's checkout does.

Sea lions diving through a dense school of sardines in sunlit blue water
Expedition photography. Photography: Wildtide Crew.

Result

It's live for Wildtide Crew. Expeditions, trip dates and deposits all run through a stock Shopify checkout, with no third-party bookings service.

Screenshots

  • Striped marlin hunting in open blue water below the surface
    Expedition photography. Photography: Wildtide Crew.
  • A dense school of mobula rays gliding together in deep blue water
    Expedition photography. Photography: Wildtide Crew.

My part

I configured Dawn's stock features (faceted filtering, the print product tabs and lightbox, localization) rather than building them. The gallery-to-print and booking-questionnaire snippets are prototypes that aren't wired to a live template. There's no background scheduler, so balance reminders are resent by hand and overdue status is worked out when the page renders. I built it with an AI coding agent (Claude) under my direction, with the design constraints written down in the repo. Wildtide Crew’s art in the screenshots is used with permission.

Questions