Choosing a WordPress Course Plugin
Most people shopping for an LMS actually need access control, and most people shopping for a membership plugin actually need course structure. Work out which problem you have before comparing feature lists.
The category you need is decided by what you are selling, not by what you are teaching. Selling one course outright, selling a subscription to a growing library, and adding lessons to an existing shop are three different problems, and the plugins that solve them well are not the same plugins.
Feature comparisons are the wrong place to start because every product in this space lists roughly the same features. The differences appear in how enrolment, billing and progress are modelled underneath.
The four kinds of tool in this category
| Kind of tool | Core job | Choose it when |
|---|---|---|
| Learning management system | Course, lesson and quiz structure with progress tracking | Teaching is the point: sequencing, assessment, completion |
| Membership plugin | Gating content behind recurring access levels | You sell ongoing access to a library, not a finite course |
| Ecommerce course add-on | Turning a course into a purchasable product | You already run a shop and a course is another SKU |
| Cohort or community tool | Scheduled group delivery and discussion | Value comes from the group and the calendar, not the material |
An LMS asked to run tiered recurring subscriptions ends up with a bolt-on billing layer. A membership plugin asked to track lesson completion and grade quizzes ends up with shortcodes pretending to be a curriculum. Both work badly enough that people blame the plugin rather than the mismatch.
Criteria that actually separate products
- The content model. Are lessons real posts you can edit in the block editor, or rows in a proprietary builder? The first survives a plugin change; the second does not.
- Enrolment logic. How a student is granted and revoked access, and what happens when a subscription lapses mid-course.
- Progress and completion. Whether progress is per-lesson, per-topic or per-quiz, and whether it can be reset or manually adjusted by an administrator.
- Assessment. Question types, retakes, pass marks, timed attempts, and whether results are visible to anyone other than the learner.
- Drip scheduling. Fixed dates versus days-since-enrolment. Cohorts need the first; evergreen courses need the second.
- Group and team enrolment. Selling ten seats to a company is a different transaction from ten individual sales, and many plugins cannot express it.
- Payments. One-off, instalments, recurring, coupons, tax handling and refunds. If any of these are handled by a separate extension, price that in.
- Reporting and export. You will be asked who completed what. Check the export format before you need it.
- Roles. Instructors who can edit their own courses but not the site need real capabilities, not a shared administrator login. See WordPress user roles explained.
Video, and why it decides more than people expect
Course sites are video sites. Serving lesson video from your own uploads directory is the most common cause of a course platform that feels broken: seeking is slow, mobile connections stall, and one popular launch exhausts the hosting bandwidth allowance.
Use a video host and embed the player, choosing one that supports private or domain-restricted playback if the material is paid. The mechanics are covered in adding video to a WordPress blog.
Performance and hosting
Course plugins are logged-in-user software. Every lesson page is personalised, which means it cannot be served from a normal page cache, and progress writes hit the database on every lesson view. That changes what good hosting looks like, and it changes cache configuration, because caching a logged-in lesson page will show one student another student's progress. Whichever plugin you pick, confirm its exclusions are respected by your cache plugin.
Enrolment confirmations, drip notifications and certificates all go out by email, so verify the site can send mail before blaming the plugin — WordPress not sending emails covers the usual causes.
Test it before you enrol anyone
On a staging copy, with a real payment in test mode:
- Buy a course as a logged-out visitor and complete the account creation flow.
- Confirm the purchase email and the login credentials both arrive at an external address.
- Work through a lesson, mark it complete, and check the progress display.
- Log out, log back in, and confirm progress persisted.
- Take a quiz, fail it, and retake it.
- Cancel or expire the subscription and confirm access is actually revoked.
- Refund the order and confirm enrolment is removed.
- Open a lesson URL directly while logged out — it must not be readable.
- View the same lesson in a private window as a second student to prove nothing is cached across users.
- Export the student list and check the file contains what you need.
Step eight catches gating that only hides links rather than protecting content, which is worryingly common.
Where to start
If teaching structure is the product, start with an LMS and add billing. If ongoing access is the product, start with a membership plugin and accept simpler course structure. If courses are a sideline to an existing shop, an add-on on top of WooCommerce keeps one checkout and one order history. Whichever route you take, take a backup before installing anything, because course plugins create database tables and rarely remove them cleanly.
Frequently asked
- Only if you sell recurring access to a library of courses rather than individual courses. A single course sold once is handled by the LMS or an ecommerce checkout on its own, and stacking two access systems is a common source of learners who can pay but cannot get in.
- No. Video files stored in the WordPress uploads directory are served by your web server with no adaptive bitrate, no bandwidth headroom and no protection against sharing. Use a video host and embed the player, even if the courses themselves are private.
- Rarely without work. Lessons are usually custom post types that can be exported, but enrolments, progress records and quiz results live in custom tables that are specific to each plugin. Assume a migration means students restart their progress unless the destination plugin ships an importer for your current one.