The starting point
The courses lived in Teachable, payments came from several channels, and every buyer needed access by hand. Curators did not know who was behind on installments, and the school's emails often landed in spam.
What I built
- Own course platform. An admin in the style of Teachable: curriculum, a lesson editor with version history, a video player that resumes where you stopped, playback speed and discussion under every lesson.
- Protected video. Encrypted HLS streaming with signed links, so videos cannot be downloaded and shared.
- The Teachable migration. Every course, lesson and video moved, and 37 of 37 end to end tests passed on the live server.
- Payment to access. Stripe notifies the server, the product maps to the right courses, and the buyer gets access and an email at once. Payments the system cannot match become an approve or deny ticket by email and Telegram.
- Installments. Reminders before the due date, and access that closes on a missed payment and reopens automatically when the customer pays.
- Email from its own server. Postal for receipts and Listmonk for newsletters, with separate domains for each.
- CRM. 18 data sources on one card per customer, reconciliation against Stripe payouts, a debtors list and cohort analytics.
The result
The migration had zero errors: 282 lessons, 281 videos and 37 of 37 tests. The email deliverability test went from 6.1 to 10 out of 10, and 642 automated checks of letters and prices found no failures. Installment reminders recovered 3,400 euros in 30 days, with 7 of 18 people who owed money paying after the email.
The CRM now shows the whole journey: of 894 people who bought the intro course, 61 (6.8%) later bought the main program, after 9 days on average. The platform was handed over to the academy's own developer in September 2026.
Tools and tech stack
- Python
- Flask
- SQLite
- HLS video med AES-128
- Stripe
- PayPal
- Postal
- Listmonk
- OpenAI
- nginx
The client is anonymised. The numbers come from the project's own reports and measurements.










