Migrating 13 Courses, 691 Videos, and 1,439 Enrollments from Thinkific to LearnDash
Music education platform with zero data loss and zero student downtime
The Challenge
A music education platform with 13 active courses, over 1,000 video lessons, and more than 1,400 live student enrollments needed to leave Thinkific. Vimeo's 240-uploads-per-seat-per-year quota made re-hosting there a non-starter, and every existing student had date-bound access that had to survive the move. The migration had to preserve quiz results, certificate eligibility, and enrollment expiration dates exactly.
Our Approach
Audited the source school with Thinkific's REST and GraphQL APIs. Confirmed direct MP4 CDN URLs on the VideoContent type so we could skip Vimeo entirely.
Built a GraphQL fragment that pulled course hierarchy, lesson content, and video URLs in a single pass per course. Ran it against staging before touching production credentials.
Used the VideoMigrator pipeline to stream 691 MP4 files from Thinkific's CDN to the client's own S3 bucket with multipart uploads and concurrent downloads.
Exported enrollments with the course_id filter fix to avoid Thinkific's cross-course contamination bug, then verified the record count per course against the Thinkific admin UI.
Imported courses into LearnDash with template hooks suspended so save_post callbacks couldn't crash the WP-CLI context.
Configured CloudFront in front of S3 with referrer restrictions, signed cookies, and an HTML5 player hardening mu-plugin before cutover.
Ran full QA on a staging LearnDash site, reconciled every enrollment, then cut DNS over in a single window with no student re-enrollment required.