ZaZa Silks
An online store for a Perth bonnet brand, dressed in its own photos and film, where every bonnet turns over on a lit switch to show its other side.
Overview
ZaZa Silks is a Perth brand of hair bonnets, sold online, and C4 built its store. There are three bonnets. Each one is reversible, with a print on one side and a solid colour on the other. The site is dressed in the brand’s own shoot, and its film fills the first screen, with ZAZA across it in the colour of whichever bonnet is on screen. Each bonnet gets a screen to itself, and a lit Print and Solid switch turns its photo over. The words are the brand’s own, from the product facts to the care and returns lines. Checkout is Stripe’s hosted page, on the owner’s own Stripe account, so card details never touch the site and payouts go to the business. Orders and stock live in a Supabase database in Sydney. Every order is checked to the cent against the shelf price, and a job matches Stripe’s payments to saved orders every 15 minutes. The order emails match the store, set out like a hotel’s turndown card. Shipping is free Australia-wide. The store went live on its own domain on 30 October 2026.
Screenshots
The photos and the film in these screenshots are ZaZa Silks' own.
What I Delivered
- The store: a home page, a shop page, a page for each bonnet, the bag, and pages for shipping, returns and care, and privacy
- Checkout on Stripe’s hosted page, on the owner’s own Stripe account
- Orders and stock in a Supabase database in Sydney, with stock taken as each order is saved
- Order emails for the customer, the owner and C4, set out like a hotel’s turndown card in the store’s own look
- A job every 15 minutes that matches Stripe’s payments to saved orders
- Free shipping Australia-wide, shown on the site and at Stripe’s checkout
- A privacy page written from what the site actually does, approved by the owner
- Product data for Google on each bonnet’s page, with live stock
- Link previews for the store and for each bonnet
Key Features
- The brand’s own film on the first screen, with ZAZA across it in the colour of the bonnet on screen, changing on every cut
- A lit Print and Solid switch on every bonnet that turns its photo over
- Print side first, everywhere a bonnet appears
- A swatch card of all six sides beside the range
- Each bonnet’s photo flicks through a burst of frames as it scrolls into place
- A crew photo with a tag on every bonnet, each one linking to it
- Live satin under every page, drawn in WebGL once the page is idle and lit low so the type keeps its contrast
- Up close pages with a photo gallery, and the facts folded under Description
- A bonnet that sells out is marked in the bag, and checkout waits until it’s taken out
- Names in Prata and controls in Oswald, the two faces of the brand’s logo, with Sofia Sans for reading
- When a phone won’t autoplay the film, the first tap starts it
Stack & Tooling
- Next.js 16 (App Router)
- React 19
- TypeScript
- Tailwind CSS v4 and shadcn/ui
- Stripe Checkout and the Stripe Node SDK
- Supabase (Postgres) in Sydney
- Resend for the order emails
- GSAP only in the C4 footer credit
- Vercel hosting, with the server functions pinned to Sydney
Integrations & Backend
- Stripe Checkout, created on the server from the store’s own catalogue prices
- A signed Stripe webhook that saves each order and takes its stock in one database function, and has Stripe retry if anything fails
- Refunds and disputes recorded against the order
- Supabase with row level security on every table, written to only through server-side functions
- Resend, sending from the store’s own domain
- A health check that covers the whole path an order takes
- Vercel Web Analytics
- C4 Studios footer credit
Performance / SEO / Accessibility
- Lighthouse mobile on the live home page, 30 Oct 2026: 87 performance, 100 accessibility, 100 best practices, largest paint 3.3 s, no layout shift
- axe found no accessibility violations on eight pages at 375 and 1280 px in the launch rehearsal
- Security headers on every response, HSTS and a frame ban included
- 13 store tests, run against the database migration with Stripe-signed events
- A real order on a real card before launch, then a refund, with the total matched to the shelf price to the cent
Challenges & Constraints
- Making sure payments and orders can’t drift apart: Stripe retries until each order is saved, and a job checks payments against orders every 15 minutes
- Keeping tax out of the code: prices are entered as the shelf price, and nothing is added on top
- Making the brand’s photos do more than sit on the page: bursts of frames flick by as each bonnet arrives, and the crew photo works as a shop window
- A store the owner never has to log into. C4 runs it, and the owner packs and posts each order
- Launching without reviews. None have been collected yet, so the store shows none
What I'd Improve Next
- A journal section for the monthly articles
- Tracking emails when an order is posted
- Reviews, word for word and with each reviewer’s permission, once customers send them