Selling a course to strangers needs four outside services that an agent can wire together but not replace: Stripe for payments, a video host, an email sender and a server with HTTPS. With those, a site with checkout, magic-link sign-in, drip release and progress tracking is a weekend build. What stays missing is the rest of Kajabi's bundle: the page and funnel builder, broadcast email with automations, communities, affiliates and the branded phone app.
Before you buildKajabi has no free plan, only a trial and a 30-day money-back guarantee. Before building, see whether self-hosted CourseLit already covers what you sell.
Build me a self-hosted course site to replace Kajabi for selling my own online courses. Requirements: - Next.js 15 (App Router) + TypeScript, Drizzle ORM on SQLite in ./data/school.db. `npm run dev` on http://localhost:3000; `npm run build && npm start` in production. - Content: courses > modules > lessons. A lesson has Markdown text, file attachments (./data/files/) and one video hosted on Bunny Stream: upload from the admin, store the video id, and play it through token-signed embed URLs that expire after 6 hours. - Selling: Stripe Checkout with a one-time price or a monthly subscription per course. A webhook at /api/stripe/webhook grants access on payment and revokes it when a subscription ends; buyers manage cards and cancellations in the Stripe Customer Portal. - Students sign in with an email magic link (Auth.js email provider, sent through Resend), see only what they bought, tick lessons as done and resume where they stopped. - Drip: a module can unlock a set number of days after purchase. - Public pages: a catalogue and one landing page per course with outline, price and buy button. - Admin (the address in ADMIN_EMAIL): course editor, student list with CSV export, manual grant and revoke, and a sales list read from Stripe. - Email: receipts and "new module unlocked" notices only, through Resend. - All keys in .env (Stripe, Bunny, Resend, AUTH_SECRET). No telemetry. Student data stays in the SQLite file and Stripe. - Out of scope: community, mobile app, affiliates, funnels, broadcast email and coupons. - README: Stripe test-mode walkthrough with the Stripe CLI for webhooks, a warning to budget an hour for Resend domain verification, and deploy steps for a VPS behind Caddy.
Opens your agent with the prompt filled in, you press enter. Or copy it and paste it into an empty folder.
The first prompt builds the core. Run these one at a time in the same folder to grow it into your own Kajabi.
Add a student import to the course site in this folder. Requirements: - A command `npm run import-students -- <contacts.csv>` that reads the contacts CSV Kajabi emails you. Print the detected columns and ask me to map email, name and product before importing. - For each row, create the student and grant the course I mapped the product to, marked "imported" with no Stripe payment attached. - Skip existing students, so running it twice is safe; print created, skipped and failed rows. - A script that emails every imported student a one-time sign-in link and a short note about the move, sending at most 50 per minute through Resend. - Update the README.
Add lesson discussions to the course site in this folder. Requirements: - Under every lesson, students who own the course can post questions and replies in Markdown (sanitized with `rehype-sanitize`). - I can pin, edit and delete posts from the admin; students can edit their own posts for 15 minutes. - Email me a daily digest of new questions; email a student when I reply to them. - Rate-limit posting to 10 posts per student per hour. - Out of scope: private messages, reactions, a separate forum. - Update the README.
Add broadcast email to the course site in this folder. Requirements: - An admin page to write a Markdown email, pick a segment (all students, buyers of a course, or students who haven't finished a course) and send a test to myself first. - Send through Resend's batch endpoint in groups of 100, and keep a log of every send. - Every email carries a one-click unsubscribe link (List-Unsubscribe header too); unsubscribed students never get broadcasts, only receipts. - Show sent, failed and unsubscribed counts per broadcast. - Update the README with the sending limits of my Resend plan.
Creators pay to run the whole business from one login: pages, checkout, email list, course player and community share one customer list, and someone else answers when a launch breaks. Leaving means rebuilding funnels and email sequences, and Kajabi documents no way to move active customer subscriptions out, so members have to subscribe again.
Estimate · A small VPS plus video storage and streaming on Bunny, which grows with watch time. Stripe's card fees apply per sale either way. The build is token usage on your agent plan.
| Plan | Monthly | Annual, per month | What you get |
|---|---|---|---|
| Basic | $179 | $143 | 5 products, 2,500 contacts, 2 admin users, 1 community, 1 website, unlimited landing pages, funnels and marketing emails, no AI credits. |
| Growth | $249 | $199 | 50 products, 25,000 contacts, 11 admin users, 1 community, 1 website, 500 AI credits. |
| Pro | $499 | $399 | Unlimited products, 100,000 contacts, 26 admin users, 3 communities, 3 websites, 1,000 AI credits, branded mobile app. |
Kinda. The core is a weekend build with the prompt on this page, but real gaps remain: The branded mobile app for students, Landing pages, funnels and broadcast email in the same place.
About $179 a month on the Basic plan, $2,148 a year (checked 2026-10-13).
The branded mobile app for students; Landing pages, funnels and broadcast email in the same place; Community spaces and cohort courses; Affiliate programs, upsells and checkout extras; Kajabi's AI tools and video transcriptions. If any of those matter to you, keep paying.
Yes: CourseLit (open source), Ghost (open source), Frappe LMS (open source).