90° Angle 90° Angle 90° Angle 90° Angle Angle · Studio
DWG-04 · Web app · 2023

Tessellate

Payments, waivers and class scheduling for a chain of climbing gyms — the lot, in one place.

Client
Climbing gym chain (4 sites)
Engagement
Web app · fixed price
Timeline
8 weeks, brief to live
Stack
TypeScript · Go · Postgres · Stripe
01 / Brief

Three tools, none of them talking.

The gyms took class bookings in one app, payments in another, and waivers on a clipboard. Front desks reconciled it by hand, double-bookings were normal, and nobody could answer "how full is Tuesday's 6pm?" without three tabs.

The brief was narrow on purpose: one place to book a class, pay for it, and sign the waiver — across all four sites. Not a CrossFit-sized platform. The three jobs that actually hurt, joined up.

02 / Build

One booking, start to paid.

A member picks a class, pays, and signs the waiver in one unbroken flow — and the front desk sees the same truth in real time. Capacity is enforced at the database, so two people can't take the last spot, and a waiver is never missing when someone walks in.

Fig. 2 — Booking flow. Spot held, paid, signed — or it doesn't count.

Stripe handled cards and memberships; the schedule, capacity and waivers were one Postgres model so the four sites shared a single source of truth instead of four diverging ones.

03 / Detail

The desk had to trust it.

The win wasn't the booking screen — it was the staff view: who's checked in, who hasn't paid, who hasn't signed, refreshing live. Once the desk trusted the screen over the clipboard, the clipboard went in the bin.

Fig. 3 — Desk view. Checked in, paid, signed — at a glance, live.
"The clipboard's gone. Nobody misses it."
— Operations lead, Tessellate
8 wks
Brief to live, fixed price. No overrun, no change orders.
4 sites
On one shared schedule and one source of truth.
0
Double-bookings since capacity moved into the database.

Have something narrow and real?

That's exactly the kind of brief I like. Two slots open for Q3.

Start a project