Approach · Climbing gym software

Shared Memberships

One membership for a family or group, where every seat has its own price, rules and assigned person.

Role
Product Designer
Team
Design lead, product designer, PM and engineering leads
Surfaces
Admin app, front desk sales and customer portal
Timeline
Sep 2025 to Feb 2026
Shared membership page in the admin app, listing members grouped into adults, kids and seniors, each with a seat order, status and price
A shared membership in the admin app. Members are grouped by classification, and each row is a seat with its own order, price and person.

Problem

When one person bought memberships for a family, the system didn’t clearly connect each membership, or its agreement, to the person actually using it.

What I did

Designed the full lifecycle: customer classifications, the pricing chart builder, seat selection at checkout and seat management after purchase.

Result

A single membership per group where every seat has a classification, a price and an owner, and staff can change seats without rebuilding the plan.

Context

Families and groups often climb together, and gyms want to sell them one plan with different prices for adults, kids and seniors. The person who pays is often not the only person who uses the membership, and sometimes not a user at all.

That gap between who pays and who climbs touches everything: pricing, check-ins, billing and the legal agreements each member has to sign.

The problem

  • Unclear ownership. A purchaser could buy for several people, but each membership wasn’t explicitly linked to the person assigned to it.
  • Agreements without a clear signer. Staff and customers couldn’t tell which family member still had to sign, whether at the front desk, at the kiosk or by email.
  • Checkout doubts. Purchasers weren’t sure discounts were applied correctly on multi-person purchases.

Constraints

  • Same logic everywhere. Selecting, assigning and signing had to work the same in the admin app, front desk sales and the customer portal.
  • Minors can’t sign. An adult purchaser or guardian has to sign agreements on behalf of kids.
  • Existing components. Screens had to use the current component library (based on Material UI), with standard controls instead of new custom ones.
  • One person per document. The backend expected each agreement to be mapped to a single, named customer.

Key decisions

1. Seats as the building block

Instead of pricing a group as a whole, every membership is made of seats. Each seat has a classification (for example Adult, Kid or Senior, defined by age), a position in the sequence, a price, and whether it’s required.

This lets a gym say “the first adult pays $150 and the second $130” or “kids between 10 and 17 pay $100”, without creating a new membership type for every family size.

Discarded Fixed bundles like “family of four” at a single price. They’re simpler to sell, but break as soon as a family doesn’t match the bundle exactly.

Pricing chart for a shared membership in draft, with rows for required seats, classifications, sequence and price, and a warning that at least two required seats are needed to finalize
Pricing chart builder. Charts start as drafts, keep versions, and explain what’s missing before they can be finalized.

2. Who pays and who uses it are separate

Every seat has a purchaser and an assigned customer. A seat can be bought first and assigned later, either to someone in the purchaser’s household or to any other customer, and agreements follow the assigned person, not the purchaser.

Discarded Letting purchasers select several agreements at once and sign them in one session. It caused backend validation errors and confused people at the kiosk when more than one dependent was involved.

Assign Seat dialog with tabs for Household and Other Customer, over the members list
Assigning an open seat. Household members come first, since that’s the most common case.

3. Pricing charts as versioned drafts

Pricing changes affect people who already pay for a membership, so charts move through draft, finalize and publish, and keep earlier versions. Validation messages explain what’s missing in plain words, like the minimum number of required seats.

Discarded Editing the live price list directly. Faster for staff, but a single mistake would reach every member on that plan.

The solution

The flow covers the full life of a shared membership, from setup to day-to-day changes:

  • Setup: admins define customer classifications by age, then build pricing charts with required seats, sequence pricing, taxes and fees.
  • Selling: in the purchase flow, a seat count step shows the pricing chart next to simple counters for each classification. Required seats are already included.
  • Managing: the membership page shows a summary, members grouped by classification, check-ins and history. Staff can add, assign, reorder or cancel seats, or put the whole group on hold.
  • Reporting: the membership list shows the purchaser and the assigned customer side by side, including seats that aren’t assigned yet.
Purchase Plans wizard on the Seat Count step, with the pricing chart on the left and seat counters for Any Customer, Kid and Senior on the right
Selling at the front desk. The price per seat is visible while choosing how many seats of each type to add.
Membership list filtered to shared memberships, with separate Purchaser and Assigned customer columns and one seat marked Not Assigned
Membership list with separate purchaser and assigned customer columns.

Outcome

  • Gyms can sell one plan to a whole family, with fair prices per person and clear rules for who can join.
  • Every seat, and every agreement, points to one specific person, which removes the guesswork at check-in.
  • The flows were approved in design reviews with client leadership and the engineering leads, and moved into development.