Selected work / 01
Jocassee Rewards
One engagement, end to end, for Jocassee Hydration & Aesthetics — three medspa studios across Seneca, Clemson, and Salem, South Carolina. We refreshed the brand, designed the loyalty program, and architected, designed, and built the platform that runs it: every visit earns Drops — redeemed in studio today, with booking-link promo codes planned — from a portal that lives on the member's phone.
The identity
A lake, distilled into a system.
We refreshed Jocassee's identity from the lake up: a tall custom wordmark, two blues drawn from the water, a restrained peach, and a wave taken from the negative space between the two S's in “Jocassee” — then carried that system, intact, through the loyalty program and into every product surface.
Reward the routine.
We set DM Serif Display for headings and standalone lines — an ownable, unhurried voice for a wellness brand — and DM Sans to keep body copy, forms, and dense product UI plainly readable at small sizes. Both are open faces available through Google Fonts: dependable to deliver, effortless to hand off, and self-hosted here for performance.
Sans semibold caps for labels & CTAs
A lake-connected sense of place.
- Deep BluePrimary · #15293f
- Blue SkyPrimary · #aed3e2
- Off-WhiteNeutral · #fefdfd
- SilverNeutral · #d9dadc
- Dusty PeachAccent · #eaa18b
- Ink BlackNeutral · #010413
- Deep BluePrimary surfaces, the balance card, and every confident CTA.
- Blue Sky & its tintsSection fields, badges, and the quiet spaces between content.
- Dusty PeachSparingly — birthday moments, best-value flags, the active tab.
- DM Serif DisplayGreetings and standalone lines; the calm voice of the portal.
- The waveHorizontal, low-opacity texture that never outranks content.
- Brand — Voortgang
- Strategy, identity system, art direction
- Product — Voortgang
- Loyalty-program strategy, UX/UI, design system
- Engineering — Voortgang
- Architecture, front-end & backend, Square · Twilio · Supabase integration
The program
Loyalty a front desk can run.
- Earn
Every visit becomes Drops
Members earn Drops automatically from Square-checkout visits — accounts come from real activity, not sign-up forms. One Drop per dollar, with 100 Drops worth $5 in rewards.
- Redeem
Short codes, in studio and beyond
A member taps a reward and gets a short code, good for 14 days. Today the desk applies it at checkout; next, the same code is planned to work as a promo code when booking through the Square booking link.
- One account
Unified across three studios
Earn at Seneca, redeem at Salem: the balance is one account across all three studios.
- Status
Shoreline, Bluewater, Deepwater
Qualifying visits over a rolling year set the member's tier and earning rate — 1.0×, 1.1×, and 1.25× Drops.
- Moments
Birthday and milestone bonuses
Bonus Drops mark the member's birthday month and every tenth qualifying visit.
- Referrals
Two-sided invitations
Members share a link; when a friend books and visits, both sides are rewarded.
The program, on paper.
The original launch blueprint we wrote for the program — mechanics, portal surfaces, and rollout — as first presented to the studio. The roadmap has since grown: reward codes are planned to double as promo codes in the Square booking link.
The architecture
Three inputs. One platform.
The identity, the program mechanics, and the technical spine were designed together — and they meet in one system. Open a decision to see why it was made.
Identity & access
Sign-in is a phone numberSupabase Auth + Twilio Verify, no passwords
Patients already book at Jocassee through Square using their mobile number — so the phone is the identity key the business runs on. A one-time code through a managed verification rail matches that existing behavior, adds no password to remember or reset, and joins the member to their Square history at every boundary.
Unknown numbers create nothingAccounts come from real activity, not forms
Signing in with a number Square has never seen creates no account — there is nothing to farm. Membership originates from real studio activity, so when a member first confirms who they are, their Drops are already waiting.
Commerce
Two systems of recordSquare owns commerce · Postgres owns loyalty
Square stays the source of truth for bookings, checkout, and payments; the platform's Postgres is the source of truth for Drops. Neither system pretends to own the other's facts, which keeps every reconciliation honest and every integration boundary explicit.
The order is the earn unitNever the payment
A split bill produces several payments for one order. Earning on the order — not on payments — means paying with a card plus a gift card can never double-award Drops, and refunds claw back against the same unit they awarded on.
No webhook is trusted onceDurable inbox · backstop · nightly reconciliation
Signature-verified Square events land in a durable inbox and are processed asynchronously; a five-minute backstop recovers anything missed, and a nightly reconciliation squares the books against Square itself. Loyalty math never depends on a single delivery arriving.
Loyalty spine
The ledger only appendsBalance = the sum of its history
Drops are never edited in place: every earn, hold, redemption, and bonus is an appended entry, and per-member changes serialize under a row lock. The balance is always the sum of an auditable history — race-safe by construction.
Platform
One app, every surfaceNext.js on Vercel · Drizzle-typed data layer
Members, the owner's admin, and machine endpoints live in one Next.js app on Vercel — one deploy, one design system, one typed data layer. Authorization sits at the data-access boundary, and only minimized projections of Square data are stored, keeping the sensitive surface small. The portal itself installs from the browser: phone-first, no app store in the way.
The portal, assembling itself.
Identity, program, and spine working as one product — a loop through the overview dashboard, the reward menu, and a redemption code, each screen converging from its parts. Interfaces shown with synthetic member data.
The build
Square counts the money. The portal counts the loyalty.
- 01
Designed against the real front desk
Short redemption codes were shaped around how the desk already works: a member reads a code, staff apply the reward inside the Square checkout they use every day — no new hardware, no second screen. The same codes are planned to carry into Square's online booking as promo codes.
- 02
One design system, brand to build
The refreshed identity ships as the product's design system — the palette, the DM faces, and the wave live as tokens and components, so the portal is the brand, not a themed template.
- 03
Money math, proven in tests
Earning, holds, clawbacks, and redemption land in pure, unit-tested modules before they touch a database — the arithmetic that moves Drops is verified on its own.
Built in Jocassee's own visual language — deep lake blues, warm peach, serif display type — carried from brand into product.
