The trigger: every small studio owner I know (pilates, yoga, pottery, even a dog trainer) runs the operational side of their business on WhatsApp + a Google Sheet, or on one of the expensive incumbents (Mindbody/Glofox) they actively dislike. The single biggest leak is last-minute cancellations: someone bails at 6am and the seat just goes empty, because there's no fast way to notify a waitlist.
ClassKeep tries to remove that end-to-end:
- Public booking page on a free *.classkeep.app slug (custom domain optional), with a drag-and-drop page builder so it doesn't look like a generic SaaS template. - Credits, drop-ins, and recurring subscription plans, all via Stripe Connect — the studio gets paid directly, I never touch the money. - A waitlist that auto-notifies via email + web push + SMS the instant a seat opens; first tap wins. This is the part most studios told me they'd pay for on its own. - 1-tap tablet check-in for instructors so they're not fumbling with a clipboard between classes. - Bilingual (EN + pt-BR) with LGPD/GDPR self-serve export & delete.
Stack, for the curious: - Next.js 15 App Router, Server Actions for every mutation (no REST except the two auth route handlers and the Stripe webhook). - Drizzle ORM on Postgres. - Two separate Better-Auth instances — one for studio operators, one for students — so cookies and sessions don't collide on the same domain. - Stripe Connect (webhook-authoritative fulfillment), Twilio for SMS, OneSignal for push. - Tailwind v4 with a Material 3 token system.
Pricing: free for every studio during early access — no card, no per-student fees. Early signups get a permanent discount when paid tiers ship.
Genuine asks: 1. Try creating a studio and booking a class on it — does the flow feel less painful than Mindbody/Glofox if you've used them? 2. Does the waitlist mechanic feel different enough to matter, or is it table stakes by now? 3. If you run a studio (or know someone who does), I'd love to talk — email in profile.
Happy to go deep on any of the architecture (Server Actions + Stripe webhook reconciliation was the trickiest part).