Paul Jarvis

How to create and sell an online course in WordPress: a step-by-step guide

I started creating WordPress online courses in 2014. At the time it was for fun and really just to see if I could create one (I never intended it to be the main part of my business).

But now, years later, I’ve created courses that have been taken by over 14,000 students (which is scary to imagine) and generated a few million dollars in revenue. Online courses have become the main source of revenue for my business. My two current courses are Creative Class and Chimp Essentials.

(I’m not saying the above to brag, but too many articles talk about what to do without the author having ever done it... whereas this article is based on real-world experience from building successful online courses for years.)

What I like about online courses is this: it democratizes learning. You don’t need acceptance by some stuffy admissions board, you don’t need to go into 6-figures of debt to get an education, and you can learn specifically what interests you. Online courses are also a $107b industry and growing every day.

How to create and sell an online course in WordPress

  1. Software to use to create your WordPress online course
  2. Which WordPress LMS should you use?
  3. Costs to setup your online course in WordPress
  4. Setup your WordPress online course
  5. Plan your WordPress online course

The software and costs for creating and selling an online course with WordPress

There are a million plugins, processors and mailing list software you can use to create your course, but I’m going to share with you my top picks because they are the easiest and cheapest (which is good, because I’m cheap). In the “Total Costs” section there are discounts for some of the software products I use too. And, to be transparent, some of the tools were created by me, because I want to help more online course creators setup their WordPress courses successfully.

Restrict Content Pro, the membership plugin

I’ve tried so many WP course plugins, and this is by far the easiest to both setup and use moving forward. RCP lets you sell access to restricted pages on your website. It’s a full-featured, powerful membership solution for WordPress.

To setup, all you have to do is install the plugin, setup how you want to get paid (more on this in the next section), and then pick which pages are only accessible to your students. The good thing is, if you sell multiple levels of access (at different price points), you can pick which type of students can see which content (and up-sell from the middle/low tiers to the highest one).

Paired with their official add-on, Mailchimp Pro, you can subscribe or update contacts on your mailing list based on their purchase history. So this add-on plugin for WordPress let’s you associate ecommerce data with students in your online course, and even add them to groups. This is so useful because if you have a sales funnel (automation sequence), you’ll want to segment out people who buy your course, so they stop getting sales emails after they purchase.

Stripe and Paypal, to collect payments

To be honest, I hate Paypal. It’s awful to use and their customer support is atrocious. That said, lots of people want to use it to pay for things online. I noticed a 20% increase in sales when I added Paypal as a payment option to one of my courses, and for every course I have Paypal as an option, I see 50% of customers paying through Paypal. So it’s a necessary evil if your audience uses it.

Stripe, on the other hand, is great. It’s easy, it works well, and I never have problems with it. Payments go into Stripe and are transferred straight into my bank account without me having to think about it.

Mailchimp, for emailing students and potential students

If you’re going to have an online course, you need a mailing list (watch my free MailChimp tutorial). It’s what will sell your course the most effectively and makes it easy to stay in touch with current students.

MC4WP is a useful plugin regardless for every WordPress website because it lets you collect email addresses if your course is closed or not launched yet.

What I mean by that is, a typical MailChimp form won’t allow a current subscriber to signup for your webinar or free email series since they’re already on your list. But with MC4WP, you can update existing subscribers and keep them on your list but give them what they continue to sign up for.

MC4WP’s User Sync also keeps your mailing list sync’ed with purchaser information, so you can send things like onboarding sequences or post-purchase education sequences to buyers.

WPComplete, so students can track their progress

Honestly here: I co-created this plugin because I saw a tremendous need for it. WPComplete lets your students mark lessons as finished, and gives them a progress bar (which prompts them to keep going and finish your course. It only takes a few minutes to setup, and you can customize it to match your colours on your course. No programming or technical skills required.

WPHelpful, so students can give you feedback

WPHelpful is a WordPress plugin that lets you collect ratings (emoji faces or stars) as well written feedback from your users for things like online courses, knowledge-bases or whatever other content you’ve got. This helps you know which content is the most valuable to your customers, students or users… and more importantly, which content needs a little more work. I also co-created this plugin.

Fathom Analytics, to track visits and purchases

For my courses I need to see which pages are the most popular, which referrers send me the most traffic, and how many people click the BUY button. That's it. Luckily Fathom is a great Google Analytics alternative, which let's me do just that. Yes, full transparency, Fathom is my own company, but I use it daily for my online courses.

Which WordPress LMS plugin should you use?

You’ll notice that I suggested RestrictContentPro to use for your WordPress LMS/membership plugin. It’s what I personally use, and what I think is best to build out highly functional, profitable and simple online courses.

RestrictContentPro has everything you’ll need:

Additionally though, there are other plugins on the market that do similar (and some even have more features, if you truly need them). Let’s look at why you might pick one of these instead:

Your WordPress LMS plugin is the glue that holds everything together for your online course as it manages students, collects payment, restricts content, connects to your Mailing list and integrates with progress trackers like WPComplete. LearnDash, LifterLMS and LearnPress are decent plugins, but they are more geared towards teaching University-style courses online with grades, quizzes and assignments. Most online courses from bloggers or businesses don’t need any of those features, and instead focus on the basics (like my own courses) of taking payment and giving acess to lesson videos. That’s why I truly think RestrictContentPro is the best to cover those bases.

Total costs for creating an online course with WordPress

As I mentioned, I’m pretty cheap, so I like having my courses on WordPress because a) I have full control over the platform and b) operating costs are pretty low. I’ve also got exclusive discounts for you on all the products I use (they’re all affiliate links, but the links are worth some decent savings):

  1. $276/year - Hosting, I use DigitalOcean ($50 credit) paired with ServerPilot ($10 credit), but any host that makes a WordPress site speedy will work. If you don’t want to or know how to setup a server, use FlyWheel.
  2. $13/year - A domain name, I use Hover ($2 credit). They’re Canadian (like me) and are simple and straightforward.
  3. $50+/year - A mailing list, I use Mailchimp ($30 credit). They let you connect your course to your list, which as I mentioned, is the most useful functionality for an online course.
  4. $100/year - A course management plugin, I use RestrictContentPro ($10% off).
  5. $100/year - A way for students to track progress, I use WPComplete (30% off).
  6. $50/year - A way to give feedback, I use WPHelpful. Use the code PJCOURSE for 30% off.
  7. $140/year - Website analytics, I use Fathom Analytics.

All in, that’s around $60/month or about than $730/year if you don’t include buying a premium WordPress theme (which is nice but definitely not required). Even less with the discounts above. This is also less than a lot of hosted or fully managed course software (which isn’t infinitely customizable or owned, like a WordPress course is).

Since all my courses cost about $300, I can cover the entirety of my expenses by selling one course per month. That’s totally doable.

Past the above costs, you also get charged for transactions on Stripe and PayPal (2.9% + .30c), but those only happen when you make a sale, so you only pay for these charges when you make money. Your Mailchimp list can also increase as you add subscribers, but some should be converting to paying students, so the price of their software is immensely worth it.

How to setup your WordPress online course

Now that you have all the software needed for your course, it’s time to connect everything. Which means, we need to connect our WordPress site to our mailing list (Mailchimp) for both wait list signups and purchases, and connect our payment providers (Stripe and Paypal) to RestrictContentPro in WordPress.

Setting up Restrict Content Pro for the first time in your online course

  1. Install RestrictContentPro, activate it, and add in your licence key.
  2. Go to Restrict then Subscription Levels, and create a name and price for your paid course. Set the Access Level to 2 (this is an arbitrary number, but it’s important for email automations later). Unless it’s a monthly membership, set the duration to 0 (for unlimited). You can also add a “free trial” or “free lessons” subscription that’s $0 and access level “1” to help get people into your funnels and give them a sample of what you’re teaching.
  3. Then go to Restrict, Settings. Click the Payments tab, here’s where we connect Paypal and Stripe.
  4. Set your currency (the currency your Stripe and Paypal account are using), and then enable Paypal Express and Stripe.
  5. Enter your Stripe API keys (found in Stripe, Account Settings, API Keys ). If you check off Sandbox Mode, you can test Stripe payments using a tester credit card of 4242 4242 4242 4242 (any CVS, any Zipcode, any expiry date) – to make sure payments and automations work. Just make sure to uncheck Sandbox Mode before launch. Still in Account Settings in Stripe, click Webhooks, and Add endpoint… and enter a the URL https://yoursite.com?listener=stripe (it’s the URL that appears just above Paypal settings on the Restrict payment page). In your Paypal account, go to Profile and Settings, then My Selling Tools.
  6. Go to Instant Payment Notification, turn it off and enter the Notification URL of http://yoursite.com/?listener=EIPN (replacing yoursite.com with your domain name).
  7. Now go back to My Selling Tools, click API Access then Add/Edit API Permissions, then View API Signature.
  8. Paste your API Username, API Password and Signature into the corresponding Live Fields in Paypal Settings (still on the Payment tab in Restrict, Settings in WordPress).
  9. Now your course website is connected to your payment processors. Which means you can collect money from students! Breath deeply, that’s the most technical part of the entire setup and you only have to do it once ever.

Connecting MailChimp to RestrictContentPro in your WordPress course

Your mailing list is just as important as your course software. Why? Because it’s what going to sell your course (email marketing destroys all other channels in terms of ROI and conversion rates).

So your goal with your course mailing list is two-fold:

  1. Get people into your “funnel”. Meaning, you want to trade every visitor that’s a good fit for your course something for their email address. For my own courses, I’ve found that trading for both partial access to the paid course and related lessons to the paid course both work great for getting email addresses. Once you have someone’s email address, deliver what you said you’d give them, and try to convert them into paying customers.
  2. Purchase tracking. You need to let your list know if someone becomes a paid student. Once that happens, you can a) stop sending them pitch emails (they already bought) and b) start educating them on how best to use your course and it’s materials.

For the first step above, just add a form to your website or a waiting list landing page using the MC4WP plugin. That'll send email addresses from your WordPress site to Mailchimp. You can tag or group contacts if you’d like as “waitlist” or another term you’ll remember.

To set MC4WP up, go to the main MC4WP page once you've installed their plugin, add your API key from Mailchimp and create your first form. Be sure to tag or group these people (easily possibly with MC4WP) as "wait-list" or similar, so you can properly segment emails to them.

For the second step, knowing when someone buys, this is arguably the most important step. Knowing when someone purchases is important because you don't want to keep selling or pitching them once they buy. So if they're in a sales funnel and purchase, you want to take them out instantly. To do this, you need a free add-on to RestrictContentPro, called Mailchimp Pro.

Mailchimp Pro sync's payment data from your course to Mailchimp, instantly. It saves the order into your purchasers details in Mailchimp (along with the price they paid, and the product name). It also lets you add them to a group of your choice. By doing this, you can segment people on your list as purchasers and non-purchasers. So non-purchasers can get sales emails, and purchasers can get post-purchase education emails.

To setup Mailchimp pro, install it, add your API key (same as the one you used for MC4WP), de-select "double subscribe", make sure "no double optin" and "auto-subscribe" are selected. That's it!

Voila, your list and course are now connected. What the above means is that MailChimp now knows if someone signed up for a free trial or purchased your paid course. This means you can create automation sequences in MailChimp that trigger if the merge field for the following:

Now your list is going to stay up to date with your course signups, and you are going to be properly segmenting free trial subscribers and paid subscribers. The possibilities are endless for what you can send to each segment in terms of emails that’ll help them decide if they should buy or help them get the most from the course if they did buy.

Letting students track their progress on your online course

You want to make sure students are propelled through your lessons from start to finish, so they can get the most of the course. Successful students = a successful course. To do this, it’s a good idea to let them mark lessons they’ve finished as complete and then see their overall progress.

That’s why I co-created WPComplete, it’s a simple plugin that let’s student track their progress and teachers track the overall progress of students through the lessons.

  1. Install WPComplete and activate your licence key.
  2. In Settings, then WPComplete, customize your button colours and text.
  3. Now, on every page that’s a lesson page (hidden behind RestrictContentPro for paid members), you can check off “Enable WPComplete”. You can also pick which course it’s part of (if you run several courses on your site) and pick which lesson should load after they click “Complete”.

That’s it! You can now use shortcodes found here to display progress bars, text percentages of progress even a circular graph of progress.

If you have a “dashboard” on your course, or a page that lists all the available lessons, WPComplete will automatically append some CSS classes, so you can customize how completed vs not-yet-completed lessons look like – editable on the Settings page.

Letting students give feedback on your online course

To add the WPHelpful feedback widget to a lesson, you use the shortcode [wphelpful] and place it anywhere, that’s it. To get rolling with WPHelpful:

  1. Install WPHelpful, and activate your licence key on the WPHelpful screen in settings.
  2. Staying in settings, customize your template (emojis, stars or yes/no), the colours and even the content.
  3. Turn on automagically enabling WPHelpful on a specific content type (your lessons), or start adding the [wphelpful] shortcode to your lesson pages.

There’s no programming required and WPHelpful works with any WordPress theme or existing plugin. It’s ready to use instantly, simply activate the plugin and choose which content you want to add the WPHelpful form to. Logged-in students don’t even need to fill in their name or email address, WPHelpful already knows who they are and who to associate the ratings and feedback to in your WordPress admin area.

Your WordPress online course is all connected

Congrats, you’ve now connected all the pieces of your course together. It may seem like a lot of work, but you only do it once, and then it runs forever.

A good plan is to test this throughly before you give people access to your potentially signup and buy. If you use Google Email or Gmail, you can signup with your variations of own email address, so you get the emails, but you’re signing up for a fresh testing email. Like so: if your email is [email protected], then you could try [email protected] to test the wait list. And then [email protected] to buy the course in Sandbox mode with the test Stripe credit card. So it’s your [email protected] Then you can make sure payment processes, access is correctly granted, and the email address is properly added to MailChimp with the correct merge field data.

How to plan your WordPress online course

Now that the tech stuff is out of the way, let’s get into actually planning your course material.

Creating content for your course can be overwhelming or stressful, but there are two things that can really help:

  1. Make your primary goal the success of your students. If students achieve something, solve something, get better at something because of what you teach then, it’s a win-win. They win because they learned something useful and you win because they’re now going to tell everyone they know about it. Every decision you make about content needs to consider, “how will this help my students succeed?”
  2. Work backwards in small steps. Online courses have a lot of moving parts. For payment, to access, to video lessons, to workbooks, to email funnels. The only way to make process is to bite off tiny pieces of work and chisel away at each tiny piece.

The main things most online courses in WordPress can have:

  1. Video lessons. You don’t have to have videos, but this is the easiest and most engaging way to teach someone online. This can take the form of you talking into the camera – which is scary but just requires a camera. Or, which is what most people do, requires you to record yourself talking over slides or screencasts.
  2. Some written content. Even if it’s just the transcribed content from the videos, it’s important to have a bit of written content so students can go back and skim what they learned without having to re-watch a video.
  3. Actionable materials. Whether it’s PDF workbooks or templates shared on gDocs – having some way for students to take notes or write down their ideas can really help with taking someone from start to finish of your course.
  4. A community. This isn’t necessary, but having a FaceBook group or Slack channel for paying students can go a long way with helping them finish the lessons, talk out their problems or even just connect with likeminded folks who are also taking the course. With my own courses that have communities, I’ve found that people come for the lessons but stick around (for years even) with the community. Both FaceBook and Slack are free to create a private group for your course.

In the beginning, all my courses were evergreen, meaning they were available to purchase 52 weeks a year (i.e. anytime). As an experiment in 2016, I tested out whether or not timed launches worked better, meaning what if a course was only open 2 weeks of the year for purchase and closed 50 weeks of the year (with a wait list).

The test was so successful, I moved every course I've taught since to a timed launch, with a small caveat (I'll explain later). I make more money and do less work opening up registration for 2 weeks of the year—once in spring and once in the fall.

To be clear: this doesn't mean paying students only get access to what they bought 2 weeks a year, they get access instantly and forever. It simply means people can only buy it one week in the spring and one week in the fall.

Congrats, you’re ready to sell your course!

Now that you’ve setup all the tech and created the lessons, you’re ready to plan for your launch. I go into massive detail about how I launch and re-launch my courses in this article , this article and this one.

For about $60/month you can own the platform your course uses, which lets you be in 100% control of what you do, how you sell it, what it looks like, and the overall customer experience. That’s worth it to me (instead of using a hosted platform) and I can cover my costs with only needing a single sale per month.

Now get out there and create your course.

I write a weekly newsletter called the Sunday Dispatches where I share articles about working and living online with 35k subscribers—