How to create & sell an online course in WordPress: a step-by-step guide
[PSST: There are also three most posts about creating a WordPress online course here, here and here]
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 10,000 students (which is scary to imagine) and generated over $1,000,000 dollars in revenue. Online courses have become the main source of revenue for my business. My three main courses are Creative Class, Chimp Essentials and Grow Your Audience.
($27k/month is pretty nice for a single course (not even including Paypal or partner revenue).)
Along the way, I’ve experimented a lot with what works and what doesn’t – not based on what other people or “industry thought leaders” were saying – but what works for me and my style of communicating with my audience.
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.
Here’s what you’re going to learn:
- What software to use and what it costs.
- How to setup that software to create and sell your course
- How to plan your course
The software & costs for my WordPress online courses
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 pick because it’s the easiest and cheapest (which is good, because I’m cheap). In the “Total Costs” section there are discounts for each of the software products I use too.
Restrict Content Pro (WordPress 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.
To setup, all you have to do is install the plugin, setup how you want to get paid, 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). You can even use RCP to create an app without knowing code.
Stripe and Paypal
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.
If you’re going to have an online course, you need a mailing list – period (watch my free MailChimp tutorial here). It’s what will sell your course the most effectively and makes it easy to stay in touch with current students.
MailChimp is the easiest newsletter service to use and integrates with RestrictContentPro if you use MC4WP (20% discount using this link). If you only are going to a single signup form, you can even use MC4WP for free.
MC4WP is a useful plugin regardless for every WordPress website because it lets you update subscribers as they sign up for or do different tasks. 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.
Honestly here: I 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.
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 over $110 in savings):
- MailChimp: $50/month for 5000 subscribers (if you list converts at around 1%, 5000 subscribers will mean 50 could be paying customers, which easily pay for the $50). This link gets you $30 in credits.
- Flywheel: $15/month for hosting, and it comes with free SSL (you need SSL to process payments securely – it’s what makes the a website URL start with https instead of http). Use the code “thecreativeclass” for 3 months free on every plan.
- RestrictContentPro: $49/year. (10% off using that link.)
- WPComplete: $59/year. (30% off using that link.)
- MC4WP: $49/year. (20% off if you use that link.)
All in, that’s around $75/month or less than $1,000/year if you including 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 between $147-$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.
How to setup your WordPress online course software
Now that you have all the software needed for your course, it’s time to connect everything.
Setting up Restrict Content Pro for the first time
- Install RestrictContentPro, activate it, and add in your licence key.
- 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.
- Then go to Restrict, Settings. Click the Payments tab, here’s where we connect Paypal and Stripe.
- Set your currency (the currency your Stripe and Paypal account are using), and then enable Paypal Express and Stripe.
- 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.
- 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).
- Now go back to My Selling Tools, click API Access then Add/Edit API Permissions, then View API Signature.
- 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).
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
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:
- 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.
- 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.
There are tons of options for creating a lead magnet that will entice visitors to give you their email address as a trade for something awesome like partial access to your lessons or a free email sequence of related lessons.
To track this, you need to connect your list to your site.
- Install MC4WP, activate it, and enter your licence key (if you have the paid version).
- Install MC4WP User Sync, it’s a free add-on that will tell your list when someone purchases your course or when someone signs up for your free sample subscription.
- Go to MailChimp for WP and enter your API key. If you aren’t sure where that is, click “Get your API key here” and it’ll take you the page you need in your MailChimp account.
- Go to MailChimp for WP, then User Sync.
- Enable Autosync as “yes”, select the list you want to sync with, select “no” for Double opt-in and “subscriber” for the Role to sync.
- Go into your MailChimp account in a new tab, select your list, then go to Settings, List fields and Merge tags. Add two more Text fields, one called “Subscription Level” and one called “Status”.
- Back in MailChimp for WP on the MailChimp page, click “Renew MailChimp lists”.
- In User Sync in MailChimp for WP, in the Send Additional Fields sections, this is the most important part. In “User Field” start typing “rcp_” and select “rcp_subscription_level” then to the right of “to” select, “Subscription Level” (that’s the merge field you just created in MailChimp. Click “add line” then start typing “rcp_” in the next line and select “rcp_status” and then to the right of “to” select “Status”.
- Click Save Changes.
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:
- If Subscription Level is “1”, then that person signed up for free lessons. You can create a funnel that lets them know what lessons they got, shares some success stories about the full course and then pitches them on why they should upgrade from free to paid.
- If Status is “active”, then that person paid for your course. You can send them a welcome series, or any other post-purchase educational content to help them get the most out of the course.
- If someone starts at Subscription Level “1”, then buys the course while they’re in the cue to get all the pitch emails, you should remove them from that automation sequence since they already purchased. To do this, in your automation sequence, for every email that is a pitch, set the “Segment conditions” as Subscribers that match the following conditions, then “Status” “is not” “active”. That’ll take out any buyers from your pitch emails and only pitch to people who haven’t bought yet.
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
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.
- Install WPComplete (get $15 off using PJCOURSE) and activate your licence key.
- In Settings, then WPComplete, customize your button colours and text.
- 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.
You’re set up!
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@example.com, then you could try firstname.lastname@example.org to test the free trial. And then email@example.com to buy the course in Sandbox mode with the test Stripe credit card. So it’s your firstname.lastname@example.org. 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.
Planning your online course in WordPress
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:
- 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?”
- 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 every online course can have:
- 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.
- 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.
- Actionable materials. Whether it’s PDF workbooks (boring) or interactive workbooks from OfCourseBooks (note: I used to own that company) – 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.
- 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.
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 $75/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.