Client work

/ Case study / Online learning platform

Rebuilding an online school platform for 180,000+ learners without starting over

Safock rebuilt the payments and course access behind an online school with more than 180,000 learners in 50+ countries and 250+ video courses. The new foundation runs on Next.js, TypeScript, PostgreSQL, GraphQL and Stripe, while the school's editors kept publishing in WordPress.

Client
A leading hairstyling-education brand
Name withheld by agreement with the client
Industry
Online learning, hairstyling education
Stack
Next.jsTypeScriptPostgreSQLGraphQLStripeWordPress

What it includes

  • Purchase-aware course access
  • Stripe payments and taxes
  • WordPress kept for editors
  • Memberships, bundles and trials
  • Fast, search-friendly pages
  • PostgreSQL and GraphQL backend
Client work
180,000+Learners on the new platformOnline learning, hairstyling education

/ At a glance

  • 01180,000+Learners on the new platform
  • 0250+Countries served
  • 03250+Video courses with access rules
  • 04Four or more layers of add-ons per pageBefore the rebuild
On this page
  1. 01A growing school on a website held together by add-ons
  2. 02Rebuilt behind the scenes, with WordPress kept for editors
  3. 03One access decision behind every course page
  4. 04Payments rebuilt on Stripe for 50+ countries
  5. 05What the rebuild changed for the school's team
  6. 06Payment problems left the daily inbox

01The challenge

A growing school on a website held together by add-ons

The school sells access several ways at once. Learners can buy a monthly membership, a single course or a bundle, and live classes sit beside a library of more than 250 recorded courses.

All of that ran on a website assembled from add-ons. Every page passed through four or more layers of them before a learner saw anything. Pages loaded slowly, which hurt search rankings, and the add-ons often clashed with one another. A small pricing change meant editing many files and hoping nothing else broke.

The support inbox showed the cost. The same kinds of request kept arriving:

  1. 01

    Learners charged twice

  2. 02

    Learners who paid but could not watch

  3. 03

    Plans that did not upgrade

  4. 04

    Course access granted by hand

  5. 05

    Spreadsheet workarounds to track who should see what

Each new course or price change added risk. The more the business grew, the more the platform broke.

02The solution

Rebuilt behind the scenes, with WordPress kept for editors

A full restart would have pushed the content team onto new tools and put a working business at risk. We kept WordPress as the place where editors write and publish. Payments, course access and the learner-facing pages moved onto a new foundation built for this school with Next.js, TypeScript, PostgreSQL, GraphQL and Stripe.

A learner's path through the platform now runs in six steps:

  1. 01

    Editors create content in WordPress, as before.

  2. 02

    Content is organised in one place.

  3. 03

    The learner picks a plan.

  4. 04

    Stripe runs a secure checkout.

  5. 05

    The right courses open for that learner.

  6. 06

    Fast pages deliver the lessons.

Instructors can now update a course while students are enrolled in it. If an instructor wants to swap module 4 next Tuesday, the change goes in and every enrolled student keeps access.

03How it works

One access decision behind every course page

The video player is the easy part of an online school. The hard part is deciding who may watch what, and when.

Every course page shows one button, and whether it reads Subscribe or Watch depends on the learner's entire purchase history. The system checks current and past memberships, every bundle redeemed, courses bought one at a time, and every promotion applied. From those it answers one question. Can this person watch this class right now?

The answer is the same on every page, every time, and live classes follow the same rules as recorded ones. When access is right, nobody notices. When it is wrong, a learner who paid cannot open her class and a support ticket follows.

04How it works

Payments rebuilt on Stripe for 50+ countries

Most of the payment work sits around the charge itself: a learner switching plans halfway through a month, a partial refund, a card that fails and is retried, and tax rules that differ across more than 50 countries.

We rebuilt the payment system on Stripe and moved the payment rules into one place, where before they were scattered across add-ons. Each of those situations was tested, across memberships, single purchases, free trials, upgrades and taxes. Rules kept in one place can be tested in one place, which made covering every case practical.

With 180,000 learners worldwide, every payment problem caught early means one less upset customer and one less refund to process.

05How it works

What the rebuild changed for the school's team

The rebuild gave the people running the school three practical gains.

Editors got all of this without learning a new tool. They write and publish exactly as they did before.

  1. 01

    Pages load faster for learners in every country the school serves, and faster pages also help search rankings.

  2. 02

    The team has full control over how course pages appear in Google search.

  3. 03

    New features can go in without breaking the ones already there.

06The outcome

Payment problems left the daily inbox

Requests about double charges, paid courses that would not open and plans that failed to upgrade used to fill the support inbox. They are now rare, and the school's records are cleaner.

This case study reports no percentage improvement. The change shows in how the team spends its week: on new courses, new instructors and new live formats, where that time used to go on fixing payments.

/ FAQ

About this project

Did the school's editors have to stop using WordPress?

No. Editors still write and publish in WordPress, exactly as before. Payments, course access and the learner-facing pages moved to a new foundation built with Next.js, TypeScript, PostgreSQL, GraphQL and Stripe. Keeping WordPress meant the content team learned no new tool, and the rebuild could concentrate on the parts that were failing.

Can Safock rebuild part of our learning platform instead of all of it?

Yes. This project kept the content tools the team relied on and rebuilt only the payments and course-access logic behind the support tickets. We decide that split with you during discovery, by looking at where failures and manual work sit today, then give a fixed quote for the work.

Which payment cases does a rebuild like this have to handle?

Every way money changes hands: memberships, single purchases, free trials, upgrades and mid-cycle plan changes, partial refunds, failed cards and retries, and tax rules for each country you sell into. This rebuild moved those rules into one place on Stripe and tested them for learners in 50+ countries.

/ Next step

Need a system like this?

Tell us what you are working on. You will speak with a founder, and you will leave the call with a clear next step, even if that step is not us.

Prefer writing? Send us a brief and a founder will reply.

WhatsApp usBook a call