PAUL & JOE BEAUTÉ HK
A Shopify storefront for a French beauty brand's Hong Kong market - a customised Dawn theme with gift-with-purchase, a member zone and campaign pages, backed by a small back-office I now maintain.

- Role
- Shopify theme developer
- Year
- 2026
- Stack
- Shopify
- Liquid
- Dawn 15
- JavaScript
- Tailwind CSS
- Shopify Admin GraphQL
- PHP
- React
- Vite
- What I did
- Customised Dawn theme: header with mega-menu and search, product gallery, cart, footer
- Gift-with-purchase engine in Liquid and cart AJAX with tiered gift thresholds
- Member zone: registration, personal details, marketing preferences and order history posting to the back-office
- Campaign templates: brand story, primer category, seasonal collection, in-store redemption with floating CTA
- Homepage modules: hero slider, collection slider, featured banners, video banner, ticker
- Maintenance of the PHP back-office and React dashboard: order sync, customer forms, birthday mailer, webhooks
Overview
PAUL & JOE BEAUTÉ sells in Hong Kong through a Shopify store in Traditional Chinese. The brand needed more than a stock theme: a mega-menu for its product lines, a gift-with-purchase mechanic that runs during promotions, a members' area that talks to its own CRM, and landing pages for seasonal campaigns and in-store events.
The storefront starts from Shopify's Dawn and keeps its structure, so the brand team can still edit every page from the theme editor. Behind it sits a small back-office that syncs orders and customers, sends birthday discount codes, exports spreadsheets and receives the forms the storefront posts.
Dawn, customised
Rather than fork Dawn wholesale, I kept the base and added suffixed variants of the sections that needed to change: a header with a bespoke mega-menu and search box, a product page with a carousel gallery, a cart that understands gift lines, and restyled collection, multicolumn and image-with-text sections. Upstream Dawn stays traceable, and the editor keeps working for the brand team.
Homepage modules are hand-written: a hero slider, a collection slider, featured banners, a video banner and a revolving message bar - all driven by section settings so the team can swap campaigns without a developer.

Gift with purchase
Promotions give a free gift once the cart passes a threshold, with a better gift at a higher tier. The buy-button snippet recomputes the cart total excluding gift lines, then adds or swaps the right gift variant through Shopify's cart AJAX API on every change - so the gift is always correct, never double-counted, and disappears if the customer drops below the threshold.

Member zone and campaigns
The member zone is a set of custom page templates - registration, personal details, marketing preferences, order history - whose forms post to the brand's back-office rather than Shopify's account pages, so the CRM stays the source of truth for consent and birthdays.
Campaign work is a template each: brand story, primer category, a seasonal collection page, and an in-store redemption event with its own showcase slider, video, pre-footer and a floating register button. The redemption form validates on the client, then the back-office deduplicates entries, enforces the deadline and emails a confirmation.


Keeping the back-office running
The back-office is a plain PHP service with a Vite and React dashboard: JWT-authenticated admin users, order and customer sync via the Admin GraphQL API, XLSX exports, a birthday mailer that mints a Shopify discount code per customer, and webhooks for customer creation and restocks. I inherited it and handle fixes, the redemption flow and the customer-form changes the theme depends on.