Course Pricing & Coupons
EmbayLMS lets you attach a price to a course and create coupon codes that discount it at checkout. This page covers both.
To sell, connect Stripe first. Learner checkout requires connecting your Stripe account under Admin → E-commerce → Payments (Stripe Connect). Once connected and accepting payments, any course with a paid price shows a Buy button to learners; they pay on Stripe’s secure page and are enrolled automatically. If you haven’t connected Stripe, prices are still stored — learners just won’t see a Buy button.
EmbayLMS applies a small platform fee to each sale (deducted automatically at payment; the rest settles to your Stripe account). See Orders, receipts & fulfillment below.
Setting a course price
- Open Admin → Courses, pick a course, and open the Pricing tab.
- Choose Free or Paid.
- For a paid course, set:
- Billing — One-time purchase or Subscription.
- Amount — the price (e.g.
49.99). - Currency — CAD or USD.
- Click Save pricing.
Saving replaces the course’s current price. Only one price is active per course at a time; the previous one is retired (kept for historical order references, never hard-deleted).
Pricing reference
| Field | Values | Notes |
|---|---|---|
| Type | Free / Paid | Free stores an amount of 0 |
| Billing | one_time / subscription | Subscription billing runs through Stripe once Connect is live |
| Amount | > 0 for paid | Entered in dollars; stored in cents |
| Currency | CAD / USD | Must match the coupon currency for fixed-amount coupons |
Creating a coupon
- Open Admin → Coupons (E-Commerce section of the left nav).
- Click New coupon.
- Fill in:
- Code — the redemption code (letters, numbers,
-,_). Stored uppercased. - Discount type — Percentage off, Fixed amount off, or Free trial.
- Amount — a percentage (1–100), a dollar amount off, or the number of trial days.
- Currency — required for a fixed-amount coupon.
- Expiry date — optional; the coupon stops validating after this date.
- Max redemptions — optional; leave blank for unlimited.
- Code — the redemption code (letters, numbers,
- Click Create coupon.
Enable/disable a coupon without deleting it using the Disable/Enable action. Deleting a coupon frees its code for reuse.
Coupon reference
| Field | Values | Notes |
|---|---|---|
| Discount type | percent / fixed / free_trial | |
| Amount | percent 1–100 · fixed dollars · trial days | |
| Currency | CAD / USD | Fixed coupons only apply in their own currency |
| Expiry | date or none | Validated against the current time |
| Max redemptions | number or unlimited | Once reached, the code stops validating |
How a discount is calculated
- Percentage — takes that percent off the subtotal (rounded to the cent).
- Fixed amount — subtracts that amount, never below zero; only in the matching currency.
- Free trial — leaves the subtotal unchanged and grants the trial length.
This is exactly the math checkout runs. Enter a coupon at checkout to see it applied before paying; a 100%-off coupon enrolls the buyer for free with no card required.
Orders, receipts & fulfillment
Every completed purchase is recorded as an order — the permanent financial record of a sale. Orders are the single source of truth for buyer purchase history, receipts, revenue reporting, and refunds.
An order captures the buyer, the item(s) bought (with the title snapshotted at purchase time, so it stays accurate even if you later rename or delete the course), the subtotal / discount / tax / total, the coupon used, and the Stripe payment reference.
Order status:
| Status | Meaning |
|---|---|
| Paid | Payment succeeded; the buyer was enrolled. |
| Refunded / Partially refunded | Refunded in full or in part from the order detail (LMS-475). A full refund also revokes the buyer’s access. |
| Disputed | The buyer disputed the charge with their bank. |
Fulfillment is safe by design. When a payment succeeds, the order and the buyer’s course enrollment are recorded together — a buyer never ends up paid-but-without-access. Fulfillment is also idempotent: if the payment provider sends the same confirmation twice, the purchase is only ever recorded once. In the rare case a paid order can’t be auto-enrolled (for example a seat-capped course that filled up), the payment is still recorded and flagged for follow-up, so a sale is never silently lost.
Buyers see their receipts under My purchases (account menu); admins see every sale under Admin → E-commerce → Orders, with a per-order detail that also issues refunds (LMS-475). Admin → E-commerce → Revenue rolls the same orders up into gross/net/refunds/fees by currency, top courses, and an order-volume trend (LMS-319).
Troubleshooting
| Symptom | Cause / fix |
|---|---|
| ”A coupon with this code already exists” | An active coupon already uses that code. Codes are unique among live coupons; delete the old one (which frees the code) or pick another. |
| ”A percentage coupon must be between 1 and 100” | Percentage coupons only accept 1–100. Use a Fixed amount coupon for a flat discount. |
| ”A fixed-amount coupon needs a currency” | Choose CAD or USD for fixed-amount coupons. |
| A fixed coupon isn’t applying | Fixed coupons only apply when the order currency matches the coupon currency. |
| I set a price but nothing is for sale | Connect your Stripe account under Admin → E-commerce → Payments (Stripe Connect) and finish onboarding until charges are enabled. Once connected, learners can buy the course at checkout. |