How We Migrated 691 Videos from Thinkific to S3 Without Vimeo
Thinkific's GraphQL API exposes direct MP4 CDN URLs through VideoContent types. Here's how we used that to bypass Vimeo entirely and migrate 691 course videos to self-hosted S3 with CloudFront delivery.
Why we skipped Vimeo entirely
Most Thinkific migration guides assume you'll re-host videos on Vimeo or Wistia. But Vimeo Advanced at $65/month limits you to 240 uploads per year per seat. With over 1,000 course videos, that timeline was unacceptable. We needed a different approach.
How Thinkific's GraphQL API exposes video URLs
Thinkific's REST API returns minimal content metadata with no video URLs. But the GraphQL API tells a different story. The VideoContent type exposes fields including url (direct MP4 CDN download links), videoId (Thinkific's internal identifier), thumbnail (Wistia-hosted images), and playUrl for streaming. By adding these fields to our existing GraphQL fragment — which was only requesting __typename — we suddenly had direct download links for every video in the catalog.
The migration pipeline: download, upload, rewrite
Our VideoMigrator PHP class handles three steps. First, it downloads MP4 files from Thinkific's CDN URLs with concurrent connections — processing up to 10 simultaneous downloads to stay within rate limits. Second, it uploads each file to the client's S3 bucket using the AWS SDK with multipart upload for files over 100MB. Third, it rewrites all video URLs in the exported lesson JSON to point to the new S3/CloudFront paths. The entire 691-video migration completed in under 4 hours.
Results and cost comparison
Final tally: 691 videos migrated to S3 via direct GraphQL API extraction. Total S3 storage cost: approximately $15/month for the full video library. CloudFront delivery adds roughly $0.085 per GB of bandwidth. Compare that to Vimeo Advanced at $65/month with upload restrictions — the S3 approach pays for itself immediately and scales without quotas. See AWS S3 pricing (opens in new tab) for current per-GB rates.