
Class and Content Recommendation Engine for a 40-Studio Yoga Chain
Let's Connect
Overview
What we built
A 40-studio yoga chain kept losing members in their first months because every one of them saw the same class schedule and the same unsorted video feed, no matter how they trained. We built a recommendation engine that treats each member differently from day one.
In plain terms: whether someone was a brand-new member or had been coming for years, they received the exact same class schedule emails and scrolled the same unsorted library of on-demand content as everyone else. New instructor formats went unnoticed because nothing pointed members toward them, and the marketing team had no way to match a suggestion to a member's level, preferred style or how often they actually showed up.
We built a recommendation engine that learns from booking history and the content itself, spanning both in-studio classes and the on-demand library. It personalises the app home screen, the weekly class emails and the messages members get right after a class, with a quiz and a member's first few bookings standing in for history when there is none yet. Members who got personalised recommendations booked 31% more classes than those who did not, and first-90-day churn dropped from 27% to 19% once it rolled out across all 40 studios.
The Problem
Generic schedules driving churn
The chain's 40 studios and its on-demand video library were, from a member's point of view, one undifferentiated stream. A first-week beginner and a long-standing regular opened the same app to the same class schedule email and the same unsorted content feed, with nothing in either distinguishing what suited a new member from what suited someone who had tried every format already.
That sameness had a cost measured in disengagement. Members disengaged within their first months at the studio, the exact window when a well-timed suggestion, an easier class, a style close to what they had already enjoyed, matters most. Instead, everyone received identical messaging regardless of level, preferred style or attendance pattern.
New instructor formats were a particular casualty of the sameness. Without any way to surface them to the members most likely to enjoy them, promising new class styles simply went undiscovered inside a schedule and a content library that treated every member as the same generic audience, no matter their history or preferences.
One schedule for everyone
Every member received the same class schedule emails regardless of level, preferred style or how often they actually attended, new or long-standing.
Unsorted content feed
The on-demand video library had no personalisation layer, so new instructor formats sat undiscovered alongside everything else in one unsorted feed.
Early disengagement window
Members disengaged within their first months at the studio, the exact period when a relevant class or content suggestion would have mattered most to keeping them booking.
No signal on preferences
Marketing had no structured way to match a suggestion to a member's level, preferred class style, or attendance pattern before recommending anything.
What it was costing them
Every month the recommendations stayed generic, new members kept disengaging within their first months, promising new instructor formats went undiscovered by the people who would have enjoyed them most, and the marketing team kept sending identical class and content suggestions to members with completely different levels, styles and attendance patterns.
The Solution
Cross-studio recommendation engine
We built a single recommendation engine spanning both sides of the member experience: in-studio class booking and the on-demand video library. Collaborative filtering on booking history identified which members behaved like which other members, while content embeddings captured what each class and video actually offered in terms of style, intensity and instructor, so the two signals could recommend across both surfaces together.
Those recommendations reach members wherever they already look: the app home screen, the weekly class schedule emails and the follow-up message after a class. For members with no booking history yet, an onboarding quiz combined with their first bookings stands in for the collaborative signal, so a brand-new member gets a personalised suggestion from their very first session rather than waiting months for enough data to accumulate.
The result treats a first-week beginner and a long-standing regular as genuinely different audiences instead of the same generic one. New instructor formats can now surface to the members whose booking and content history suggests they would actually enjoy them, rather than relying on members to stumble across them in an unsorted feed.
Key decisions
Combine behaviour and content
Collaborative filtering on booking history was paired with content embeddings of class style, intensity and instructor, so recommendations reflect both what members do and what classes actually are.
Recommend across every surface
The same engine personalises the app home screen, weekly class emails and post-class follow-ups, so members see consistent suggestions wherever they engage.
Solve cold start explicitly
New members get an onboarding quiz feeding the engine alongside their first bookings, so recommendations start from day one instead of waiting for booking history to build up.
Surface new formats deliberately
New instructor formats are matched to members whose history suggests a fit, rather than left to be discovered inside the unsorted content feed.
Span in-studio and on-demand
One engine covers both class booking and the on-demand library, rather than treating the two experiences as separate recommendation problems.
Measurable Impact
What changed after launch
The engine changed how members experience the chain from their very first booking. Members receiving personalised recommendations booked 31% more classes over 90 days than a hold-out control group that kept seeing the old generic schedule, and on-demand library plays per active member increased 44% within one quarter as personalised suggestions replaced the unsorted feed.
Retention moved with it too. First-90-day member churn fell from 27% to 19% after rollout across all 40 studios, and weekly class email click-through rose from 6% to 15% once the line-ups behind those emails became personal instead of identical for every member on the list.
Class recommendations
Same schedule emails sent to every member
Personalised recommendations, 31% more classes booked
Member churn
First-90-day churn holding at 27% chain-wide
First-90-day churn down to 19% chain-wide
Content discovery
Unsorted feed, new formats went undiscovered
Library plays per active member up 44%
Email engagement
Weekly email click-through sitting at 6%
Click-through risen to 15% with personalisation
Headline results
Members receiving personalised recommendations booked 31% more classes than a hold-out control group over 90 days
First-90-day member churn reduced from 27% to 19% after rollout across all 40 studios
On-demand library plays per active member increased 44% within one quarter
Weekly class email click-through rose from 6% to 15% with personalised line-ups
Tech & Tools Used
What powered the build
Every tool below earned its place in this engagement. Here is the part each one played.
Python (FastAPI)
Serves the recommendation API that the app, email system and post-class follow-ups all call to fetch a member's current personalised suggestions.
PyTorch
Trains the content embedding models that represent each class and video by style, intensity and instructor, feeding the recommendation engine's content side.
scikit-learn
Powers the collaborative filtering models built on booking history, identifying which members behave like which other members for the behavioural side of recommendations.
PostgreSQL
Stores booking history, member profiles and onboarding quiz answers, the structured data both the collaborative and content-based models draw on.
Redis
Caches each member's current recommendation set so the app home screen, emails and follow-ups can fetch suggestions without recomputing them on every request.
Apache Airflow
Schedules the pipelines that refresh booking history, retrain the embedding and collaborative filtering models, and republish updated recommendations.
React Native
Renders the personalised app home screen where members see their class and content recommendations first, ahead of anything else in the app.
Node.js
Runs the services that assemble weekly class emails and post-class follow-up messages using recommendations pulled from the engine.
Braze
Delivers the personalised weekly class emails and post-class follow-ups to members, replacing the identical line-ups everyone used to receive.
Ready to Build your Fitness & Wellness Business with Recommendation Engines
Ask Byte
Ask Byte
Typically replies instantly
just Now
Hi! I'm OrganByte's assistant. How can I help you today?
AI-generated content may be incorrect

