A Teachable school that doesn't look like one.
Everything here runs on Teachable, but none of it comes out of the box.
Not a Teachable setting. Flip it, then pick a colour.
This school is a working demonstration, not a template. Leaderboards, student profiles and live dashboards are being built here in the open — each one an answer to something a creator has asked me whether Teachable could do. I write up how each piece works.
Every school outgrows the settings page eventually
Teachable is a good platform for getting a course online. The trouble starts once it's working, when you've got forty courses instead of four, students who stall halfway through, and a list of things you want the school to do that the settings page has no checkbox for.
These are the questions I get asked most often. Everything below this point on the page is an answer to one of them, running live rather than described.
- Can we have dark mode? Not as a setting. But a school can have a full dark theme that follows the student's own device setting and remembers what they chose. Carrying it through into the lessons themselves is the tricky part. On this page
- Why does my navigation collapse into a “More” button? Because Teachable hides anything past five links. A custom navigation takes as many as you need, two levels deep. On this page
- Can students search inside a course? Not as standard, and there's no workaround in the settings. It needs a proper build that keeps an up-to-date copy of your courses to search. Project, demo below
- How do I stop people drifting away halfway through? Give finishing a lesson some weight. Milestones, streaks and a reason to open the school tomorrow rather than next month. On this page
- Can we do something like Skool's leaderboard? Yes, and without moving your course somewhere else. Built from the completion data your school already records. On this page
- Can it talk to our CRM? Webhooks and the API will push enrolments, purchases and progress wherever they need to go, without a monthly Zapier bill. It's also what I'm building Optio Connect to do. Project
What's below shows what it does, not how it has to look. Every piece gets rebuilt in your school's own colours and type. Purple is my brand colour.
Searching inside courses
Teachable has no search inside a course. This one searches every lesson in the free course, headings and text included, not just the titles. It's the real thing, running on this school.
Inside the course, press / on any lesson to search from there.
- What Teachable actually is
- Choosing a plan that fits
- Creating your first course
- Uploading and organising video
- Setting a price
- Taking your first payment
- Getting paid out
- Connecting a custom domain
- DNS records without the panic
- SSL and why the padlock matters
- School settings worth changing
- Pricing plans explained
- Subscriptions versus one-off payments
- Coupons, bundles and upsells
- Handling refunds gracefully
- What code snippets are, and where they run
- Custom code blocks on your pages
- Custom CSS without breaking things
- Scripts in the header and footer
- Getting the HTML block in lessons
- Still using the Power Editor? Moving off it
- What Liquid is, and where it still works
- Objects, tags and filters
- Liquid inside a custom code block
- Showing different content when signed in
- Looping through a curriculum
- Where Teachable's Liquid differs from Shopify's
- Custom navigation and why it lives on a page
- A Sales Page that keeps itself up-to-date
- Why Teachable has no dark mode
- Custom properties as a colour system
- Respecting the visitor's system setting
- Remembering the choice between visits
- Deriving a whole palette from one accent
- Logos that survive both themes
- Restyling the lesson page with one snippet
- Let students choose the lesson width
- Colour and dark mode that follow students
- Better progress markers
- Your own lesson icons
- What a webhook actually is
- Every event Teachable fires
- Receiving your first webhook
- Webhook payloads, field by field
- Retries, failures and idempotency
- Automation without Zapier
- Syncing enrolments to Google Sheets
- V1 and V2, side by side
- Authentication and API keys
- Scopes, and what happens without them
- Reading products and courses
- Enrolments and student progress
- Rate limits and being a good citizen
- Error shapes you'll actually hit
- How the course search works
- Measuring what students do
- A cookie banner that covers Teachable too
- How the school's files fit together
- Where to go from here
What this takes to build properly
- No search endpoint. The API hands over a lesson when you ask for it, but won't tell you which lessons contain a word. The only way to answer that is to read every lesson in the school and build your own index from it.
- The index has to live somewhere. For one free course, a page on the school is enough, and that's what this uses. For a bigger school it means a database, something to host it, and a search service in front of it.
- Keeping it current. An index is never finished. Add a lesson, rename a section, unpublish a course, and a stale index sends students to pages that have moved. Rebuilding it is part of the system, not an afterthought.
- Respecting who's looking. On most schools the courses are paid. A student should only ever see results from courses they're enrolled in, so the index carries permissions and the search applies them on every query.
This works without signing in because every lesson in the free course is open to everyone. A search across paid courses is a system with a schedule and a running cost, typically three to four weeks to build depending on the size of the school. It runs on your own infrastructure, under your own accounts, so you're never renting it back from me.
How long is this course?
Teachable knows the answer — it shows a duration on every lesson — but it never adds them up. Not for the student deciding whether to start, and not for you when you're writing the sales page.
Teachable, without the limits
Course Curriculum
- Connecting a custom domain Preview
- DNS records without the panic Preview
- SSL and why the padlock matters Preview
- School settings worth changing Preview
- Pricing plans explained Preview
- Subscriptions versus one-off payments Preview
- Coupons, bundles and upsells Preview
- Handling refunds gracefully Preview
- What Liquid is, and where it still works Preview
- Objects, tags and filters Preview
- Liquid inside a custom code block Preview
- Showing different content when signed in Preview
- Looping through a curriculum Preview
- Where Teachable's Liquid differs from Shopify's Preview
- Custom navigation and why it lives on a page Preview
- A Sales Page that keeps itself up-to-date Preview
This is a real course in this school, read live from Teachable rather than typed in — the totals change on their own when a lesson is added or re-recorded. Teachable will show you each duration but won't add them together, so the number every student wants before starting is the one nobody has. The same total can go straight onto your sales page.
A reason to come back
Course platforms are quiet places. A leaderboard gives students something to measure themselves against, and gives you a way to see who's actually working. Teachable has nothing like it.
Sample data, made-up students. A real board is built from lesson completions, so it needs the same index of the school that everything else here does — and the same decisions about what counts. Rank on raw lesson count and whoever enrolled in the most courses wins forever, which is why this one runs on a rolling window and shows every student their own position rather than only the top ten. Names are shortened to a first name and an initial, and anyone can ask to be left off entirely.
Completing a lesson should feel like something
Teachable marks a lesson complete and moves on. No acknowledgement, no milestones, nothing to come back for. Press the button and see the difference — this is the real component, running on a made-up course.
Finding your reader
Milestones
Every milestone here is derived from lesson completions, which is the one event a Teachable school already records. Sections, courses and streaks all fall out of the same data — a streak counts days on which a student finished something, rather than days they signed in, because a student who never signs out never signs in again either. What gets counted is the part worth choosing carefully: one writing school I built for counted words written, and hit milestones at every 10,000.
One line today, a countdown clock in November
Most announcement apps do three things — a coloured strip, a message, a way to dismiss it — and bill monthly for it. Built into the theme instead, it's the same three things at no ongoing cost, and it scales up: a plain notice most of the year, a live countdown when Black Friday actually matters.
Live preview, not a screenshot — the clock on the right is really counting down.
If your school needs something that isn't in the settings
I've been building on Teachable for about ten years, mostly for people whose schools had stopped fitting inside it. Degree and credit tracking for a school with 45,000 students. Enrolment bridges into other platforms. Course directories, custom navigation, progress systems.
Some of it is an afternoon's work. Some of it takes a month. The useful conversation is usually about which one you're looking at.
No pitch deck and no discovery process. Bring the thing you're stuck on and I'll tell you whether it's possible, roughly what it involves, and whether it's worth doing.
How the work runs
- 1 A call, then a written quote Fixed price against a defined scope, so you know the number before anything starts. If the answer is that you don't need me, I'll say so.
- 2 Built against your school Not a template dropped on top. Your courses, your brand, your data — and you see it working before it goes anywhere near your students.
- 3 Handed over, keys and all Anything with a running cost sits on your own accounts and your own infrastructure. You're never renting your own school back from me.
Based in Co. Kerry, working mostly with schools in the US. Time zones have never been the hard part.