Area: Admin plane (audit p12) · Surface: mobieusLearn / course-sales admin (/admin/courses/offers) · Dimension: competitor-gap · Severity: major
Teachable, Thinkific, and LearnWorlds all monetize courses with (1) payment plans / installments (e.g. 3x monthly), (2) subscriptions / memberships, (3) coupons & promo codes, and (4) bundles. These are the levers creators use to raise average order value and run launches. mobieusLearn can only sell a flat one-time price, which caps a tenant's revenue tooling well below what a creator expects when comparing against Teachable's checkout. For a suite that positions course-sales as a monetization product, this is a direct competitive shortfall.
Evidence
`tenant_course_offers` (platform/database/schema.sql:7065-7086) has exactly one pricing field: `price_cents` int unsigned NOT NULL, plus currency. No price_type, recurring, installment, or subscription column. AdminCourseSalesController.php:130-153 reads a single `$_POST['price']`. Grep for 'CREATE TABLE.*coupon|discount|promo|bundle' across schema.sql returns nothing. `tenant_course_purchases` (schema.sql:7095-7119) is a single Stripe Checkout session per buyer.
Suggested fix. Add a `pricing_kind` enum (one_time, payment_plan, subscription) + installment_count/interval columns to tenant_course_offers; add a `course_coupons` table (code, percent/amount off, max redemptions, expiry, offer scoping) wired into the Stripe Checkout session creation; add a `course_bundles` join table that grants multiple offers in one purchase. Start with coupons (highest ROI, smallest surface).
Filed by the automated tenant-app audit and adversarially evidence-verified. Status: verified. Open — not yet actioned.
Patrick Bass
@mobieus