WooCommerce Memberships
for Tutor LMS
Everything you need to set up, configure, and manage subscription-based membership plans that grant students access to your Tutor LMS courses. Covers installation, plan creation, student experience, and common troubleshooting.
Overview
WooCommerce Memberships for Tutor LMS enables course creators to offer subscription-based membership plans that grant students access to a defined set of courses for a recurring period. Students purchase a membership through standard WooCommerce checkout and are immediately enrolled in all courses assigned to that plan.
The plugin sits at the intersection of WordPress, WooCommerce, and Tutor LMS โ adding its own membership post type, a subscription tracking database table, and full enrollment lifecycle management including daily automated expiration handling.
What it does
- Creates membership plans as a custom post type with price and duration settings
- Auto-generates a linked WooCommerce product for each membership โ no manual product creation needed
- Assigns any number of Tutor LMS courses to each membership plan
- Enrolls active members in all assigned courses immediately upon purchase
- Displays “Get Membership” buttons on course pages for non-members
- Shows an accordion list of all courses included in the membership, with the current course highlighted
- Runs a daily cron job to find and process expired memberships automatically
- On expiration: revokes enrollment for membership-sourced enrollments while protecting individual purchases
- Admins can manually activate, expire, or cancel subscriptions from the Members page
- Integrates with the Tutor LMS Installment Payments plugin for a unified access-management ecosystem
Key benefits
- Recurring revenue model for course creators without requiring a separate subscription plugin
- Students get instant access to all courses in a membership upon purchase
- Individual course purchases are fully protected and never revoked by membership expiration
- Multi-membership support: a course can belong to multiple plans; students with any active one retain access
- Compatible with WooCommerce HPOS (High-Performance Order Storage)
- Works with Elementor via a dedicated widget, and on any page via a shortcode
Requirements
Minimum requirements
| Component | Minimum version |
|---|---|
| WordPress | 5.8 or higher |
| PHP | 7.4 or higher |
| WooCommerce | 6.0 or higher (tested up to 8.5) |
| Tutor LMS | 2.0 or higher (Free or Pro) |
Recommended environment
| Component | Recommendation |
|---|---|
| WordPress | Latest version |
| PHP | 8.0 or higher |
| WooCommerce | Latest version |
| Tutor LMS Pro | For course builder integration and advanced features |
| Elementor | For drag-and-drop widget support |
| SMTP Plugin | For reliable HTML email delivery |
| SSL Certificate | Required for WooCommerce checkout |
Required plugins
- WooCommerce
- Tutor LMS (Free or Pro)
Optional
- Elementor โ for the Membership Button drag-and-drop widget
- Tutor LMS Installment Payments (Ksajie) โ for installment + membership billing integration
Installation
Method 1: WordPress admin upload (recommended)
- Log in to your WordPress admin dashboard
- Navigate to Plugins โ Add New
- Click Upload Plugin
- Select the
woocommerce-memberships-tutor-lms.zipfile - Click Install Now, then Activate Plugin
Method 2: Manual FTP installation
- Unzip the plugin archive
- Upload the
woocommerce-memberships-tutor-lmsfolder to/wp-content/plugins/ - Navigate to Plugins โ Installed Plugins in WordPress admin and click Activate
Post-installation steps
- Activate your license when prompted after activation
- Create your first membership under Memberships โ Add New
- Assign courses to the membership via the course edit page or Tutor LMS course builder
- Flush permalinks: Settings โ Permalinks โ Save Changes (required for the My Account endpoint)
- Test checkout with the auto-generated membership product
Creating Memberships
Step 1: Create a membership plan
- Navigate to Memberships โ Add New
- Enter a descriptive title (e.g., “Monthly All-Access Plan”)
- In the Membership Details meta box, enter the Subscription Fee and Duration in months
- Click Publish
- The plugin automatically creates a hidden WooCommerce product named “Membership: [Title]” and links it to the membership
| Field | Description |
|---|---|
| Title | Name shown on the membership button and in emails |
| Subscription Fee | Price charged for the membership in your WooCommerce store currency |
| Duration (Months) | How many months the membership is valid after purchase |
| Linked WooCommerce Product | Auto-created; shown as a read-only link after first save. Edit the product to change visibility or add a description. |
Step 2: Assign courses to the membership
There are three ways to assign courses to a membership plan:
Option A โ Via Course Edit Page (Classic Editor):
- Open any course in the WordPress editor
- Find the “Membership Access” meta box in the sidebar
- Check “Enable Membership Access”
- Check the membership plan(s) this course should belong to
- Save/Update the course โ active members are immediately enrolled
Option B โ Via Tutor LMS Course Builder:
- Open the Tutor LMS course builder for any course
- The membership fields appear in the builder settings
- Toggle the enable switch and select the membership(s)
- Save โ the plugin handles this identically to the Classic Editor
Option C โ Via Membership Admin Page:
- Go to Memberships, select a membership, and open its detail page
- Use the course search box to find courses by name
- Click “Add” to assign โ active members are enrolled immediately
- Click “Remove” to unassign โ affected enrollments are marked “orphaned”
When a course is removed from a membership, its enrollments are marked “orphaned” rather than deleted immediately. They are revoked the next time that membership expires.
Purchase Flow
Standard membership checkout
- Student visits a course page that has a membership enabled
- A “Membership Option” panel appears above the enrollment button
- Student clicks “Get Membership” โ the membership product is added to cart
- Student completes WooCommerce checkout
- On payment confirmation, a subscription record is inserted in the database
- Student is enrolled in all courses assigned to the membership immediately
- Student can access all membership courses right away
Individual course purchase protection
When a student buys a course directly (not via membership), the enrollment is tagged with the source individual. Individual enrollments are never revoked by any membership expiration, regardless of whether the student also has or had a membership covering the same course.
Duplicate purchase prevention: The plugin checks for existing subscriptions with the same order ID before inserting a new row, and sets a processed flag on each order to prevent re-processing on any subsequent order status changes.
Enrollment Sources
Every enrollment managed by the plugin carries an enrollment source tag. This is central to the access-protection logic and determines whether an enrollment is revoked when a membership expires.
| Source | What it means |
|---|---|
| individual | Student purchased this course directly. Never revoked by membership expiration. |
| membership | Student was enrolled via a membership purchase. Revoked when that membership expires (unless another active membership covers the same course). |
| orphaned | Enrollment was “membership” source, but the course was later removed from the membership. Revoked on expiration. |
| installment_revoked | Set by the Installments plugin integration when an installment plan is cancelled with “revoke access” while paused by a membership. Revoked on membership expiration. |
Expiration & Access Revocation
All expiration handling is fully automated via a daily background job. No manual intervention is required once memberships are active.
How the daily cron works
A daily WordPress cron event scans for subscriptions where the status is “active” and the expiration date has passed. For each expired subscription it:
- Updates the subscription status to “expired” in the database
- Revokes course access for all enrollments with source “membership”, “orphaned”, or “installment_revoked”
- Skips any enrollments with source “individual” โ those are never touched
- Sends an expiration email to the student with a renewal link
- Adds a note to the related WooCommerce order
- Fires the
wcmt_membership_expiredaction (used by the Installments plugin to resume billing)
Multi-membership protection
Before revoking any enrollment, the plugin checks whether the student holds another active membership that also covers the same course. If they do, the enrollment is skipped โ the student retains access via the other membership. Only when no other active membership covers the course is access actually revoked.
Expiration email
The expiration email is sent via HTML email and includes the student’s name, the membership title that expired, and a renewal link that adds the membership product directly to the WooCommerce cart.
Admin Management
Navigate to WooCommerce โ Memberships โ Members (or Memberships โ Members) to access the admin interface.
Members page
The Members page shows a searchable, filterable table of all subscriptions. You can filter by status (All, Active, Expired, Cancelled), by specific membership plan, or search by username, email, or display name. Each row links through to the individual user detail page or the membership detail page.
Manually changing subscription status
| Change | What happens |
|---|---|
| Active โ Expired or Cancelled | Sets expiration date to now. Triggers immediate course access revocation for all non-individual enrollments. |
| Expired/Cancelled โ Active | Calculates a new expiration date (current time + membership duration). Re-enrolls the student in all membership courses. |
| Same โ Same | Updates the status field only; no side effects. |
Membership detail page
Accessible via the “View Members” link on the Memberships list. Shows all subscribers with their status, dates, and linked orders. Also includes the course assignment manager โ a search box to add courses and remove buttons on existing ones. Adding a course immediately enrolls all active members; removing it marks their enrollments as orphaned.
Student Experience
On a course page โ non-member
A student without an active membership sees a “Membership Option” panel showing the membership title, price, duration, a benefit line (“Access to all membership courses”), and a “Get Membership” button. An expandable accordion lists all courses included in the plan. If multiple memberships cover the course, each is shown as a separate option. A clear “or buy this course individually” separator sits below the membership section.
On a course page โ active member
Students with an active membership that covers the course see no membership buttons for that plan โ they are already enrolled. If they hold memberships that do not cover the current course, those membership options are still shown.
WooCommerce My Account โ Memberships tab
After purchasing, students can visit /my-account/memberships/ to see their active memberships with course lists and expiration dates, their expired memberships with renewal buttons, and โ if they have no memberships at all โ a listing of available plans to purchase.
After expiration
When a membership expires, the student loses access to all membership-enrolled courses unless they also purchased those courses individually or hold another active membership covering them. Their progress data is preserved throughout.
Installments Plugin Integration
When both this plugin and Tutor LMS Installment Payments are active, the two plugins communicate via WordPress actions to prevent double-charging students who have both a membership and an installment plan covering the same course.
Scenario: installment plan + membership
- Student starts an installment plan for a course
- Student separately purchases a membership that includes the same course
- Installments plugin detects the membership and pauses installment billing โ no reminders, no suspensions
- Student retains course access throughout the membership period, even if installments are not paid
- When the membership expires, the Installments plugin is notified automatically and billing resumes
Scenario: installment plan cancelled with “revoke access” while paused
- Student has an installment plan that is paused by an active membership
- Admin cancels the installment plan with the “Revoke Access” option
- The Installments plugin fires a notification to this plugin
- This plugin changes the enrollment source from “individual” to “installment_revoked”
- When the membership later expires, the daily cron finds this enrollment and revokes it โ completing the access handoff
Shortcode & Elementor
course_id Specify which course to show membership options for. Falls back to the current page’s post ID if not set.Elementor widget
A dedicated “Membership Button” widget is available in Elementor for drag-and-drop placement anywhere on a page. Widget controls let you toggle the membership title, price, duration, benefit text, and separator display, customize button and separator text, and apply full color and typography styling directly from the Elementor panel.
The plugin’s CSS is auto-enqueued on course pages and on any page detected to contain the [wcmt_membership] shortcode โ no manual script enqueuing needed.
Frequently Asked Questions
wp_membership_subscriptions database table with the correct user ID, membership ID, a dummy order ID, and the desired start and expiration dates. Set status to “active” and the student will be treated as an active member. If you need this regularly, contact support to discuss a better workflow.Troubleshooting
Before reporting an issue, enable WordPress debug logging (WP_DEBUG_LOG in wp-config.php). All plugin log entries are prefixed with [WC Memberships Tutor LMS] or [WCMT] for easy filtering.
Check the following in order:
- Is the license active? (WooCommerce โ WCMT License)
- Is membership access enabled for this course? (Check the “Membership Access” meta box on the course edit page)
- Does the course have at least one membership assigned to it?
- Is that membership published and does it have a linked WooCommerce product?
- Does the logged-in user already have an active membership covering this course? If yes, the button is correctly suppressed
- Check the browser console for JavaScript errors that might be preventing the fallback injection
Membership enrollment happens on payment confirmation โ not on order placement. Verify:
- The order contains the membership product (the product linked to the membership plan)
- Navigate to WooCommerce โ Memberships โ Members and check if a subscription row was created โ if missing, enrollment was never attempted
- Review the WordPress debug log for lines starting with “[WC Memberships Tutor LMS]”
- Check if the order was already processed โ the plugin sets a processed flag on each order to prevent duplicate handling
The daily cron job must be running. To verify:
- Use a plugin like WP Crontrol to check scheduled events โ look for
wcmt_daily_expiration_check. If missing, deactivate and reactivate the plugin to re-register it - Check that the enrollment’s source is “membership”, “orphaned”, or “installment_revoked” โ “individual” enrollments are intentionally never revoked
- Check whether the student has another active membership that also covers the same course โ multi-membership protection will skip revocation in this case
- Review the error log for any revocation skip messages
The course builder sends membership settings via the standard save_post_courses hook. If settings aren’t saving:
- Enable
WP_DEBUG_LOGand look for “[WCMT] save_course_meta triggered” in the log to confirm the hook is firing - Check that the membership fields script is loading correctly on the course builder page
- Try saving via the Classic Editor as a fallback to confirm whether the issue is specific to the course builder
The /my-account/memberships/ endpoint requires WordPress rewrites to be flushed. Go to Settings โ Permalinks โ Save Changes. If this persists, check that no other plugin is registering a conflicting “memberships” endpoint on the My Account page.
Support
Need help? Visit the support portal
If you’re experiencing an issue not covered in this documentation or the troubleshooting section, you can submit a support request through the portal. Please include the details below in your message to help us resolve your issue quickly.
Open Support Portal โWP_DEBUG_LOG in wp-config.php)