Tutor LMS
Free Trial
Everything you need to set up and manage time-limited free trials for your Tutor LMS courses and bundles. Covers installation, configuration, the student trial experience, eligibility rules, and troubleshooting.
Overview
Tutor LMS Free Trial adds time-limited, zero-cost trial access to Tutor LMS courses and bundles sold through WooCommerce. Administrators enable a trial on any course or bundle, set the duration in days, and the plugin handles everything else โ creating a hidden $0 WooCommerce product, managing enrollments, sending expiration emails, and automatically revoking access when the trial ends.
A strict one-trial-per-student-per-course policy is enforced throughout, with a full admin interface for monitoring all trials and granting resets when needed.
Key features at a glance
- Enable trials per course or bundle with a configurable duration of 1โ365 days
- Auto-creates a hidden $0 WooCommerce product for each trial-enabled course โ no manual setup
- Displays a “Start Free Trial” button above the purchase button on course and bundle pages
- Active trial shows a notice with days remaining and an Upgrade Now button
- Hourly cron automatically expires trials and revokes course access when the end date passes
- Seamless conversion when a student purchases the full course during or after their trial
- Full course bundle support โ a single bundle trial enrolls the student in every course inside
- Admin panel under Tutor LMS โ Free Trials for monitoring, cancelling, and resetting trials
- Shortcode and Elementor widget for embedding the trial button anywhere
- Integrates with Tutor LMS Installments and WooCommerce Memberships for Tutor LMS
Requirements
Minimum requirements
| Component | Minimum version |
|---|---|
| WordPress | 5.8 or higher |
| PHP | 7.4 or higher |
| WooCommerce | 6.0 or higher |
| Tutor LMS | 2.0 or higher (Free or Pro) |
Recommended environment
- PHP 8.0 or higher for improved performance
- Latest stable WordPress and WooCommerce releases
- Tutor LMS Pro โ required for course bundle support
- Elementor โ for the Free Trial Button widget
- SMTP plugin โ for reliable trial expiration email delivery
- SSL certificate on the site
Optional integrations
- Tutor LMS Installment Payments (Ksajie) โ enables installment plan upgrade options inside the active trial notice
- WooCommerce Memberships for Tutor LMS (Ksajie) โ membership course access automatically converts an active trial to purchased status
Installation
Method 1: WordPress admin upload (recommended)
- Log in to your WordPress admin and navigate to Plugins โ Add New โ Upload Plugin
- Choose the
tutor-lms-free-trial.zipfile and click Install Now - Click Activate Plugin
- Navigate to Tutor LMS โ TFT License to enter and activate your license key
Method 2: Manual FTP installation
- Extract the ZIP and upload the
tutor-lms-free-trialfolder to/wp-content/plugins/ - In WordPress admin, activate Tutor LMS Free Trial under Plugins
- Enter your license key on the TFT License page
What happens on activation
- The
wp_tutor_free_trialsdatabase table is created automatically - The hourly expiration cron event is scheduled
- A backward compatibility migration runs: existing enrollments without a source tag are tagged as “individual” so the plugin never accidentally revokes them
- Rewrite rules are flushed
Enabling Free Trial on a Course or Bundle
Via Classic Editor (courses & bundles)
- Open the course or bundle edit screen in WordPress admin
- Locate the Free Trial meta box in the sidebar
- Check Enable Free Trial
- Set Trial Duration (Days) โ default is 7 days, range is 1โ365
- Publish or Update the course/bundle
Via Tutor LMS Course Builder or Bundle Builder
- Open the course or bundle in the Tutor LMS builder
- A floating Free Trial panel appears in the builder interface
- Toggle Enable Free Trial and enter the duration in days
- Save or Update โ settings sync automatically with the course meta
What the plugin creates automatically
When a free trial is enabled on a course or bundle, the plugin automatically creates a hidden WooCommerce product with a $0 price, marked as virtual and sold individually, with catalog visibility set to hidden. This product is used to run trials through the standard WooCommerce cart and checkout flow. If this product is ever deleted or unpublished, the plugin recreates it automatically on the next page load.
Student Trial Flow
Starting a trial (individual course)
- Student visits the course page and sees the Start Free Trial button above the purchase button
- Clicking the button adds the $0 trial product to the WooCommerce cart
- At checkout, the plugin re-validates eligibility โ license active, trial enabled, student hasn’t used a trial for this course before
- On order completion, the trial record is created and the student is enrolled in the course immediately
- $0 orders auto-complete โ no payment step is needed for the student
Starting a trial (bundle)
- Student clicks Start Free Trial on the bundle page
- At checkout, eligibility is checked across the entire bundle โ blocked if the student has trialed the bundle or any course inside it before
- On order completion, a bundle trial record is created, then individual trial records are created for each course in the bundle with the same duration
- Courses the student already purchased individually are skipped โ their existing access is left untouched
- Student is enrolled in all bundle courses immediately
During an active trial
- The course page shows an Active Trial notice with the number of days remaining and the exact expiry date
- An Upgrade Now button links directly to the full purchase product
- If the Installments plugin is active, installment plan options also appear inside the active trial notice
- For bundle trials, a “Purchase to keep access” message is shown on each course page directing the student to the bundle page
- The student has full access to all course content during the trial period
Trial Eligibility Rules
The plugin enforces a strict one-trial-per-student-per-course policy. Eligibility is checked both when the button is displayed and again at checkout to prevent any manipulation.
For individual courses
| Situation | Trial button shown? |
|---|---|
| Student has no record for this course | Yes |
| Student has a direct-purchase record (bought full access) | No โ UI hidden entirely |
| Student has an active trial | No โ Active Trial notice shown |
| Student has an expired or cancelled trial | No โ Trial Ended notice shown |
| Student has a converted trial | No โ UI hidden entirely |
| Student trialed this course as part of a bundle | No โ Trial Ended notice shown |
| Admin reset the trial | Yes โ button shown again |
For bundles
| Situation | Trial button shown? |
|---|---|
| Student has no record for this bundle and no record for any course in it | Yes |
| Student has a direct-purchase record for the bundle | No |
| Student has actually trialed any course in the bundle (not just direct-purchased) | No โ blocked |
| Student previously trialed a course from this bundle individually | No |
| Student directly purchased individual courses (without trialing them) | Yes โ direct purchases don’t block a bundle trial |
Trial States
Each trial record has one of six statuses that determine what the student sees and whether they can start a new trial.
| Status | Meaning | Trial button shown? |
|---|---|---|
| active | Trial is running; student has full course access | No โ Active Trial notice shown instead |
| expired | Trial end date passed; cron revoked enrollment | No โ Trial Ended notice shown |
| cancelled | Admin manually cancelled the trial | No โ Trial Ended notice shown |
| converted | Student purchased full access during or after trial | No โ UI hidden completely |
| direct-purchase | Student bought without a trial, or was enrolled by admin | No โ UI hidden completely |
| reset | Admin reset the record; student may trial again | Yes โ button shown again |
Expiration & Automation
Trial expiration is fully automated via an hourly background cron job. No manual intervention is required once a trial is active.
How the cron works
Every hour, the plugin scans for active trial records where the end date has passed. For each expired trial it:
- Updates the trial status to “expired”
- Revokes the student’s course enrollment (sets the enrollment post status to “cancel”)
- For bundle trials: processes each course in the bundle individually and also cancels the individual course-level trial records
- Sends an expiration email to the student with the course name and a direct purchase link
- Adds a note to the associated WooCommerce order
The cron event is self-healing โ if it is ever missing from the WordPress schedule, the plugin automatically re-registers it. For production sites with WP-Cron disabled, set up a real server cron to call wp-cron.php every hour to ensure timely expiration.
Purchase Conversion
When a student purchases the full course or bundle, the plugin seamlessly converts their trial record regardless of the trial’s current state.
Conversion scenarios
- Purchase during active trial โ trial status is set to “converted” and the enrollment source is updated from “free_trial” to “purchase”. The student retains uninterrupted access.
- Purchase after trial expired or was cancelled โ trial status is still set to “converted” and the standard Tutor LMS purchase flow re-enrolls the student.
- Purchase with no prior trial โ a “direct-purchase” record is created for this student and course, permanently blocking future trial eligibility.
- Membership access granted โ when the WooCommerce Memberships plugin grants course access, the plugin treats this as a conversion too.
Bundle Support
Course bundles (Tutor LMS Pro) receive full first-class support. Enabling a free trial on a bundle applies to the entire bundle โ all courses inside are included in a single trial.
How bundle trials work
- A single bundle trial record is created along with individual course trial records for every course in the bundle, all sharing the same trial duration
- Courses the student already purchased individually are skipped โ their existing enrollment and access are never touched
- Bundle-created course trials are flagged as “Managed by bundle” in the admin โ they cannot be cancelled or managed individually, only through the parent bundle trial record
- On expiration, all course enrollments tagged as trial-sourced are revoked atomically as a single operation
Multi-bundle protection
A student who trialed any course inside a bundle cannot trial that bundle again. Conversely, if a student trialed a bundle, they cannot then trial any of the individual courses inside it separately. Direct purchases of individual courses (without having trialed them) do not block a bundle trial.
Bundle support requires Tutor LMS Pro. The course-bundle post type and Bundle Builder are Pro features.
Admin Management
Navigate to Tutor LMS โ Free Trials to access the admin interface.
Free Trials page
Displays a filterable, searchable table of all trial records. You can filter by status (All, Active, Expired, Cancelled, Converted, Direct Purchase) and search by student display name or login. Each row shows the student, course, item type, start and end dates, days remaining, and a color-coded status badge.
Cancel action
Available for active trials. Cancelling a trial immediately revokes the student’s enrollment and sets the trial status to “cancelled”. For bundle-created course trial records, the cancel button is hidden โ these must be managed through the parent bundle trial row.
Reset action
Available for expired and cancelled trials. Resetting a trial allows the student to start a new free trial for that course or bundle by setting the status to “reset” and making the trial button visible again on the course page.
Reset does not re-enroll the student. They must click the “Start Free Trial” button again themselves to begin the new trial.
Plugin Integrations
Tutor LMS Installment Payments
When the Installments plugin is active and the full course product has installment plans configured, an upgrade form with installment plan options appears directly inside the active trial notice on the course page. Students can choose to convert their trial to an installment payment plan without leaving the course page.
WooCommerce Memberships for Tutor LMS
When a student’s membership grants them access to a course they are currently trialing, the trial is automatically converted โ status set to “converted” and enrollment source updated to “purchase”. This prevents any awkward state where a student holds both an active trial and an active membership for the same course.
Shortcode & Elementor Widget
course_id Optional. Specify a course or bundle ID to display the trial UI for. Falls back to the current page’s post ID if not set.Elementor widget
A Free Trial Button widget is available in Elementor for drag-and-drop placement anywhere on a page. Widget controls include: button text, toggle to show/hide the trial duration, toggle to show/hide the separator between the trial button and the purchase button, button color, and text color. The widget respects all trial eligibility rules automatically.
Both the shortcode and the widget automatically enqueue the necessary frontend CSS โ no manual script or style registration is needed.
Frequently Asked Questions
Troubleshooting
Before reporting an issue, enable WordPress debug logging by adding the following to your wp-config.php:
All plugin log entries are prefixed with [TFT], [TFT Bundle], [TFT Cron], [TFT Admin], or [TFT Migration] for easy filtering in your debug log.
Check the following in order:
- Verify the license is active โ navigate to Tutor LMS โ TFT License and confirm it shows “Valid” in green
- Confirm free trial is enabled for the course (check the Free Trial meta box in the course editor)
- Make sure the course is published โ draft and private courses do not show the trial button
- Check that the student is not already enrolled, does not have a direct-purchase record, and has not previously used a trial for this course or via a bundle
- Check the browser console for JavaScript errors that may prevent the fallback UI injection
This usually indicates a date or duration issue. Verify:
- Check the trial record in Tutor LMS โ Free Trials โ confirm the end date is set correctly to start date plus the configured trial days
- Confirm that
_tft_trial_daysis correctly saved on the course post (check via a post meta viewer plugin) - Check whether the hourly cron ran immediately after enrollment on a heavily cached host โ this is rare but possible
The hourly cron must be running. Verify:
- Use the WP Crontrol plugin to check scheduled events โ look for
tft_hourly_expiration_check. If missing, deactivate and reactivate the plugin to re-register it - Check that
DISABLE_WP_CRONis not set totruein yourwp-config.php - On production sites with WP-Cron disabled, set up a real server cron job to call
wp-cron.phpevery hour - Check the debug log for
[TFT Cron]entries to confirm the cron is actually running
The trial product is recreated automatically on every page view if it is missing or unpublished. If the product is in the trash:
- Manually restore it from WooCommerce โ Products by searching for “Free Trial โ [Course Name]”
- After restoring, the product ID link on the course is restored automatically on the next page load
Verify:
- Ensure Tutor LMS Pro is active โ bundles are a Pro-only feature
- Confirm
bundle-course-idsis populated on the bundle post (inspect with a meta viewer plugin) - Check the debug log for
[TFT Bundle]entries โ every course enrollment attempt is logged individually
Check the debug log for [TFT] save_course_meta triggered for course: X entries to confirm the save hook is firing. Also verify:
- Check your browser’s Network tab to confirm the floating panel script is loading correctly
- Try saving via the Classic Editor as a fallback โ if settings save there, the issue is specific to the Course Builder
- If settings appear to save but don’t reload into the builder, confirm the Course Builder API response includes the trial fields
Support
Need help? Visit the support portal
If you’re experiencing an issue not covered in this documentation or the troubleshooting section, submit a support request through the portal. Please include the details below to help us resolve your issue as quickly as possible.
Open Support Portal โwp-content/debug.log prefixed with [TFT]