Store Builder

Courses app

Sell online courses through the cart and payment gateways you already run — the only new thing is the ledger of who may watch.

Manage → Apps has a Courses card on the Built-in shelf:

Sell online courses: a curriculum, the products that unlock it, and who may watch.

Install it and your store can build a curriculum, sell it, and keep everyone else out — without a second payment path anywhere.

The thing to understand first: a course is not a thing you sell

What sells is still a product. A course is linked to one or more products on the Products tab, and a shopper buys a course exactly the way they buy a t-shirt: same cart, same discount codes, same seven gateways, same refunds, same Manage → Orders.

That sounds like an implementation detail and is actually what you work with daily: every selling trick you already know applies to courses. One course sells at several prices (early-bird, student, partner) by linking more products; one product unlocking several courses is a bundle.

The one genuinely new thing is the entitlement ledger — who may open which course, and until when. Every gate in the app reads that one list.

Installing creates three pages

On install the app creates the pages you are missing and names them in the confirmation:

Page What it is for
Course page The template that renders /courses/<slug>. Without it every course you publish is a 404.
Courses (/courses) The grid that lists them.
Learning (/learn) The player. One page serves every course.

It never overwrites. If you already built your own course page, yours is kept and only the missing ones are created. Installing again creates nothing.

If you installed Courses before this existed, the app screen offers Create missing pages — one click. The button appears only when something is actually missing.

Building the curriculum

Manage → Apps → Courses → Add course, then open it. The Curriculum tab is where chapters and lessons go.

Every lesson has a Lesson type — Video, Text, Quiz, Download, Live session — and the type decides what the player shows:

  • Video: fill in the video link. YouTube and Vimeo links are embedded, any other URL plays directly. Leave it empty and the player drops the video frame rather than showing an empty box — a black box is what a student reads as "the video is broken".
  • Text: the lesson body, shown under the video.
  • Download: add rows under attachments. A row with no link is dropped on save, and the form says how many rows that is.
  • Quiz: see below — this one is built as a page, not in the dialog.
  • Live session: use the video link for the stream URL.

Two switches on each lesson are worth knowing:

  • Free preview publishes that lesson to everyone, including people who have not bought the course. It is the one documented way a lesson leaves the gate — if a lesson is visible when it should not be, look here first.
  • Opens after (days) holds a lesson back, counted either from the course's publish date or from the student's own grant date, depending on the course.

Duration is what you state, not what is measured from the file. It is printed in the outline and added into the course total.

A quiz lesson is built as a page

Pick Quiz and the dialog changes its hint, because this lesson is not built there:

Build this lesson as a page with a form on it, then mark that page as this lesson in the page settings.

Concretely: make an ordinary page, drop the form element on it (the store's own form engine — conditional fields, multiple steps, validation), then open the page settings and pick the course and lesson this page is.

Marking it does two things at once: the player gets somewhere to send the student, and that page is gated by this lesson's own tier and drip schedule rather than by the blunt "did they buy this course". It works for any lesson type, not just quizzes: anything you would rather build with the page builder than type into a content box.

In the player such a lesson grows an Open this lesson button. A locked lesson does not get one — the gate would refuse them anyway, so offering the link only points somebody at a shut door.

Selling a course

The Products tab is where a course meets the thing that sells it:

A course is sold through a product. Several products may unlock one course (early-bird, student, partner pricing), and one product may unlock several courses (a bundle).

Each link carries four options, and they are where you shape the packaging:

  • Variant — only that variant unlocks the course. Empty means any variant.
  • Access days — leave 0 to use the course's own setting. This is how one course sells both monthly and outright: two products, two numbers.
  • Seats per purchase — more than 1 is a group ticket: the buyer gets codes to hand out.
  • Tier — matches a chapter's Tier inside the course. Empty unlocks the whole course.

With no product linked, the course page says so outright: "This course is not linked to any product, so nobody can buy it."

Tiers — the easiest place to lose money

If you plan to sell Basic / Pro on one course, there are two things to set and missing either breaks it:

  1. On the chapter: its Tier — which tier this chapter belongs to.
  2. On the product link: the same tier name.

Set a chapter's tier with no product selling it and the screen says so at once: "No product link sells this tier, so this chapter is locked for everyone." Leave a chapter's tier empty and it opens for everyone who bought the course — including the people who only bought the cheap tier.

Who may watch, and from when

Grant access on the course decides when a student gets in:

  • When the money arrives — the default.
  • When I confirm the order — this still grants an order paid online, so a card payer is never locked out waiting for you.
  • As soon as a deposit is paid — for courses billed in instalments.
  • Never automatically — you admit each student yourself.

Access days: 0 is lifetime. Seat cap: 0 is unlimited, and a sale past the cap is refused rather than quietly accepted.

Each course's Students tab lists that course's students; All students on the main screen lists the whole store's, searchable by name, email or order number. You can also add a student by email, and revoke anyone.

Renewal reminders

Turn on renewal reminders and a student whose access is about to run out gets an email N days before (0 means 7 days, 60 is the maximum). The email carries a renewal button; pressing it is what creates the new order, and that order goes through the same gateways as any other.

Nobody is ever mailed twice for the same expiry, even if the system runs several times a day — the reminder is held back by the student's own expiry date rather than by a "sent" flag.

Certificates

Turn on the certificate switch and a student who finishes sees a certificate line on their course page. Said plainly so it is not a surprise: this version does not generate a printable certificate file — it marks them on screen.

On the storefront

Once installed, the builder's element palette grows the course rows: the course grid (drop it on any page, filterable by level and topic), a course's title / description / price / lesson count, and the player for the learning page. The enrol button is a real add-to-cart, not a link away — it puts the product that sells that course into the basket.

Removing the app

Removing the app deletes nothing — courses, curriculum and the student ledger stay exactly where they are, and reinstalling brings them all back. But removal is refused while students are still enrolled: revoke them or let them lapse first. Otherwise somebody would still be studying behind a store whose Apps screen says the app is gone.

Copying a store carries the courses and the curriculum, not the students — a new store should not open with a roster of people who paid somewhere else.

Updated 04/09/2026