How to migrate from Thinkific to WordPress. Part 1: Planning and data preparation

How to migrate from Thinkific to WordPress. Part 1: Planning and data preparation

4 months ago ·
· 8 min read

In this series of 5 articles, I propose to write about how I migrated from the e-learning platform Thinkific to WordPress, how I exported the data from Thinkific, what technologies I used, how WordPress Command Line Interface (WP-CLI) helped me, and how I made other minor changes to templates or using WordPress API hooks. Below, I leave you the list of articles in the series:

Table of contents


2023 ended with a small WordPress challenge for me, to which I happily answered with "Yes!". It involves the migration of the content of the site, a site belonging to the Cultural Association Cărțile pe față, on WordPress.

The e-learning site was hosted so far on the Thinkific platform, a platform dedicated to online courses. The main reason for this migration was price. And for a few courses, such a platform is too much.

And WordPress fits here like a glove. It's flexible, there are some good e-learning plugins on the market, there's even more flexibility in developing new functionality, and the experience I have is even more enjoyable. It can also bring some performance improvements. Migrating data from one side to another is just a matter of time.

I chose WP-CLI, the command line interface for WordPress because the process is singular. I need real-time monitoring during the migration, I have full control over the data, and the limitations are only those I impose in the local PHP configurations. I run the migration locally and only then move the site to the production instance.

Migration planning

Assessment of requirements and resources

In my case, the data I need from Thinkific is as follows:

The conditions for enrolling users in WordPress courses that, for example, require the creation of WooCommerce orders must also met. In addition to these, on the future platform, I need the following functionalities:

Create a detailed plan for the migration

For the new home of the Masterclass Online site, I chose the Tutor LMS plugin configured with WooCommerce for order processing, including payment, invoicing, and other integrations. However, I won't go into the details here.

Next, I studied the e-learning plugin to determine the technical requirements needed for migrating the data:

Furthermore, I outlined the list of actions that I need to complete:

Exporting and preparing data from Thinkific

In terms of data, I had a bit of a challenge, but in the end, it turned out to be relatively easy to export them.


Fortunately, there is a handy method to export the list of users: Thinkific Dashboard > Student Support > Users > Click on the "Export" button.

Export users from Thinkific Dashboard

Once the processing is complete, an email notification will be sent with a link to download the file in CSV format.

The header of the exported CSV file looks like this:

First Name,Last Name,Amount spent,Date created,Email,Enrollments,Enrollments - list,External source,Last sign in,Referred by,Roles,Sign in count

Of all the data, I only need the following:

So, I can either normalize the file and remove everything I don't need, or I can go through the file and select only the necessary data (initially, I opted for the second option).


Since there are only 4 courses, I didn't find it necessary to export them. There doesn't seem to be an option for this in the Thinkific dashboard (or I couldn't locate it).

I manually created the courses in the e-learning plugin and as products in WooCommerce. The process was quite fast; the main time consumption was in visually arranging and styling them with Elementor.

The way Thinkific exports the user list is a bit peculiar because, in the Enrollments - list field of the CSV file, each user has a separate comma-separated list of course titles they are enrolled in. As a result, I had to go through each user's list during the import process and manually match them to set up the user-course relationships.

📛 The only drawback in this regard is that the developed plugin is not entirely "plug-and-play"; it will require adaptation for that manual matching if run on a different dataset.


This concerns the progress of each user in each course they are taking. Once again, the list of each user's progress can be easily exported from the Thinkific dashboard.

Export progress from Thinkific Dashboard

📛 Another drawback of the Thinkific platform is that progress can only be exported individually, per course, and not in bulk. So, if you have many courses on the platform and want such a migration, you might have a more serious task on your hands.

The header of the exported progress CSV file looks like this:

Email,Completed At,% Completed,<Nume-capitol-1>,<Nume-capitol-2>,...,<Nume-capitol-n>

The values for the columns with <Chapter-names> range from 0 to 100.

You will see further in part three of the article series that I made a compromise and only treated progress with the value of 100. For the remaining values other than 100, being fewer in number, I took the responsibility to update them manually directly in the database.


Thinkific doesn't have a user-friendly method to export course reviews. Through a quick Google search, I came across this article that guided me on how to obtain reviews for each course. Again, if you have many courses on the platform and want to migrate them to WordPress, it will require more manual work.

Returning to the point, course reviews are available in the page source of each course. So, I fetched them from there (after ensuring they are all validated from the Thinkific dashboard!) in JSON format this time and worked with them from there (for the sake of dynamics 😁 - kidding, it seemed easier for me to process them this way).

The structure of each JSON object for reviews looks like this:

  "@context": "",
  "@type": "Product",
  "name": "<course-name>",
  "aggregateRating": { "@type": "AggregateRating", "ratingValue": "4.6", "reviewCount": 5 },
  "review": [
      "@type": "Review",
      "author": { "@type": "Person", "name": "<reviewer-name>" },
      "description": "<review-description>",
      "name": "<review-title>",
      "date": "November 26, 2021",
      "reviewRating": { "@type": "Rating", "bestRating": 5, "ratingValue": 5, "worstRating": 0 }
    // ...
    "image": "<course-image-url>"

Closing thoughts

Thank you for your patience so far. 🍻 By now, I have the migration plan and all the necessary data from Thinkific in their respective files.

In the next article, I will tackle the part I enjoy the most, implementing one of the WP-CLI commands. ✌️

If you need such a migration, click below, and let's discuss.

Contact me

Share on: