Services

Building Your Own Online Course Platform: Video Hosting, Anti-Piracy, and Payments

2026.08.18 · 29 views
Building Your Own Online Course Platform: Video Hosting, Anti-Piracy, and Payments

From transcoding and signed playback URLs to revoking access on refunds: real costs, a 90-day roadmap, and the traps that sink self-hosted LMS projects.

Share:

A vocational accounting school dropped 42 course videos into the /uploads folder on its own server and gated them behind a member login. On day 11, someone pasted a direct mp4 URL into a Facebook group. That month's bandwidth bill jumped from NT$1,200 to NT$18,400, and the whole library was mirrored elsewhere.

The hard part of a self-hosted course platform was never the catalogue or the cart. It is the video pipeline: transcoding, signed playback URLs, progress tracking, and revoking access on refund. Get those four wrong and the better your courses sell, the faster you lose money.

When It Fits, and When It Doesn't

Build your ownDon't build yet
30+ original courses, still producingUnder 10 courses, still validating demand
Course revenue ≥ NT$3M/year, so fees hurtRevenue < NT$1M/year — build cost never amortises
You need corporate seats and training-hour reportsPure B2C single-course sales
Must integrate with an existing CRM or LINE OANo internal systems to connect
Piracy costs you real revenueContent is lead generation; sharing helps

If you are still testing the water, list on a marketplace for three months, get real completion and refund numbers, then revisit. That one decision saves six figures.

Alternatives Compared

OptionProsConsCost
Marketplace listingZero build, built-in traffic30-50% revenue share; the student list isn't yoursRevenue share only
SaaS LMS (Teachable, Thinkific)Live in two weeks, hosting includedWeak Taiwanese payment and e-invoice supportUS$39-199/mo + fees
WordPress + LearnDashLow build cost, mature pluginsVideo bolted on, plugin conflicts, struggles under loadNT$60,000-150,000
Custom Laravel + video CDNYou own the data, lowest unit cost at scale10-14 week build, ongoing maintenanceNT$285,000-550,000

The Build, Stage by Stage (10-14 Weeks)

  • Weeks 1-2 — Requirements. Course data model, entitlement rules (one-off vs subscription vs corporate seats), refund policy. Deliverables: a Notion spec and a permissions matrix.
  • Weeks 3-4 — UX and player prototype. Course page, player page, learner dashboard. Deliverables: high-fidelity Figma designs and a clickable prototype. Design the player mobile-first.
  • Weeks 5-8 — Backend and video pipeline. Laravel modules for courses, orders, and entitlements. Uploads go straight to the CDN via presigned URLs, never through your PHP server; a webhook writes back when transcoding finishes; the backend issues a short-lived signed token at playback. Deliverable: a working upload → transcode → signed playback chain.
  • Weeks 9-10 — Payments and entitlement sync. Integrate ECPay or NewebPay so a paid order grants access and a refund revokes it, all through background jobs (Laravel Queues) to avoid synchronous timeouts. Deliverable: a documented order state machine.
  • Weeks 11-12 — Testing and migration. Bulk-import legacy videos, migrate learner accounts and purchase history, run load tests. Deliverables: UAT report and rollback plan.
  • Weeks 13-14 — Launch and monitoring. Cloudflare in front, UptimeRobot on the player page, Sentry collecting player errors. Deliverables: launch checklist and operations handbook.

What It Actually Costs

One-off build: information architecture NT$30,000-50,000; UI/UX NT$45,000-90,000; course and entitlement admin NT$80,000-150,000; video pipeline NT$60,000-120,000; payments and e-invoicing NT$45,000-90,000; testing and migration NT$25,000-50,000. Total roughly NT$285,000-550,000. The recurring costs people forget:

  • Video hosting. Cloudflare Stream charges US$5 per 1,000 minutes stored and US$1 per 1,000 minutes delivered — about US$30/month to store a 100-hour library, plus roughly US$20 for 20,000 minutes watched. Bunny Stream bills bandwidth instead (from US$0.01/GB in Europe and North America), cheaper at volume but you model your own egress.
  • Payment fees. Per ECPay's rate card, standard merchants pay 2.75% before tax; with 5% business tax at settlement the effective rate is near 2.89%, plus a per-order fee. At NT$300,000 monthly revenue that is about NT$8,700.
  • Infrastructure. Hosting and CDN NT$1,800-4,500/month, plus around US$20/month for Cloudflare Pro.
  • E-invoicing. Billed per invoice issued; budget from NT$1,000/month for a small platform.
  • Maintenance. 15-20% of build cost annually: framework upgrades, player compatibility, payment API changes.

Expectation vs Reality

  • Expectation: upload and it plays. Reality: transcoding one 60-minute 1080p file into multi-bitrate HLS takes 8-20 minutes. Without a visible "processing" state, your editor assumes it broke and re-uploads three times.
  • Expectation: DRM stops piracy. Reality: Widevine-class DRM often runs four figures in USD monthly and still cannot stop someone filming the screen. The pragmatic stack is short-lived signed URLs, a dynamic learner-ID watermark, and concurrent-stream detection.
  • Expectation: progress is one number. Reality: writing every five seconds with 500 concurrent learners is 6,000 writes per minute. Batch it, or buffer in Redis and flush.
  • Expectation: refunds are one button. Reality: a refund must revoke access, void the e-invoice, and account for downloaded handouts — a consistency problem across three systems.

Traps and How to Dodge Them

  • Video on your own server or a public bucket. Use a purpose-built video CDN, disable public read, and sign every playback URL with a lifetime under 10 minutes.
  • Uploading through your PHP backend. Use presigned direct-to-CDN uploads; you dodge upload limits and timeouts and save a round trip of bandwidth.
  • Transcoding synchronously. Queue the job, write back via webhook, show progress in the admin. Never block an HTTP request on it.
  • No performance budget on the player page. Keep LCP under 2.5 seconds: WebP posters, lazy-loaded player, paginated lesson lists.
  • Entitlement checks in the frontend. The frontend only decides what to show; every playback token is re-validated against order state server-side.
  • No corporate-seat model. Put organisation → seats → members into the schema on day one; retrofitting touches orders, entitlements, and reporting at once.

Success Metrics and the 90-Day Roadmap

  • Day 30 — stabilise. Playback success ≥ 99%, time to first frame ≤ 2 seconds, payment success ≥ 97%. Fix the top three player errors and the biggest checkout drop-off.
  • Day 60 — raise completion. Review per-module completion and first-module bounce. Split the three worst modules into shorter units, add chapter bookmarks and handout downloads, turn on email and LINE study reminders.
  • Day 90 — grow revenue. Overall completion ≥ 40%, refund rate ≤ 5%, video cost ≤ 3% of revenue. Launch cross-sell recommendations and a corporate-training enquiry form.

Decision Checklist

  • ☐ 30+ original courses, with new ones each quarter
  • ☐ Annual course revenue above NT$3 million
  • ☐ A year of platform fees exceeds the build cost
  • ☐ I need full ownership of learner and behavioural data
  • ☐ I need corporate seats or organisation accounts
  • ☐ I must issue Taiwanese e-invoices
  • ☐ Piracy would cause measurable revenue loss
  • ☐ I can accept a 10-14 week build window
  • ☐ I can budget 15-20% of build cost annually for maintenance
  • ☐ I have staff for course publishing and support
  • ☐ I need CRM or LINE OA integration
  • ☐ Refund policy and access-revocation rules are decided

Eight or more ticks and building usually pays back. Fewer than five, run a full year on SaaS first.

FAQ

What is the minimum budget for a self-hosted course platform?

A lean B2C build — one-off purchases, one video source, no corporate seats — starts around NT$285,000 and ships in 10 weeks. Add subscriptions, organisation seats, and training-hour reporting and you land at NT$400,000-550,000.

Do I have to use Cloudflare Stream?

No. Long libraries with modest viewership suit per-minute pricing; short videos with heavy viewership are usually cheaper on Bunny Stream's per-GB model. We model both against your last six months of actual watch minutes before choosing.

Should I buy real DRM?

Below NT$10M annual revenue and NT$5,000 per course, it rarely pays off. Short-lived signed URLs, a dynamic watermark, and a per-account concurrent-stream limit stop well over 90% of casual sharing at a fraction of the cost.

Can I launch the website first and add an app later?

Yes, and we recommend it. Design the API and entitlement layer headless and a later Flutter app for iOS and Android reuses it directly — roughly NT$180,000 extra rather than a rebuild.

Next Step

ScriptWalker's Online Course Platform Build starts at NT$285,000, including the video pipeline, payments, and admin backend. Book a free 60-minute consultation and we will produce a three-year total-cost comparison of building versus paying platform fees, based on your actual course hours and monthly watch minutes, plus a costed video-hosting recommendation.

Share: