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
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.