Title: CAJE Course Builder
Author: cajebuilder
Published: <strong>November 12, 2026</strong>
Last modified: November 13, 2026

---

Search plugins

![](https://s.w.org/plugins/geopattern-icon/caje-course-builder.svg)

# CAJE Course Builder

 By [cajebuilder](https://profiles.wordpress.org/cajebuilder/)

[Download](https://downloads.wordpress.org/plugin/caje-course-builder.1.0.3.zip)

 * [Details](https://wordpress.org/plugins/caje-course-builder/#description)
 * [Reviews](https://wordpress.org/plugins/caje-course-builder/#reviews)
 *  [Installation](https://wordpress.org/plugins/caje-course-builder/#installation)
 * [Development](https://wordpress.org/plugins/caje-course-builder/#developers)

 [Support](https://wordpress.org/support/plugin/caje-course-builder/)

## 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, and `wp cajecb sweep --now=…` to walk
   a schedule without waiting. `--student` is the student; WP-CLI already uses `--
   user` for 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 in `src/`.

### 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 on`
   checkout.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](https://stripe.com/legal/ssa) and [Privacy Policy](https://stripe.com/privacy).

**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](https://www.youtube.com/t/terms) and Google’s
[Privacy Policy](https://policies.google.com/privacy); Vimeo’s [Terms](https://vimeo.com/terms)
and [Privacy Policy](https://vimeo.com/privacy).

The plugin makes no other external requests, and sends no usage data.

### Credits

The curriculum screen’s drag and drop uses [dnd kit](https://dndkit.com/) (MIT license).

## Screenshots

[⌊The curriculum screen: drag lessons between weeks.⌉⌊The curriculum screen: drag
lessons between weeks.⌉[

The curriculum screen: drag lessons between weeks.

[⌊Course settings with the live schedule summary.⌉⌊Course settings with the live
schedule summary.⌉[

Course settings with the live schedule summary.

[⌊A course page for an enrolled student, with locked weeks and their unlock dates.⌉⌊
A course page for an enrolled student, with locked weeks and their unlock dates.⌉[

A course page for an enrolled student, with locked weeks and their unlock dates.

[⌊The My Courses dashboard.⌉⌊The My Courses dashboard.⌉[

The My Courses dashboard.

[⌊Courses → Setup, from install to a test purchase.⌉⌊Courses → Setup, from install
to a test purchase.⌉[

Courses  Setup, from install to a test purchase.

## 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

 1. Install and activate the plugin.
 2. Go to **Courses  Setup** and follow the steps.
 3. In **Settings  General**, set your timezone to a city (not a UTC offset) so unlock
    times follow daylight saving.
 4. 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, and `wp 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
the `CAJECB_NOW` constant in wp-config.php.

### Can I test payments on my own computer?

Yes. Use Stripe test mode and run `stripe listen --forward-to` with 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.

Contributors

 *   [ cajebuilder ](https://profiles.wordpress.org/cajebuilder/)

[Translate “CAJE Course Builder” into your language.](https://translate.wordpress.org/projects/wp-plugins/caje-course-builder)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/caje-course-builder/),
check out the [SVN repository](https://plugins.svn.wordpress.org/caje-course-builder/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/caje-course-builder/)
by [RSS](https://plugins.trac.wordpress.org/log/caje-course-builder/?limit=100&mode=stop_on_copy&format=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-open` and `is-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_style` instead 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`, `status` and `revoke` take `--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.

## Meta

 *  Version **1.0.3**
 *  Last updated **2 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.6 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [courses](https://wordpress.org/plugins/tags/courses/)[drip content](https://wordpress.org/plugins/tags/drip-content/)
   [lms](https://wordpress.org/plugins/tags/lms/)[online course](https://wordpress.org/plugins/tags/online-course/)
   [stripe](https://wordpress.org/plugins/tags/stripe/)
 *  [Advanced View](https://wordpress.org/plugins/caje-course-builder/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/caje-course-builder/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/caje-course-builder/reviews/)

## Contributors

 *   [ cajebuilder ](https://profiles.wordpress.org/cajebuilder/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/caje-course-builder/)