--- title: "PackPass: class packs, bookings and waitlists for a yoga and Pilates studio" author: "@chris" author_url: https://elements.dev/users/chris published: 2026-09-30T22:17:58.636Z url: https://elements.dev/demos/03t8jt3s/packpass-class-packs-bookings-and-waitlists-for-a-yoga-and kind: post format: article --- # PackPass: class packs, bookings and waitlists for a yoga and Pilates studio by [@chris](https://elements.dev/users/chris) ยท 2026-09-30 ## Description Class packs and memberships by card, a weekly schedule with spots left, waitlists that book the next member, and live rosters. PackPass needed class credits and a monthly membership paid by card, a schedule that counts spots as members book, waitlists that fill themselves, reminder emails and live rosters for the front desk. Each of those is a part of Elements, so the agent spent its 21 minutes on the studio itself. **What Elements gave the app** - **Live schedule and rosters.** The schedule, each member's bookings, the class rosters and the member list are LiveTables. Spots left, the front desk's roster with its check-in boxes and each member's credits update the moment anyone books or cancels. - **Waitlists that book the next member.** Booking locks the class first, so the last spot goes to exactly one member and a full class puts the next one on the waitlist. When someone cancels, the first member on the waitlist who can still pay gets the place and an email saying so. - **Packs and memberships by card.** Members buy a class pack or a monthly unlimited membership through Stripe. Credits are granted when the member returns and again when Stripe's webhook arrives, once either way. Until a Stripe key is set, the pay buttons open a test checkout inside the app that records the purchase the same way, and in production the app registers its own webhook on the first checkout. - **Server calls as function calls.** Booking, cancelling, check-in and buying a pack call server functions straight from the page with `@rpc`. - **Background work.** A one-line cron schedule checks every five minutes for classes two hours out and queues a reminder email job for each booked member, and a member who comes off the waitlist gets an email the same way. - **Data and roles from SQL.** Migrations define the studio and seed a staff login, three instructors, a week of classes, eight members and a full Reformer class with a waitlist. Sessions and one staff guard keep the studio pages with the staff. **What the project server gave the agent** The project server runs alongside the agent and answers as soon as a file is saved: it type-checks the templates, TypeScript and SQL, applies migrations and reruns the tests, so every question came back right away and the agent kept building. **What shipped** The app type-checks with zero errors and all 46 tests pass. Every page works on desktop and phone. A real sandbox payment went through Stripe end to end.