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.

Client
Jocassee Hydration & Aesthetics
Scope
Brand refresh · Program strategy · Architecture · UX/UI · Front-end & backend
Platform
Installable phone-first web portal
Stack
Next.js · Vercel · Supabase · Drizzle · Square · Twilio

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.

The refreshed Jocassee Medspa primary wordmark — white on Deep Blue
Primary lockup / Deep Blue fieldClearspace: the width of the E
Type system

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.

  1. Deep BluePrimary · #15293f
  2. Blue SkyPrimary · #aed3e2
  3. Off-WhiteNeutral · #fefdfd
  4. SilverNeutral · #d9dadc
  5. Dusty PeachAccent · #eaa18b
  6. Ink BlackNeutral · #010413
The supporting J mark, Deep Blue on Blue Sky
The supporting J — used sparingly, with clearspace of its own width.
From identity to interface
  • 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.

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.

Original launch blueprint · 10 pages · PDF · 0.7 MB

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
Why

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
Why

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
Why

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
Why

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
Why

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
Why

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
Why

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.

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

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

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

Back to selected work