Description
CAJE Course Builder is for creators who release a video course or series a little at a time. Each student’s schedule starts when they buy: the first lessons open right away, the next ones unlock after the interval you choose (every day, every 3 days, every week, or any number of days), and access ends a set number of days after the last unlock. It feels like a cohort, without running one.
Unlocks on your schedule, for each student
- Build the curriculum by dragging lessons into weeks.
- Unlocks happen at a time of day you choose, in your site’s timezone, and stay correct across daylight saving changes.
- A live summary shows exactly when the last week unlocks and when access ends, e.g. “Week 6 unlocks on day 35. Access ends on day 125.”
- Locked lessons show their title and unlock date, never their content. Videos are only sent to the page once a student is allowed to watch.
Selling with Stripe
- New students create an account right on the course page (name, email, password) and go straight to checkout. No confirmation email to dig out first.
- Stripe’s hosted Checkout: card details never touch your site.
- Stripe Tax support for sales tax and VAT.
- The webhook is set up for you when you save your key.
- Refund from WordPress; access ends when Stripe confirms the refund.
- Missed webhooks are caught by an hourly check with Stripe.
- Free courses get an “Enroll for free” button.
Emails students actually need
- A welcome email, one each time a week unlocks, reminders before access ends (30, 7 and 1 days by default) and one when it ends.
- Each email goes out once, even if scheduled tasks run late or twice.
- Sent through
wp_mail(), so your SMTP plugin applies. Templates can be overridden in your theme.
Student dashboard
- A My Courses block and
[cajecb_my_courses]shortcode: unlocked weeks, when the next one unlocks, and days of access left. - Students land there after logging in.
Set up in minutes
Courses Setup walks you from a fresh install to a test purchase: basics, Stripe, student accounts, emails and your first course, then a checklist of anything still missing.
Video
Embed YouTube or Vimeo videos per lesson. For protected video that can’t be shared, the separate Pro add-on adds Bunny Stream uploads from the lesson editor with signed, expiring player links.
For developers
- WP-CLI:
wp cajecb enroll --student=…,wp cajecb status --student=… --now=…to see any student’s access on any date, andwp cajecb sweep --now=…to walk a schedule without waiting.--studentis the student; WP-CLI already uses--userfor the account that runs the command. - Hooks for gateways, video providers, features, merge tags and email content.
- Theme-overridable templates in
caje-course-builder/. - The screens in
build/are compiled. The readable source is included insrc/.
Privacy and external services
This plugin stores, in your WordPress database: enrollments (user, course, dates and status), orders (user, course, amount, tax, currency, status and the Stripe Checkout Session and payment IDs) and a log of which course emails each student was sent. It adds suggested text to your privacy policy, supports WordPress’s personal data export and erasure tools, and removes a user’s enrollments when the user is deleted. Orders are kept as sales records.
It connects to these services:
Stripe (payments), only after you add a Stripe secret key:
- When a logged-in buyer clicks Buy, the plugin creates a Checkout Session at
api.stripe.com, sending the course name, price, currency, the buyer’s email address and WordPress user ID, and your site’s address. The buyer then pays oncheckout.stripe.com. - When you save your key, or check the connection, it creates or checks the webhook endpoint for your site and reads your Stripe Tax status.
- Hourly, it asks Stripe for Checkout Sessions from the last 72 hours to catch any payment whose webhook didn’t arrive.
- When you click Refund, it creates a refund for that payment.
- Stripe’s Services Agreement and Privacy Policy.
YouTube and Vimeo (video embeds), only on lessons you’ve given a YouTube or Vimeo link, and only for students allowed to watch them: the student’s browser loads the player from www.youtube-nocookie.com or player.vimeo.com (with Vimeo’s “do not track” option). YouTube’s Terms and Google’s Privacy Policy; Vimeo’s Terms and Privacy Policy.
The plugin makes no other external requests, and sends no usage data.
Credits
The curriculum screen’s drag and drop uses dnd kit (MIT license).
Screenshots





Blocks
This plugin provides 1 block.
- My Courses The logged-in student's courses: unlocked weeks, the next unlock and days of access left.
Installation
- Install and activate the plugin.
- Go to Courses Setup and follow the steps.
- In Settings General, set your timezone to a city (not a UTC offset) so unlock times follow daylight saving.
- For dependable email timing on quiet sites, have your host run WordPress cron from the server. Courses Settings Emails shows how.
FAQ
-
When do new lessons unlock?
-
At the unlock time you choose (8:00 am by default) in your site’s timezone, on the day it’s due. You set the interval per course in days: with 7, week 2 unlocks 7 days after purchase and week 3 after 14; with 3, every 3 days. You can also give a single lesson its own unlock day.
-
Can I test a schedule without waiting weeks?
-
Yes.
wp cajecb status --student=… --now="2026-12-01 09:00"shows what a student can see at any moment, andwp cajecb sweep --now=…sends the emails that would be due then. Enroll and revoke take the same--student(an ID, email or login) and--course. On non-production sites you can also set the plugin’s clock with theCAJECB_NOWconstant in wp-config.php. -
Can I test payments on my own computer?
-
Yes. Use Stripe test mode and run
stripe listen --forward-towith the webhook URL shown in Courses Settings Payments, then paste the signing secret it prints. -
Are embedded YouTube or Vimeo videos protected?
-
No. The plugin only puts the player on the page for students who are allowed to watch, but anyone who has the video’s link can watch it on YouTube or Vimeo. Use unlisted or private videos with domain restrictions, or the Pro add-on’s Bunny Stream integration for protected video.
-
What happens when I delete the plugin?
-
Scheduled tasks are removed. Your courses, enrollments, orders and settings are kept unless you turn on “Delete all … when the plugin is deleted” in Courses Settings General. The webhook in your Stripe account isn’t removed; delete it in Stripe Developers Webhooks.
Reviews
There are no reviews for this plugin.
Contributors & Developers
“CAJE Course Builder” is open source software. The following people have contributed to this plugin.
ContributorsTranslate “CAJE Course Builder” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by RSS.
Changelog
1.0.3
- A new look for course pages, lessons, the locked-lesson message, My Courses and the sign-up form: calm panels, a week timeline and clear open and locked states, on your theme’s own font.
- New Accent color setting in Courses Settings General. Button text switches between white and dark to stay readable.
- Templates add state classes such as
is-openandis-locked. Templates copied to your theme keep working.
1.0.2
- Signup limits from one connection stay in force when several requests arrive together.
- A sweep handles a fixed number of emails per run, including ones it only records as skipped, and later runs finish the rest without sending anything twice.
- After you log in or register to buy, checkout continues only with a nonce issued for that login, plus the one-time token from your browser.
1.0.1
- Setup screen styles are loaded with
wp_enqueue_styleinstead of a style tag in the page. - Actions that change enrollments, settings, or setup check a nonce and a capability. Request values are unslashed and sanitized.
- Course pages, locked lessons, and My Courses escape the HTML they add to the page, including video players.
- The setup reminder on the Courses screen is dismissible and stays dismissed for that user.
1.0.0
- First public release: weekly drip schedules with expiry, Stripe Checkout with Stripe Tax and refunds, student emails, the My Courses dashboard, the setup wizard and WP-CLI commands.
- Lessons a visitor can’t watch stay out of search, including the REST search endpoints.
wp cajecb enroll,statusandrevoketake--student(WP-CLI reserves--user).- A payment that doesn’t match the course price tells the buyer and emails the site owner.
- Returning from login continues to checkout only with a short-lived token from this site.
- Days of access left follow calendar dates in the site timezone, including across daylight saving.