Custom education platform and online academy development
We build online academies and education platforms you own: payments, video, assessments, certificates and AI. Four in production, more than 24,000 students.
Updated
The short answer
Migrating an academy is not copying videos: it is moving students, purchases and access without anyone losing a course. No platform does it automatically. Sales and enrollees are exported, normalized, each old product is mapped to a new course, the whole run is rehearsed without touching anything, and then it is imported in a single operation, notifying every student.
An academy that moves does not lose its content, which usually lives in the teacher’s original files. What is at risk is the people: students who bought a course and cannot find it on Monday, duplicate purchases, orphaned accounts because someone signed up with a different email. A migration is done right when no student notices it happened, except for the email telling them their courses are now on the new platform.
No course platform offers an automatic move out. Each one exports something different, with its own format and its own errors:
| Platform | What can be exported | What does not come out | Watch out for |
|---|---|---|---|
| Hotmart | Sales reports as CSV or XLS and the members area user list | Passwords, subscriber cards, lesson-by-lesson progress | Active subscriptions keep being charged on Hotmart until they are cancelled |
| Tiendup | Orders as CSV and enrollees per course with their completion percentage | Passwords and lesson-by-lesson progress | Orders and enrollees come in separate files, and enrollees come in one file per course |
| WordPress with WooCommerce | Orders as CSV, filterable by status | Passwords | Filter out pending and cancelled orders; if the LMS is a plugin (LearnDash, Tutor LMS), progress lives in the WordPress database |
| Moodle | Users as CSV, courses as backups, enrollments and grades from the database | Nothing critical, given database access | Adapting Moodle’s structure to the new learning path takes more work than exporting |
None of them export passwords, and that is how it should be. Each student gets new access by email, so communication is part of the migration, not a detail at the end.
Apoyo Escolar RV prepares students for subjects at five universities and today has more than 22,000 students on its platform. Its historical sales were split across two places, a Tiendup store and another on WordPress with WooCommerce, and every student who had bought from either one had to find their courses on the new platform. Each store had its own export, its own date format, its own way of writing phone numbers and its own product names. These were the steps.
Both sources were brought to the same columns: order number, date, first name, last name, email, phone, product and which platform it came from. Keeping the source of each row looks like a detail, but it is what later lets you trace any complaint back to the original order.
11/11/2025 00:49:17 and the other as 2025-11-21 00:00. All of them were converted to the same format.Maria@ and maria@ cannot be two people.It is the step that requires the most decisions, and the academy makes them, not the technical team. Each product from the previous platform was listed with its identifier, how many orders and how many unique students it had, and which new course it corresponds to. Some old products were merged into a single new course, so the table allows several of them to point to the same destination. Any product without a match shows up in a report before importing, not after.
A student is looked up first by email, ignoring case and accents. If they do not show up, they are looked up by phone, because the same person may have bought with two different emails in two stores. Only if they do not show up either way is a new account created.
The full migration runs first in test mode, without writing anything. It reports how many accounts would be created, how many already existed, how many purchases would be added and which products were left without a course. You run it, fix the table and run it again, until the report has no surprises.
The real import processes orders 100 at a time. Emails go out in batches of 10 every 600 milliseconds, below the email provider’s requests-per-second limit: firing thousands of emails at once makes the provider reject them, and a student who never got the notice writes to support. There are two different messages: students without an account get their access, and students who already had one get notice that their courses from the previous platform are now available. Every email that fails is logged so it can be resent.
While the migration was being prepared, the previous stores kept selling. Those sales were exported afterwards and added with the same process. Since the script recognizes purchases that already exist, running it twice duplicates nothing.
Content is the easy part if you have the originals, and the only part that cannot be rebuilt if you do not. Get the original files before closing any account.
Moving video between providers is also a migration. At Apoyo Escolar RV, video went through more than one streaming service, and during those changes already-converted lessons coexisted with MP4 files from the previous system. The player has to support both formats, with expiring links in both cases, until the conversion is finished.
Moving is the excuse to solve what the previous platform would not allow: local payment methods, learning paths by institution and subject, assignments graded by teachers, an AI assistant over the material. What can be built and when it makes sense is in custom education platform development.
We build online academies and education platforms you own: payments, video, assessments, certificates and AI. Four in production, more than 24,000 students.
How AI is integrated into a learning platform: cited search over your own content, a tutor scoped to the course and assisted grading, with the grade signed by a teacher.