TuneClub logged 48,100 minutes of tracked practice and now earns recurring revenue

Learning traditional Irish music was scattered across half a dozen tools and nothing joined them up. RaftLabs built TuneClub as one platform: structured practice, creator feedback, community, and a creator-led subscription model that survives Apple and Google review. Two years and four releases in, learners have logged 48,100 minutes of tracked practice. The community features we spent real money on are the part that hasn't worked yet, and this page says so.

minutes of tracked practice logged by learners to date
48,100
average practice per active learner over the last 90 days
16+ hrs
still building, across four releases and a second client project
2+ years

Short answer

RaftLabs built TuneClub, a creator-led learning platform for traditional Irish music, across two-plus years and four releases. It runs as a Flutter mobile app for learners and a React web portal for creators and admins, on a Hasura, AWS, and RevenueCat stack. Learners have logged 48,100 minutes of tracked practice, with average practice time above 16 hours per active user over the last 90 days, 100+ learners, and roughly $230 in monthly recurring revenue within weeks of subscriptions launching. RevenueCat was used as a durable transaction store and gateway rather than for its entitlement system, which let creators define their own named pricing tiers without an App Store review for each new offering. Two planned features, AI practice feedback and low-latency group jamming, failed feasibility and were not built.

Engagement

The TuneClub engagement

Client
TuneClub, an Irish platform for learning traditional Irish music, roughly 3 to 7 people at the time of engagement
Decision-maker
Gabe Moynagh, founder. Also a co-founder at a cybersecurity firm. Focused on outcomes rather than implementation
What we owned
The whole product. Flutter learner app, React web portal for creators and admins, backend, payments, and infrastructure
Delivery
Roughly 48 weeks of product work across two-plus years, in four named releases plus patch and support runs
Team
One PM, one full-stack engineer, one frontend engineer, one mobile engineer, with a product owner role shared informally
Engagement
Dedicated team, phased by release, with idle periods between phases
Status
Live and still being built. The engagement also produced a referral that became a second client project

The situation

Learning traditional Irish music was not short of tools. That was the problem. A learner kept tune recordings in one place, a slowed-down practice track in another, a tutor's notes somewhere else, and the thing they were actually working toward, a session or a workshop, in a WhatsApp thread. Nothing joined up.

And beneath the fragmentation sat the problem every music teacher knows: progress becomes invisible. A learner practises for weeks, nobody can see it happening, and they quietly disappear. Music schools don't lose students when lessons get worse. They lose students when progress becomes invisible.

For Gabe Moynagh, who runs the platform and had the cause long before he had the product, that fragmentation had a commercial edge to it too. With no single platform there was no clean way to see what the thing earned. No recurring revenue. Bookkeeping by hand. And for creators, the people who make the content the whole product depends on, no way to sell anything without it becoming somebody's admin job.

He came to us with a design from a previous attempt and a clear idea of the outcome. The design was the first thing we changed.

What followed was not a 12-week build, and an earlier version of this page said it was. TuneClub has run roughly 48 weeks of product work across two-plus years, through V1, V1.5, V2, and V2.5. The first release took 12 to 16 weeks and was deliberately modest: enough of a product to tell us whether people would actually practice. They did. That answer is what paid for V2.

TuneClub creator-led learning platform for traditional Irish music

Before and after

What changed, and what still hasn't

Before
  • Learning scattered across half a dozen unconnected tools, with nothing holding a learner's progress in one place
  • No monetisation path at all, so no recurring revenue and no reliable way to see what the platform earned
  • Manual bookkeeping, and a creator experience that made selling anything an administrative chore
  • An information-dense design inherited from an earlier attempt, pitched above the age band the product actually needed to serve
  • No structured route from private practice to a real session, workshop, or performance
After
  • One platform holding structured content, practice tooling, submissions, creator feedback, and community
  • A creator-led subscription model with internally managed tiers, so a creator can launch a new offering without an App Store review cycle
  • 48,100 minutes of tracked practice and the highest daily return rate of any product we run
  • Recurring revenue from week one of V2 pricing, plus a partnership that put roughly 50 learners on prepaid annual plans
  • A design simplified over several rounds until a wide age band could use it without instruction
  • Community channels that exist, work, and are used far less than we expected. That one is unresolved

The problems worth reporting

  • Creator-defined pricing, inside app stores that want to approve every SKU

    This is the hardest problem on the project and the least visible from outside. TuneClub is creator-led. A creator should be able to launch an offering, name their own tier, and price it, without RaftLabs deploying anything and without Apple reviewing anything. App stores are built on the opposite assumption: products are defined up front and reviewed.

    We had a hard launch date, so building a billing layer directly on the store APIs was off the table. We chose RevenueCat, and then used it in a way it is not usually used: as a durable transaction store and gateway, with its own entitlement system deliberately left out. Entitlements are ours, modelled around creator-defined tiers that map onto a fixed set of internally managed SKUs. A creator names and configures their offering inside the platform; the store only ever sees the SKUs it already approved.

    Worth saying plainly: the delivery lead argued against RevenueCat at first, having never seen it used this way. The call came from our side of the table and it was the right one. Building on raw store APIs would have been a time sinkhole, and the stores have historically changed those APIs without asking.

  • Building for flexibility we could not yet describe

    The recurring tension across two years was immediate rigidity against eventual flexibility. There was one creator at launch, first-party, and an eventual ambition of many. Every modelling decision had a now-answer and a later-answer, and they often contradicted each other.

    V2 is where that bill came due. Assumptions baked into V1 became actively unhelpful in V2, and the backend absorbed most of the damage. TuneClub had the longest brainstorming phase of anything we have built, roughly seven to nine weeks before V2 implementation started, precisely because we were trying to settle those contradictions on paper rather than in migrations.

    Asked what he would change, the delivery lead was specific: stop building hard database models around entities that turn out to be containers. Build a labellable container that arbitrary things can be stashed into, and resolve the meaning later. That is the retrospective we would hand to anyone starting a creator platform where the catalogue shape is genuinely unknown.

  • Audio practice tools that stay responsive on an average phone

    Pitch shifting, tempo control, looping, and in-app recording are heavier than video playback and they run on whatever phone the learner owns. A glitch mid-practice does not read as a bug to a musician, it reads as the app breaking their concentration.

    The Flutter app carries a media abstraction layer so the practice tools sit above platform-specific playback rather than inside it, which is what let the underlying audio implementation change without the feature layer changing with it. Video delivery went to Mux for adaptive streaming, thumbnails, and captions, so engineering time went into the practice tools rather than into media infrastructure.

    The product started life as a prototype with a file picker and a couple of playback controls. Nobody on the team predicted how far the tooling would eventually go, and that under-estimate is worth naming.

  • Two features that failed feasibility and were not built

    The client arrived with a recommended partner for AI practice feedback: a third-party music AI service that would listen to a learner's recording and assess it. Early feasibility work showed it could not deliver usable results reliably enough to ship behind a paid product. We did not build it. An alternative approach is being planned now.

    The second was low-latency group jamming, musicians practising a piece together over the network in real time. We ran the feasibility study. On a good WiFi backhaul and an average phone, round-trip latency lands around 180 to 200ms. That is fine for a meeting and useless for playing in time with someone. The physics did not care how much we wanted it, so it is not in the product.

    Both were real ambitions, both had client enthusiasm behind them, and both were killed by evidence rather than by budget. We would rather publish that than a feature list of things that worked.

the build

How the platform was built

  1. A creator-led subscription economy the stores will actually approve

    Tiered subscriptions, with creator-defined names and offerings mapped onto a fixed, pre-approved set of internally managed SKUs. RevenueCat handles the transaction and the store relationship; entitlement logic is ours. The practical effect is that a new creator offering goes live the same day rather than waiting on an App Store review, which is the difference between a creator economy and a catalogue we maintain on their behalf.

    TuneClub creator-defined subscription tiers and offerings
  2. Practice tools built into the lesson, not beside it

    Metronome, pitch and speed control, track clipping, personal notes, and in-app recording all sit inside playback. A learner slows a difficult passage, transposes it, loops eight bars, and records the result without leaving the track. Notes and recordings stay attached to the track that produced them, which is what makes practice history mean anything later.

    TuneClub practice workspace with metronome, pitch and speed control
  3. Submission and creator review, in one loop

    Learners record and submit; creators review in the web portal, answer the custom feedback questions configured for that pathway, and approve or ask for another take. Creators are musicians and community leaders, not people who wanted a second admin job, so the review screen was built to be fast rather than thorough-looking. The learner sees the decision in the mobile app immediately.

    TuneClub learner submission and creator review workflow
  4. A design rebuilt for the age band that actually shows up

    The concept we inherited was extremely information dense. It took several rounds with our designers to get it to something a wide age band could use without learning the ropes first, and we are still tweaking it. This was the first thing we pushed back on and it was not a small piece of work. Community channels, announcements, and per-category notification controls live inside the same simplified shell.

    TuneClub simplified learner interface and community channels

Proof

What the platform has actually produced

Figures come from RaftLabs internal dashboards, Firebase, RevenueCat, and Stripe, reported by the delivery lead. The revenue figures are quoted in the currency they were reported in, which is why dollars and euros both appear.

ResultWhat changedPeriod or contextEvidence and limitation
Tracked practice48,100 minutes loggedCumulative across all learners since launchInternal tracking. This replaces the '200+ practice sessions in 60 days' figure the previous version of this page carried, which the delivery lead flagged as outdated
Practice per active learnerAbove 16 hoursAverage over the trailing 90 daysInternal dashboards. TuneClub has the highest daily return rate of any product we run, because people open it to practise rather than to browse
Learners100+Since launchInternal tracking and Firebase. Before the build there was no platform and therefore no baseline to compare against
Recurring revenueRoughly $230 per month and climbingWithin weeks of subscription pricing going live in V2RevenueCat and Stripe. Small in absolute terms and reported as such. The point of the number is that recurring revenue existed at all, where previously none could
One-time revenueRoughly EUR 6,000, plus around 50 prepaid annual learnersThrough a partnership arrangementStripe and internal records. The prepaid cohort arrived through a partnership rather than through organic signup
Community engagementBelow expectationAcross both releases that shipped community featuresInternal analytics. We invested significant time in in-app communities and usage has been underwhelming. The causes are known and being worked on. This is the weakest result on the engagement
Time to first validation12 to 16 weeksTo V1V1 was deliberately modest. Its job was to prove people would practise, which it did, and that evidence is what justified a fuller V2

What clients say

What Our Client Says About Us

Three-year average engagement. Founders and operators describing the work in their own words. No marketing varnish.

The lesson

If your catalogue shape is unknown, model containers. And test the feature your client is most excited about first

There is real, unglamorous value in taking an experience scattered across half a dozen disconnected products and putting it in one place. That is the whole commercial thesis of TuneClub and it held. People did not need a better metronome, they needed their practice, their tutor's feedback, their community, and the thing they were working toward to live in the same product. The tracked-practice number is what that looks like when it works.

The engineering lesson is narrower and more expensive. On a creator-led platform, you will be asked to build for flexibility nobody can yet describe, and the instinct is to model it precisely: an entity per concept, a table per relationship. Two years in, the honest read is that many of those entities were containers pretending to be nouns. A labellable container that arbitrary things can be stashed into, with meaning resolved at read time, would have absorbed the V1-to-V2 shift for a fraction of the cost. If your catalogue shape is genuinely unknown, model the container, not the contents.

The third thing is about sequencing. Two headline features, AI practice feedback and real-time group jamming, were killed by feasibility work rather than by budget. Both were things the client wanted badly, and one came with a partner already chosen. Run that feasibility in week one, before the feature is in a roadmap deck and before anyone has emotionally committed to it. A feature you disprove early costs a week. The same feature disproved late costs a plan.

How it runs

Flutter
The learner app needed native-level audio behaviour, pitch shifting, tempo control, and real-time recording, on both stores from one codebase and one small team. Flutter compiles to native and held up for the practice tooling. The media handling sits behind an abstraction layer so the underlying audio implementation can change without the feature layer moving with it, which it has.
RevenueCat
Used as a durable transaction store and store gateway, with its entitlement system deliberately unused, because entitlements had to follow creator-defined tiers rather than a fixed product list. We had a hard launch date and building on raw store APIs would have been a sinkhole, particularly given how often those APIs have changed. The delivery lead argued against this choice initially and now names it the decision he is most glad we made.
Hasura GraphQL
The creator portal had to show new submissions and feedback state as they arrived, which GraphQL subscriptions give without polling. Beyond that, this is a stack we have been refining across projects for years: the visibility, built-in tooling, and reporting layers are what make a two-year product debuggable by whoever is on it this quarter.
AWS Lambda
Submission processing, notification delivery, and media event handling run serverless, so submission spikes around an event deadline do not require capacity provisioned in advance for a platform whose baseline load is modest.

Common questions

You decouple the two. TuneClub maps creator-defined tiers and offerings onto a fixed set of internally managed SKUs that the stores approved once. RevenueCat handles the transaction and the store relationship; the entitlement logic is ours rather than RevenueCat's. A creator configures and names a new offering in the platform and it is live the same day, with no App Store review cycle and no deployment from us.

A hard launch date, and a decade of store APIs changing without notice. Building billing directly on the store APIs would have consumed weeks we did not have and created a permanent maintenance liability every time a store changed its rules. RevenueCat gives a consistent SDK to build around. We used it as a durable transaction store and gateway only, leaving its entitlement system aside.

Roughly 48 weeks of product work spread across two-plus years, in four named releases plus patch and support runs. V1 took 12 to 16 weeks. The team was one PM, one full-stack engineer, one frontend engineer, and one mobile engineer, with the product owner role covered informally on our side. We describe commercials as a shape rather than a figure, and on this engagement the budget was not first-hand to the person who gave us these facts, so this page does not state one.

Four things. AI practice feedback, because the client-recommended third-party service failed early feasibility. Real-time group jamming, because round-trip latency of 180 to 200ms on an average phone and a good connection is not enough to play in time together. In-app video sessions, deprioritised because Teams already did the job. And Stripe Connect creator disbursement, deferred because there is currently one creator and they are first-party.

48,100 minutes of tracked practice, average practice above 16 hours per active learner over the trailing 90 days, 100+ learners, roughly $230 in monthly recurring revenue within weeks of launching pricing, and around EUR 6,000 in one-time revenue with roughly 50 prepaid annual learners through a partnership. Against that, community engagement has been below expectation despite significant investment, and we treat that as the weak result.

Yes, more than two years after the initial engagement, across V1, V1.5, V2, V2.5, and ongoing work. The relationship also produced a referral that became the Wendor engagement, a project that had previously been with another agency and that is still running.

The pattern transfers. Structured pathways, a submit-and-review loop, creator-defined subscription tiers that survive store review, and community channels apply to any skill-based community where a practitioner submits work for expert review. The metronome and pitch control are music-specific; the pricing architecture and the container-modelling lesson are not.

Work with us

Recognise this problem in your business?

Tell us what's broken. We'll diagnose it and show you exactly what to fix first, before you commit to anything.

  • Scope and cost agreed before work starts. No surprises. No obligation.
  • Working prototype within 3 weeks of kickoff.
  • Pay by milestone. You see progress before each invoice.
  • 60-day post-launch warranty. Bug fixes, UI tweaks, and deployment support. No retainer.
  • All conversations are NDA-protected.