WC Memberships Documentation

Documentation โ€” WooCommerce Memberships for Tutor LMS
WooCommerce Memberships for Tutor LMS โ€” Documentation
Plugin Documentation

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.

๐Ÿ“ฆ Version 5.2.22 ๐Ÿ”Œ Requires: WooCommerce + Tutor LMS โœ… HPOS Compatible

Ready to get started?

One-time payment ยท Lifetime updates ยท Secure checkout via WooCommerce

Purchase the Plugin โ€” $149 โ†’
Section 1

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
Section 2

Requirements

Minimum requirements

ComponentMinimum version
WordPress5.8 or higher
PHP7.4 or higher
WooCommerce6.0 or higher (tested up to 8.5)
Tutor LMS2.0 or higher (Free or Pro)

Recommended environment

ComponentRecommendation
WordPressLatest version
PHP8.0 or higher
WooCommerceLatest version
Tutor LMS ProFor course builder integration and advanced features
ElementorFor drag-and-drop widget support
SMTP PluginFor reliable HTML email delivery
SSL CertificateRequired for WooCommerce checkout

Required plugins

Optional

  • Elementor โ€” for the Membership Button drag-and-drop widget
  • Tutor LMS Installment Payments (Ksajie) โ€” for installment + membership billing integration
Section 3

Installation

Method 1: WordPress admin upload (recommended)

  1. Log in to your WordPress admin dashboard
  2. Navigate to Plugins โ†’ Add New
  3. Click Upload Plugin
  4. Select the woocommerce-memberships-tutor-lms.zip file
  5. Click Install Now, then Activate Plugin

Method 2: Manual FTP installation

  1. Unzip the plugin archive
  2. Upload the woocommerce-memberships-tutor-lms folder to /wp-content/plugins/
  3. Navigate to Plugins โ†’ Installed Plugins in WordPress admin and click Activate

Post-installation steps

  1. Activate your license when prompted after activation
  2. Create your first membership under Memberships โ†’ Add New
  3. Assign courses to the membership via the course edit page or Tutor LMS course builder
  4. Flush permalinks: Settings โ†’ Permalinks โ†’ Save Changes (required for the My Account endpoint)
  5. Test checkout with the auto-generated membership product
Section 4

Creating Memberships

Step 1: Create a membership plan

  1. Navigate to Memberships โ†’ Add New
  2. Enter a descriptive title (e.g., “Monthly All-Access Plan”)
  3. In the Membership Details meta box, enter the Subscription Fee and Duration in months
  4. Click Publish
  5. The plugin automatically creates a hidden WooCommerce product named “Membership: [Title]” and links it to the membership
FieldDescription
TitleName shown on the membership button and in emails
Subscription FeePrice charged for the membership in your WooCommerce store currency
Duration (Months)How many months the membership is valid after purchase
Linked WooCommerce ProductAuto-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):

  1. Open any course in the WordPress editor
  2. Find the “Membership Access” meta box in the sidebar
  3. Check “Enable Membership Access”
  4. Check the membership plan(s) this course should belong to
  5. Save/Update the course โ€” active members are immediately enrolled

Option B โ€” Via Tutor LMS Course Builder:

  1. Open the Tutor LMS course builder for any course
  2. The membership fields appear in the builder settings
  3. Toggle the enable switch and select the membership(s)
  4. Save โ€” the plugin handles this identically to the Classic Editor

Option C โ€” Via Membership Admin Page:

  1. Go to Memberships, select a membership, and open its detail page
  2. Use the course search box to find courses by name
  3. Click “Add” to assign โ€” active members are enrolled immediately
  4. 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.

Section 5

Purchase Flow

Standard membership checkout

  1. Student visits a course page that has a membership enabled
  2. A “Membership Option” panel appears above the enrollment button
  3. Student clicks “Get Membership” โ€” the membership product is added to cart
  4. Student completes WooCommerce checkout
  5. On payment confirmation, a subscription record is inserted in the database
  6. Student is enrolled in all courses assigned to the membership immediately
  7. 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.

Section 6

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.

SourceWhat 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.
Section 7

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_expired action (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.

Section 8

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

ChangeWhat happens
Active โ†’ Expired or CancelledSets expiration date to now. Triggers immediate course access revocation for all non-individual enrollments.
Expired/Cancelled โ†’ ActiveCalculates a new expiration date (current time + membership duration). Re-enrolls the student in all membership courses.
Same โ†’ SameUpdates 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.

Section 9

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.

Section 10

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
Section 11

Shortcode & Elementor

[wcmt_membership]
Renders the full membership button panel on any page or post. Respects membership visibility rules โ€” already-active members do not see the button for their plan.
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.

Section 12

Frequently Asked Questions

Yes. A course can be assigned to any number of membership plans. Students who hold any active membership that includes the course will be enrolled. The multi-membership protection logic ensures that if one membership expires, access is not revoked as long as another active membership also covers the course.
The individual purchase is tracked with enrollment source “individual”. Individual enrollments are never revoked by membership expiration. When the membership expires, the student retains full course access because of their individual purchase โ€” their enrollment is left completely untouched.
Each purchase creates a new subscription row. The old expired row remains with “expired” status. This means a student can have multiple historical subscription records, which is useful for tracking their payment history. The active subscription is always the most recent one with “active” status.
The plugin does not have a built-in trial period. However, you can create a separate “Trial Membership” with a $0 price and a short duration (e.g., 1 month). Students can only purchase it once โ€” re-purchasing a $0 product is possible but the short duration limits abuse naturally. For more robust trial management, contact support to discuss your use case.
The plugin creates one-time subscriptions โ€” there is no auto-renewal built in. Students must manually re-purchase a membership when it expires. For auto-renewal, a WooCommerce Subscriptions integration would be needed; contact support if this is a requirement.
The membership post is deleted along with its linked WooCommerce product. Subscription rows referencing the deleted membership remain in the database but are effectively orphaned โ€” they will not be processed by the cron job and students will retain their current enrollment state until it is manually adjusted.
Yes. The plugin explicitly declares HPOS (High-Performance Order Storage) compatibility. All order meta operations use the WooCommerce API rather than direct database queries, ensuring full compatibility with both HPOS and legacy order storage.
Not through the admin UI directly. However, you can insert a row manually into the 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.
Section 13

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.

! No membership button appearing on course page

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
! Student not enrolled after purchase

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
! Enrollments not revoked after expiration

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
! Course builder fields not saving

The course builder sends membership settings via the standard save_post_courses hook. If settings aren’t saving:

  • Enable WP_DEBUG_LOG and 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
! My Account Memberships tab returns 404

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.

Section 14

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 โ†’
Your WordPress version
Your PHP version
Your WooCommerce version
Your Tutor LMS version
Relevant lines from your WordPress debug log (enable with WP_DEBUG_LOG in wp-config.php)
A clear description of the steps to reproduce the issue