Golf Slicers: building Australia’s secondhand golf marketplace on Shopify

A proper storefront for pre-loved clubs, with the flows the business runs on built custom: a bag builder, club services, and a trade-in that quotes before you take a photo.

Storefront

  • TypeScript
  • Hydrogen + React Router 7
  • Tailwind + Radix
  • Motion
  • Storefront + Customer Account APIs

Trade-in

  • Metaobjects
  • R2 for photos
  • Server-side price book
  • Resumable drafts

Admin app

  • React Router on Cloudflare Workers
  • Polaris web components
  • Admin GraphQL: gift cards + draft products
  • Resend
  • KV sessions

Measuring

  • GA4
  • Microsoft Clarity
  • Google reviews
  • Klaviyo

Project overview

Team: cofounder and technical lead, engineering end to end

Created at: golfslicers.com.au (opens in a new tab)

What I worked on:

Hydrogen storefront

Build a Bag

Club services

Trade-In wizard

Instant estimates

Shopify admin app

Used clubs in Australia lived on Gumtree, Facebook and eBay. Golf Slicers is a proper storefront for them, with the parts that make the business different built custom on top of Shopify.

Golf Slicers: pay less, play more

Golf Slicers logo

The challenge:

Shopify does the commerce basics well. It knows nothing about bundle pricing that changes as you add clubs, trade-ins that start with a photo and end in store credit, or staff valuing a submission from the admin.

So the question was: how do you keep everything Shopify does well and still ship custom flows where the business is different?

The approach:

  • Hydrogen storefront:

    Shopify’s React framework on their edge. The storefront is ours; checkout, inventory and payments stay theirs.

  • Build a Bag:

    Slot by slot, only stock that fits, and discounts that unlock as the bag fills.

  • Trade-In system:

    A store-credit estimate on the spot, photos after, and staff finishing the valuation from the Shopify admin.

  • Designing from the data:

    Clarity recordings showed where the builder stalled. Fixing those steps lifted retention 40%.

One slot at a time

Drivers, then woods, then hybrids. Each step shows only clubs that fit, and the running total follows you down the page.

Services on the club

Regrip, extend or shorten from the product page. The service lands in the cart as its own line, tied to the club it belongs to.

An estimate before a single photo

Pick the brand, model and condition, and the store credit appears straight away.

Buy more, save more

Three clubs unlock 5%, four 7%, five 10%. The tier’s discount code rides into the Shopify cart on its own.

Photos, details, review

Five angles per club, details prefilled from the account, and one review before it goes to the shop.

Find it fast

Predictive search with the popular brands up front, so a Titleist is two taps away.

Under the hood:

Hydrogen on Oxygen

A React Router storefront on Shopify’s edge, talking to the Storefront and Customer Account APIs.

A bag that survives a refresh

Selections live in localStorage for ten minutes, then clubs, services and the tier’s discount code go to the cart in one mutation.

Services as products

Grips are ordinary products in a collection, so the shop adds one by adding a product, and the default is the collection’s sort order.

A price book, server-side

Estimates come from the shop’s own listings: a Good price per model, a condition ladder, a buy margin. An unmatched model comes back TBC, never a guess.

Trade-ins as metaobjects

Each submission is a Shopify metaobject with its photos in R2, so the shop’s data stays in the shop and a draft can resume where it stopped.

An admin app for the counter

An embedded Shopify app on Cloudflare Workers: a dashboard, a status workflow, and one click that issues the gift card and drafts the listing.