The problem
Meditation apps assume audio is the only medium. For a real subset of users — teachers, facilitators, therapists, anyone who runs sessions for groups — what they actually need is the script. We built a service for the people who deliver meditation, not just consume it.
What we built
A library of guided meditation scripts organised by length, theme, audience (adults, kids, couples, groups), and tone. Subscribers get unlimited reads and downloads; non-subscribers can sample. The frontend is Next.js with static generation for browsing and server rendering for the gated reading experience. The backend is FastAPI on Postgres with Redis for caching and a clean Stripe subscription lifecycle (trial, active, paused, cancelled, refunded).
The automation angle
The interesting automation is the funnel: cohort-aware lifecycle emails through Brevo, a churn-aware win-back flow, and a usage report that tells subscribers which scripts they read most so renewal feels obvious. None of it requires AI — it requires being honest about what subscribers actually do with the product.
Subscription state is driven entirely by Stripe’s webhooks, not by anything the client asserts. The app never trusts a “user says they paid” signal; it waits for customer.subscription.* events and updates access from there, which is the only way trial-to-paid, pause, and cancellation stay consistent when a card fails silently in the background or a subscriber cancels from Stripe’s own billing portal rather than inside the app. Redis sits in front of the content library so the gated reading experience doesn’t re-check entitlement against Postgres on every page view — entitlement changes rarely, reads happen constantly, and the cache only needs to be right, not instant.
How it’s used
- Yoga and meditation teachers sourcing scripts for studio classes.
- Therapists using grounding and visualisation scripts in client sessions.
- Corporate facilitators running short pre-meeting decompression scripts.
What it taught us
That a Stripe trial is the easiest place to lose a customer. Removing one input from the trial signup — we made the email optional during the first three days — lifted trial-to-paid conversion by a meaningful amount. The lesson generalises across every paid product we run.