feat: certificates, landing pages, ai tutor, website update, compliance

This commit is contained in:
Rotimi Best
2026-05-18 03:47:22 +01:00
parent c31ad63955
commit ac3a2c14a7
644 changed files with 56050 additions and 5439 deletions
+344
View File
@@ -0,0 +1,344 @@
---
name: Agent Knowledge Base
overview: Persistent, org-scoped knowledge base that the AI agent can search across any chat or course. Replaces ad-hoc per-conversation document caches with a real RAG layer, and unifies the source-ingestion infrastructure used by Study from Source, AI Course Templates, and the onboarding website bootstrap.
todos:
- id: prd-review
content: Finalize scope, naming, ingestion sources, retrieval shape, and pricing gates
status: pending
- id: shared-source-decision
content: Decide whether to extend study_source tables or define a new knowledge_source schema
status: pending
- id: data-model
content: Define knowledge_source, knowledge_chunk, and knowledge_embedding tables (or extend study_source)
status: pending
- id: ingestion-pipeline
content: Build async ingestion worker (fetch / chunk / embed / upsert) with retries and observability
status: pending
- id: search-tool
content: Add search_knowledge agent tool with vector + keyword hybrid search, scoped to org
status: pending
- id: refresh-policy
content: Decide refresh cadence (manual button, weekly cron) and stale-source UX
status: pending
- id: management-ui
content: Build KB management page (list sources, manual refresh, delete, view chunks)
status: pending
- id: permissions
content: Decide who can add/edit/delete sources (org admin only by default)
status: pending
- id: cost-metering
content: Track embedding tokens + retrieval calls; surface in agent usage UI
status: pending
isProject: false
---
# Agent Knowledge Base PRD
## Status
- Draft
## Date
- May 13, 2026
## Purpose
Give the AI agent a **persistent, searchable, org-scoped knowledge base** of the org's product, docs, and reference material. Today every chat starts from a cold context — even if a colleague fetched the same docs site yesterday in another course's chat, the agent can't reuse it. This PRD designs the storage and retrieval layer that lets the agent "know about the org" across every chat, lesson, and course.
## Problem Statement
Three current and planned features all need the same thing — persistent ingestion of org content the agent can pull from later:
1. **AI Course Templates** ([plan](.cursor/plans/course_templates_on_org_home_63a7b19a.plan.md)) — when a teacher creates a course from a template and provides a docs URL, the agent fetches it via Jina. Today: cached for 7 days in Redis, then disappears.
2. **Study from Source** ([prd/study-from-source/](../study-from-source/README.md)) — already designs persistent `study_source` and `study_source_segment` tables for one-source-at-a-time course creation. But the data is scoped to a single course.
3. **Onboarding AI Bootstrap** ([prd/onboarding-ai-bootstrap/](../onboarding-ai-bootstrap/README.md)) — paste website URL during signup → 2 starter courses. Same fetch happens; same data is thrown away.
Each feature reinvents fetching, chunking, and "what's good context to give the agent." The result is duplicated infrastructure, missed reuse opportunities, and high recurring fetch cost.
The user-facing symptom: a creator builds three courses about their product, and the agent re-reads the same docs from scratch every time. There is no "the agent learns about us over time."
## Goals
1. Single org-scoped knowledge store that all agent interactions can search.
2. Reuse fetched docs across chats, courses, and features (no duplicate Jina calls within an org for 30+ days).
3. Reuse the same ingestion plumbing for files, URLs, and pasted text.
4. Give the agent a `search_knowledge(query)` tool that returns top-K relevant chunks instead of (or in addition to) `fetch_documentation_url`.
5. Surface a management UI so org admins can see what the agent "knows" and curate it.
6. Be source-grounded — every retrieved chunk carries a citation (source URL/file + segment locator).
7. Don't break the per-conversation `aiAssistantApi.uploadDocument` flow; this complements it.
## Non-Goals (v1)
- Cross-org knowledge sharing.
- Automated discovery (the agent crawls the open web hunting for sources).
- Real-time sync with external systems (Notion, Google Drive, Confluence) — manual sync only in v1.
- Image/audio/video understanding inside fetched content.
- Per-user knowledge (knowledge is org-scoped only).
- Public knowledge base for students.
- Replacing the Tier-2 Redis cache shipped with AI Course Templates (the cache continues to exist as a hot layer in front of the KB).
## Confirmed Decisions
These came out of the Tier-1/2/3 conversation that produced the AI Course Templates plan:
1. **Tier 2 ships first** as part of AI Course Templates: org-scoped Redis cache for `fetch_documentation_url`, 7-day TTL. No DB changes. This PRD is Tier 3.
2. **Org-scoped, not user-scoped.** Knowledge belongs to the organization. Any team member's agent chat benefits.
3. **Sourced, not generated.** Knowledge entries are fetched/uploaded source content, not LLM-generated summaries. Summaries can be derived later but don't replace the source.
4. **Hybrid retrieval, not pure vector.** Vector + keyword/BM25, because product docs have lots of identifier-style strings that embeddings handle poorly.
5. **Reuse `study_source` infrastructure if Study from Source ships first.** Otherwise design `knowledge_source` so it can absorb `study_source` later.
6. **Manual refresh in v1, scheduled refresh in v2.** Don't over-engineer the freshness loop before we know what users actually do.
7. **Paid plan only** — same gate as document upload today.
## Related PRDs
| PRD | Relationship |
|---|---|
| [AI Course Templates plan](../../.cursor/plans/course_templates_on_org_home_63a7b19a.plan.md) | Ships Tier-2 cache. This PRD is the Tier-3 promotion. |
| [Study from Source](../study-from-source/README.md) | Defines `study_source` and `study_source_segment` tables that this KB should either extend or absorb. Open question 1 below. |
| [Onboarding AI Bootstrap](../onboarding-ai-bootstrap/README.md) | First place a fresh org gets a website URL. Should write into the KB so subsequent courses inherit that ingestion. |
| [AI Course Assistant](../ai-course-assistant%20%5BDONE%5D/README.md) | The agent that consumes this KB. |
| [MCP Course Authoring](../mcp-course-authoring%20%5BDONE%5D/README.md) | External MCP consumers may also want to query KB; design tool surface to be MCP-friendly. |
## Architecture overview
```mermaid
flowchart LR
subgraph Sources["Org Sources"]
URL["URLs (Jina)"]
File["Files (PDF/DOCX/PPTX)"]
Text["Pasted text"]
Notion["Notion / Drive (later)"]
end
Sources --> Ingest["Ingestion worker<br/>fetch + clean + chunk + embed"]
Ingest --> DB[("knowledge_source<br/>knowledge_chunk<br/>+ pgvector index")]
TemplateAgent["AI Course Templates agent"] --> Search["search_knowledge tool"]
CourseAgent["Course chat agent"] --> Search
StudyAgent["Study from Source agent"] --> Search
Search --> DB
DB --> Context["Top-K chunks<br/>injected as context with citations"]
Admin["Org admin UI"] --> Sources
Admin --> DB
Refresh["Scheduled refresh (v2)"] --> Ingest
```
## Data model
Open Question 1 (below) decides whether this is new tables or an extension of `study_source`. Sketch assuming new tables; the migration path if we extend `study_source` is a rename.
### `knowledge_source`
| Field | Type | Notes |
|---|---|---|
| `id` | uuid | PK |
| `organizationId` | uuid | FK, org-scoped |
| `kind` | enum | `url` / `file` / `text` |
| `originUrl` | text nullable | for `url` kind |
| `assetId` | uuid nullable | for `file` kind, FK into existing assets |
| `title` | text | display title |
| `status` | enum | `pending` / `ingesting` / `ready` / `failed` / `archived` |
| `lastFetchedAt` | timestamp nullable | for refresh logic |
| `etag` | text nullable | from Jina/HTTP for cheap staleness checks |
| `wordCount` | integer | |
| `tokenCount` | integer | for cost meter |
| `metadata` | jsonb | fetch metadata, errors, warnings |
| `createdByProfileId` | uuid | who added it |
| `createdAt` / `updatedAt` | timestamp | |
Indexes: `(organizationId, status)`, unique `(organizationId, kind, originUrl)` to dedupe URLs per org.
### `knowledge_chunk`
| Field | Type | Notes |
|---|---|---|
| `id` | uuid | PK |
| `sourceId` | uuid | FK |
| `organizationId` | uuid | denormalized for fast org-scoped retrieval |
| `order` | integer | within source |
| `text` | text | chunk body |
| `tokenCount` | integer | |
| `embedding` | `vector(1536)` | pgvector; OpenAI text-embedding-3-small dims |
| `headingPath` | text nullable | e.g. "Webhooks > Retries" for citation rendering |
| `locator` | jsonb | page/anchor/character offset for deep links |
Indexes: `(organizationId)` for KB scope; HNSW or IVFFlat on `embedding` for vector search.
### Optional: `knowledge_query_log`
For evals, cost tracking, and "what does the agent search for?" debugging. Can be Tinybird-only (no DB table) if we want to avoid bloat.
## Ingestion pipeline
```
sourceCreated -> enqueue ingestion job
-> fetch (Jina for url; existing parser for file; passthrough for text)
-> normalize whitespace + strip nav/footers
-> chunk by headings, fall back to ~500-token windows with 50-token overlap
-> embed in batch (OpenAI)
-> upsert into knowledge_chunk
-> mark source `ready`
```
Use the existing job runner (`apps/jobs/`). Retries with exponential backoff. On failure, mark source `failed` with error in `metadata`.
## Retrieval
### Tool: `search_knowledge`
```typescript
inputSchema: z.object({
query: z.string().min(3).max(500),
k: z.number().int().min(1).max(15).default(6),
sourceIds: z.array(z.string().uuid()).optional() // narrow to specific sources
})
returns: {
results: Array<{
chunkId: string,
sourceId: string,
sourceTitle: string,
sourceOriginUrl: string | null,
headingPath: string | null,
text: string,
score: number
}>,
truncated: boolean
}
```
Implementation: hybrid search.
1. Vector search: cosine similarity on `embedding`, top 30.
2. Keyword search: Postgres `tsvector` on `text`, top 30.
3. Reciprocal Rank Fusion to merge.
4. Take top `k`. Return with citation fields.
### When the agent uses it
The teacher system prompt (today restricts internet access entirely; updated in templates plan to allow `fetch_documentation_url`) gets a new clause:
> Before generating lesson content or planning a course, call `search_knowledge` with terms relevant to the topic. Treat returned chunks as authoritative source material; cite them in your output. Only fall back to your general knowledge when search returns no relevant results.
`fetch_documentation_url` remains for ad-hoc URL ingestion. The natural progression is: agent fetches → result is auto-promoted into the KB → next time, `search_knowledge` returns it for free.
## Auto-promotion from Tier-2 cache
When `fetch_documentation_url` succeeds and the URL is **not** already a `knowledge_source` for the org, write the fetched content as a new source in status `ingesting` and enqueue the ingestion job. This means the KB grows naturally as people use templates, with zero extra friction.
Edge cases:
- User fetches a URL that returns garbage (404, login wall, empty body) — don't promote.
- User fetches the same URL across many orgs — that's fine, each org gets its own copy. We do not share across orgs (privacy/legal).
- Throttle promotions to avoid embedding cost spikes (e.g., max 50 auto-promotions per org per day).
## Management UI
Route: `/org/[slug]/settings/knowledge` (gated to org admins).
Sections:
- **Sources list** — table of all `knowledge_source` rows with title, kind icon (URL/file/text), word count, status, last fetched, "Used N times by agent (last 30d)".
- **Add source** — three buttons: "Add URL", "Upload file", "Paste text".
- **Source detail panel** — opens on row click. Shows extracted text preview, chunk count, sample chunks, citation locators, "Refresh" button (re-runs ingestion), "Delete" button.
- **Settings** — per-org defaults: max chunks per source, embedding model, retrieval `k`. (Stretch.)
Frontend feature folder: `apps/dashboard/src/lib/features/knowledge-base/`.
## Permissions
| Action | Org Admin | Tutor | Student |
|---|---|---|---|
| List sources | yes | yes (read-only) | no |
| Add source | yes | yes | no |
| Refresh source | yes | yes | no |
| Delete source | yes | no | no |
| Agent uses KB during chat | yes | yes | (only when student chat ships) |
Same model as the existing teacher-vs-student split in `AgentRole`.
## Cost & metering
- Embedding cost: OpenAI text-embedding-3-small is ~$0.02 / 1M input tokens (May 2026). A 100k-token doc costs ~$0.002 to embed once. Cheap.
- Retrieval cost: each `search_knowledge` call uses negligible tokens itself but injects retrieved chunks into the agent's context, which is metered by existing `recordTokenUsage`.
- Storage cost: pgvector indexes add ~6 KB per chunk (1536 floats × 4 bytes). 10k chunks ≈ 60 MB. Trivial at MVP scale; revisit at 1M chunks.
- Per-org limits (env-configurable, mirror existing fetch quotas):
- Max sources per org: 1000
- Max chunks per org: 100,000
- Max embedding tokens per org per day: 5,000,000
Surface usage in the existing AI credits UI (`apps/dashboard/src/routes/(app)/org/[slug]/settings/ai-credits/`).
## Refresh policy
- v1: manual refresh button on each source. Show "Last refreshed N days ago" badge after 30 days; show "Stale" badge after 90.
- v2: nightly cron that refreshes any source older than its per-org TTL. Use HTTP `ETag`/`Last-Modified` to skip re-embedding when nothing changed.
## Tracing & evals
- Log every `search_knowledge` call (query, top-K chunk IDs, scores, agent message id) to Tinybird via `trackAgentEvent`.
- Add a one-page eval harness later: replay logged queries against new embedding models and measure rank correlation. Out of scope for v1 build but allow for it in the schema.
## Open Questions
1. **Reuse `study_source` or build `knowledge_source`?** They model essentially the same thing. If Study from Source ships first, extend it (add `organizationId` + remove `lessonId` requirement). If this KB ships first, build `knowledge_source` and migrate `study_source` to be a course-scoped view of the KB.
2. **Embedding model**: OpenAI text-embedding-3-small (cheap, 1536d) vs. text-embedding-3-large (better quality, 3072d, more expensive). Start with small.
3. **Auto-promotion default ON or OFF?** Auto-on means the KB fills itself up; org admins discover their KB has stuff in it without doing anything. Off means more deliberate but higher friction.
4. **Should the agent ALWAYS try `search_knowledge` before answering, or only when the system prompt explicitly directs it?** Always-on is simpler but adds latency to every turn.
5. **Do we expose KB via MCP** so external clients can also search it? Probably yes, but design v1 with that in mind.
6. **Chunk strategy**: heading-aware vs. fixed-window. Pick one for v1; instrument the other for A/B later.
7. **PII**: do we need a redaction pass before embedding (e.g., strip emails, account ids)? Probably not v1, but call it out.
8. **Refresh trigger when source URL changes its content significantly**: ETag is cheap but unreliable for SPAs that always serve the same shell. Need a content-hash fallback.
## Phasing
### Phase 1 — Foundations (this PRD's MVP)
1. Decide Open Question 1 (reuse vs. new tables); migrate accordingly.
2. Build `knowledge_source` + `knowledge_chunk` schema with pgvector.
3. Ingestion worker for URL + file + text.
4. `search_knowledge` tool, hybrid retrieval.
5. Auto-promotion from `fetch_documentation_url` cache.
6. Minimal management UI: list, add URL, delete.
7. Paid-plan gate.
### Phase 2 — Quality
1. Manual refresh + stale badges.
2. Source detail panel with chunk preview.
3. Eval harness for retrieval quality.
4. MCP tool surface.
### Phase 3 — Automation
1. Scheduled refresh.
2. Notion / Google Drive connectors.
3. Per-source freshness TTL settings.
4. Cross-source deduplication.
## Acceptance Criteria (Phase 1)
1. An org admin can add a documentation URL on the KB settings page; it appears as `ingesting` then `ready` within a minute for typical docs sites.
2. The agent, when asked about a topic the KB covers, calls `search_knowledge` and uses returned chunks as source material in its response, with citations linking back to the source.
3. Two different chats in the same org searching the same topic both retrieve the same chunks.
4. Re-fetching a URL that's already a `knowledge_source` updates that source instead of creating a duplicate.
5. Deleting a source removes its chunks and the agent stops returning them.
6. Free-plan orgs see an upgrade modal when trying to add KB sources.
7. Embedding token cost is recorded and visible in the existing AI credits UI.
## Risks & Mitigations
| Risk | Mitigation |
|---|---|
| Embedding cost runs away on a single bad source | Per-source token cap (200k tokens). Surface as `SOURCE_TOO_LARGE` error. |
| Vector search returns irrelevant junk for short queries | Hybrid search (keyword + vector) handles this better than vector alone. Surface scores in the UI for debugging. |
| KB fills with stale or wrong info | Manual delete + refresh in v1; scheduled refresh in v2. Stale-source UI badge after 90 days. |
| Prompt injection inside ingested content | Same `<external_untrusted_document>` delimiter pattern used in the templates plan. |
| Cross-org leakage via shared cache or shared embeddings | Strict `organizationId` scoping at every layer (table, query, tool). Add a unit test that proves another org's chunks never appear in retrieval. |
| Schema regret if Study from Source ships first | Resolve Open Question 1 BEFORE either feature builds tables. |
| Index bloat at scale | Choose IVFFlat for write-heavy phase, HNSW once data settles; revisit at 100k chunks. |
## What success looks like 6 months in
- An org with 5+ courses sees the agent generating consistently-on-brand content across all of them, citing the same source material, without the org admin doing anything special after the initial onboarding URL.
- Net Jina spend per org plateaus or drops over time, even as course count grows, because the cache→KB pipeline removes duplicate fetches.
- "Where did the agent get this from?" is answerable for every claim in generated lesson content.
+239
View File
@@ -0,0 +1,239 @@
---
name: AI Tutor Fair-Use Cap
overview: Protect the org's pooled AI tutor quota from single-learner abuse without adding pricing complexity. Introduce a per-learner monthly fair-use cap on student-facing AI tutor messages, enforced silently at the product layer. Pricing page stays unchanged — one pooled AI quota per tier. When the org pool runs out, the admin (buyer) is upsold; students never see an upgrade prompt.
todos:
- id: cap-decision
content: Lock in a flat per-learner cap of 100 tutor messages per calendar month across all tiers (rationale - agent + teacher usage already drains the pool, so the per-learner cap is a uniform abuse limiter)
status: pending
- id: usage-counter
content: Add a per-learner monthly tutor-message counter scoped to a calendar month, resetting on the 1st
status: pending
- id: enforcement
content: Block additional tutor messages for a learner who has reached the cap; return a soft error that the chat-input component can render as a "take a break" state
status: pending
- id: student-ux
content: Build the friendly "AI tutor is taking a break — try again on the 1st" state in ai-course-chat / chat-input. No upgrade prompt to students.
status: pending
- id: admin-learner-leaderboard
content: On the AI credits / usage page, add a learners leaderboard ranking active learners by tutor messages (and tokens) this period, with their current cap status (under / approaching / at cap)
status: pending
- id: admin-per-learner-detail
content: Allow admin to click a learner in the leaderboard to see their tutor usage over time, the courses driving the usage, and any cap-hit events
status: pending
- id: admin-cap-status-summary
content: Add a summary card on the AI credits page: "N learners at cap this month", "M learners approaching cap (>80%)", linked to the leaderboard
- id: org-pool-empty-flow
content: When the org's pooled AI quota is drained, send admin email + in-app notification with top-up / upgrade CTA. Students see same "take a break" message.
status: pending
- id: rate-limit-tuning
content: Decide secondary protections beyond the monthly cap (no daily cap in v1; revisit only if abuse patterns emerge)
status: pending
- id: quota-resize
content: Right-size the pooled AI quotas across tiers with realistic student tutor consumption modeled in
status: pending
- id: admin-disable-ai
content: Add a workspace-level "Disable AI tutor for this workspace" toggle in AI settings. When off, the tutor entry points are hidden for all learners in that workspace and no AI requests are sent.
status: pending
isProject: false
---
# AI Tutor Fair-Use Cap PRD
## Status
- Draft (2026-05-15)
- Owner: TBD
## Problem
The AI tutor is a pooled-token product: the org pays for a monthly AI quota, all learners in all workspaces share it. This works for teacher-side usage (creation is bursty, the admin sees the meter and can upgrade), but it creates a billing/UX dead-end on the student side:
1. **A single heavy student can drain the org's monthly pool**, blocking every other learner from using the tutor for the rest of the month.
2. **Students aren't the buyer.** There is no clean upgrade prompt to show a student when the pool runs out — they have no billing relationship with us.
3. **Splitting AI into two billable buckets (creation tokens + tutor messages) adds pricing complexity** that hurts conversion. The pricing page should remain one AI number per tier.
We need a way to protect the org's pool from individual-learner abuse without adding a new billing line, without surfacing complexity on the pricing page, and without ever upselling a student.
## Goals
1. Cap the impact one heavy learner can have on the org's pooled AI quota
2. Keep pricing simple — one "AI credits" number per tier; no new SKU
3. Never show an upgrade prompt to a student
4. When the org pool does run out, drive the admin (buyer) to top up or upgrade — existing motion
5. Give admins per-learner visibility so they can investigate or coach heavy users
6. Let admins disable the AI tutor entirely for their workspace (privacy, compliance, or cost reasons)
## Non-goals (v1)
- Per-learner tutor billing or per-learner overage SKUs
- Showing students any pricing/upgrade UI
- Cross-workspace tutor cap pooling (cap is per-learner per-workspace per-month)
- Per-tier variation of the per-learner cap (cap is uniform; tier differences live in the pooled AI quota size)
- A learner-visible usage counter (cap is invisible until hit)
- Real-time cost optimization (model routing, cheaper-model fallback) — separate effort
## Approach
**One AI quota at the org level.** Pooled tokens, used by teachers, students, and the agent equally. Pricing page stays unchanged.
**One per-learner fair-use cap underneath.** Every learner gets the same monthly budget: **100 tutor messages per calendar month**, flat across all tiers. The pool already differentiates tiers; the per-learner cap is purely an abuse limiter, so it doesn't need to vary by plan. Counter resets on the 1st. When a learner exceeds their cap:
- Tutor chat becomes read-only for that learner until the next reset
- Message: *"AI tutor is taking a break — try again on the 1st. You can still review lessons and notes."*
- No upgrade prompt, no marketing
- Lesson content, notes, quizzes, certificates all continue to work normally
**Locked-down student tutor surface.** To keep per-message cost predictable (so a flat message-count cap is a fair proxy for token usage), the student-facing tutor does not expose:
- A model picker — students always use the platform default model
- File uploads — text Q&A only
Teachers and the agent retain full model/upload access; this restriction is student-side only.
**Org-pool-exhausted flow (separate from per-learner cap):**
- When org's pooled AI quota hits 95% / 100%: admin gets email + in-app banner with top-up + upgrade CTAs (existing motion, just trigger it earlier)
- Students see the same generic "take a break" message
- Admin can top up via existing $5 / 2M tokens overage SKU
**Admin off-switch (workspace-level):**
- Admin can disable the AI tutor entirely for their workspace from AI settings
- When disabled: tutor entry points are hidden in lessons for every learner in that workspace; no AI requests are made; no tokens are consumed
- Toggle is per workspace, not per learner, not per course (v1)
- Existing AI conversation history is preserved but read-only while disabled
- Re-enabling is instant
## User stories
### Learner — typical
- I open a lesson and chat with the AI tutor.
- I have no awareness of any cap. Counter exists but isn't surfaced.
- I ask 12 questions across the month; nothing happens, all works fine.
### Learner — heavy user
- I have asked 100 tutor questions this month.
- On message 101 I see: *"AI tutor is taking a break — try again on the 1st."*
- Rest of the lesson UI still works. I can keep learning.
- I am never asked to pay or upgrade.
### Admin — happy path
- I open the AI credits page and see, alongside the pooled-quota meter:
- A summary card: "3 learners at cap this month • 12 approaching (>80%)"
- A **learners leaderboard** ranking learners by tutor usage this period (messages and tokens), each row showing name, course(s), messages used / cap, and a status badge (under / approaching / at cap)
- I click a learner to see their usage over time and which courses are driving it.
- I can proactively reach out to coach heavy users — or do nothing, the cap enforces itself.
### Admin — org pool draining
- I get an email at 95% usage: "You're nearing your monthly AI tutor quota. Top up or upgrade."
- I top up for $5 / 2M tokens or upgrade tier.
- Learners experience no service interruption if I act in time.
### Admin — org pool exhausted
- All learners see "AI tutor is taking a break."
- I get an in-app banner + email with clear top-up CTA.
- Topping up restores service immediately for all learners (subject to their individual per-learner caps).
### Admin — disable AI entirely
- I open AI settings for my workspace and toggle "AI tutor" off.
- Learners in this workspace no longer see the tutor entry point in any lesson.
- No tokens are consumed; the workspace's contribution to pooled usage drops to zero.
- I can re-enable at any time; conversation history is preserved.
## Functional requirements
### Data model
Likely already partial; verify against existing AI usage tracking:
- Per-learner monthly tutor-message counter, scoped by `(workspaceId, profileId, periodStart)`
- Reset on the 1st of each calendar month
- Counter is **per workspace, not pooled across workspaces** — a learner enrolled in two workspaces under one account gets one fresh cap in each (each workspace is its own billing context)
- Existing pooled-org AI quota tracking remains unchanged
- Workspace-level `aiTutorEnabled: boolean` (default `true`) on the org/workspace settings record
### Enforcement
- On every student-facing tutor request:
1. Check workspace-level AI toggle → if disabled, return `ai_disabled` (request should not have been made; defensive check)
2. Check org pooled quota → if exhausted, return `pool_exhausted` error
3. Check per-learner cap → if reached, return `learner_cap_reached` error
4. Else proceed; increment both counters on completion
- `pool_exhausted` and `learner_cap_reached` render the same neutral "take a break" UX to the student; admin sees the actual reason in their usage UI
- When the workspace AI toggle is off, the tutor entry point is **not rendered** for learners; defensive backend check prevents any direct API call from succeeding
### Student UI
- No model picker exposed — student tutor always uses the platform default model
- No file-upload affordance in the student tutor (text Q&A only)
- No usage counter shown to the learner — cap is invisible until they hit it
- On cap-hit: chat input disabled with the friendly "take a break" message above; lesson, notes, quizzes, and exercises continue to work
- No CTA pointing to billing / upgrade / payment
- Optionally: small "Learn more" link → static FAQ page (no pricing context)
### Admin UI — AI credits page
The existing AI credits / usage page is the home for all tutor visibility. Additions:
1. **AI tutor toggle** — top-of-page workspace-level switch: "AI tutor — On / Off". When off, the rest of the page shows a disabled state with a "Re-enable to start tracking again" CTA. Disabled state still shows historical usage.
2. **Pooled-quota meter** — unchanged (org-level AI credits used / available)
3. **Cap status summary card** — "N learners at cap this month • M approaching (>80%)" with click-through to the leaderboard
4. **Learners leaderboard** — primary new surface. Ranks active learners by tutor usage this period.
- Columns: learner name, primary course(s), messages used, % of per-learner cap, tokens consumed, status badge (under / approaching / at cap)
- Sortable by messages, tokens, or % of cap; default sort: messages descending
- Pagination + search by learner name
- Period selector: current month (default), previous month, last 90 days
5. **Per-learner detail panel / page** — clicking a leaderboard row shows:
- Daily usage chart for the selected period
- Course-level breakdown driving the usage
- Cap-hit event log (when the learner hit the cap and was rate-limited)
6. **Existing 95% / 100% pool alerts** — unchanged; trigger existing top-up CTA
The leaderboard is **scoped to a single workspace**. Multi-workspace admins see one leaderboard per workspace (no cross-workspace roll-up in v1).
### Configuration
- Per-learner cap is a single server-side constant: **100 tutor messages / learner / calendar month**, flat across all tiers (including Enterprise)
- The cap value is never shown on the pricing page
- No daily / burst cap in v1 — revisit only if abuse patterns emerge that the monthly cap doesn't catch
## Success metrics
- **Single-learner abuse blocked:** % of months in which one learner consumed >5% of org pool. Target: <2% post-launch (vs whatever baseline).
- **Student-side complaints / tickets** about "tutor stopped working": <1 per 1,000 active learners per month.
- **Admin top-up conversion** when pool nears exhaustion: maintained or improved vs. today.
- **Tutor satisfaction** (existing in-product rating): no regression after launch.
- **Leaderboard engagement:** % of paid admins who view the AI credits page weekly, % who drill into a per-learner detail at least once per month. Target: 30% weekly views by month 2 post-launch.
## Rollout plan
1. **Phase 1 — instrumentation (1 week):** add per-learner counter; log usage; no enforcement
2. **Phase 2 — data review (1–2 weeks):** look at real distributions; confirm 100/month is the right value (adjust before broad rollout if data says otherwise)
3. **Phase 3 — silent enforcement on new orgs (1 week):** ship cap + UX for new signups behind a flag
4. **Phase 4 — full rollout:** enable for all orgs; communicate the policy in help docs (not on pricing page)
## Decisions log
All five originally-open questions are now resolved and baked into the spec:
1. **Window** — calendar month, resets on the 1st
2. **Daily/burst cap** — none in v1
3. **Cap value** — flat 100 msgs/learner/month across all tiers
4. **Learner-visible counter** — no, cap is invisible until hit
5. **Cross-workspace pooling** — no, cap is per-workspace
Phase 1 instrumentation may still flag the need to retune the cap value, but the structural choices above are committed for v1.
## Risks
- **Cap too low** → legitimate heavy learners (e.g., test-prep crammers) get blocked. Mitigation: Phase 1 instrumentation; tune before enforcing.
- **Confusing "take a break" message** → learners think the product is broken. Mitigation: clear message + help-doc link; track support tickets in Phase 4.
- **Admin can't tell why pool was drained** if instrumentation is bad. Mitigation: clear per-learner breakdown in admin UI from day 1.
- **Per-learner counter drift** under high concurrency. Mitigation: atomic increment via Postgres counter or Redis with periodic flush; existing AI usage tracking pattern.
## Out of scope
- Per-learner billing
- Model routing to cheaper models when pool low
- Tutor-quality differentiation by tier (Sonnet vs Haiku per tier) — separate decision
- Student-facing pricing or upgrade flows of any kind
+622
View File
@@ -0,0 +1,622 @@
# ClassroomIO Comparison Pages PRD
Status: Draft
Owner: Marketing / Website
Prepared: 2026-05-12
Source basis: `apps/dashboard` product surface plus current public competitor pages.
## Summary
Create comparison pages that position ClassroomIO against 10 incumbent learning platforms. The page set should help buyers who are evaluating hosted course platforms, community-led learning products, company training LMS tools, and open-source/self-hosted LMS options.
The first batch should include 7 SaaS competitors and 3 open-source incumbents:
1. Thinkific
2. Teachable
3. Kajabi
4. LearnWorlds
5. Mighty Networks
6. Circle
7. TalentLMS
8. Moodle
9. Open edX
10. Canvas LMS
## ClassroomIO Product Surface
Based on `apps/dashboard`, ClassroomIO should be positioned as a modern learning platform for organizations that need to create, deliver, manage, and automate learning without stitching together a course tool, community tool, assessment tool, and custom portal.
Core product capabilities to emphasize:
- Course creation with sections, lessons, lesson ordering, course cloning, public/private publishing, landing pages, and settings.
- Rich lesson content including notes, documents, slides, uploaded videos, YouTube, Google Drive video, video transcripts, comments, and AI lesson assistance.
- Exercises and assessments with multiple question types, sections, submissions, manual/assisted grading, marks, and student-level review.
- Certificates with course completion flows, certificate settings, certificate editor, issue flows, and reports.
- Attendance and compliance-oriented course management.
- People management with invites, tutors, bulk email invites, enrollment management, QR sharing, and audience import.
- Analytics for students, progress, lessons, and exercises.
- Programs with courses, people, newsfeed, and settings.
- Communities, discussions, ask flows, course newsfeed, comments, voting, and learner-facing community pages.
- Organization dashboard, audience management, tags, media library, widgets, embedded course displays, organization landing page, and LMS customization.
- Business features including billing, custom domains, organization/team settings, SSO, token auth, API, Zapier, MCP, automation, and AI credits.
- Learner experience with explore, my learning, exercises, programs, settings, and public org/course pages.
- Self-hosting posture is relevant because the site already has self-host/open-source content and the dashboard has org/site-level architecture.
## Goals
- Capture high-intent search demand for "[competitor] alternative", "ClassroomIO vs [competitor]", and "[competitor] vs ClassroomIO".
- Position ClassroomIO as a flexible learning operating system for course businesses, training teams, and education organizations.
- Make the comparison pages useful enough that they can stand alone as buyer enablement assets, not just SEO landing pages.
- Route users from competitor-specific objections into the right ClassroomIO strengths: assessments, certificates, communities, org portals, widgets, integrations, AI, API/MCP, custom domains, SSO, and self-host/control.
## Non-Goals
- Do not attack competitors with unverifiable claims.
- Do not claim exact ClassroomIO superiority where the competitor has mature capabilities ClassroomIO may not fully match yet.
- Do not publish pricing claims without source dates and links.
- Do not build the pages in this PRD. Another agent will implement from this analysis.
## Information Architecture
Recommended route pattern:
- `/compare`
- `/compare/thinkific`
- `/compare/teachable`
- `/compare/kajabi`
- `/compare/learnworlds`
- `/compare/mighty-networks`
- `/compare/circle`
- `/compare/talentlms`
- `/compare/moodle`
- `/compare/open-edx`
- `/compare/canvas-lms`
The `/compare` index should group competitors by buyer type:
- Course platforms: Thinkific, Teachable, Kajabi, LearnWorlds
- Community learning platforms: Mighty Networks, Circle
- Company LMS platforms: TalentLMS
- Open-source LMS platforms: Moodle, Open edX, Canvas LMS
## Required Footer Update
The website footer must be updated when these pages launch.
Implementation requirement:
- Add a "Compare" or "Alternatives" footer column/section in `apps/website/src/lib/components/footer.svelte`.
- Link to `/compare` and all 10 comparison pages, or link to `/compare` with the top 4 pages directly if the footer becomes too dense.
- Suggested direct footer links: `Thinkific alternative`, `Teachable alternative`, `Kajabi alternative`, `Moodle alternative`, and `All comparisons`.
- Footer copy should avoid hardcoded claims like "better than X". Use neutral labels such as "Compare ClassroomIO to Thinkific".
## Page Template
Each comparison page should use the same structure:
1. Hero
- H1: `ClassroomIO vs [Competitor]`
- Subhead: one-sentence positioning that names the buyer and primary tradeoff.
- CTA: Start free / Book demo / View pricing, depending on current website CTA conventions.
2. Quick verdict
- "Choose ClassroomIO if..."
- "Choose [Competitor] if..."
- Keep this honest and practical.
3. Feature comparison table
- Course builder
- Assessments/exercises
- Certificates
- Communities/discussions
- Learner portal
- Custom domain/branding
- Widgets/embed
- Analytics
- SSO/auth
- API/integrations
- AI assistance
- Self-host/control, only where relevant
4. Pricing comparison
- Include "Pricing verified on 2026-05-12" and source link.
- Use "published pricing" language.
- For open-source projects, separate software license cost from hosting, support, implementation, and managed cloud costs.
5. Migration considerations
- What data/assets customers may need to move.
- What workflows differ.
- What ClassroomIO can replace directly versus what may require setup.
6. Best-fit use cases
- 3 to 5 bullets.
7. FAQ
- 4 to 6 competitor-specific questions.
## Shared Positioning
Primary ClassroomIO angle:
ClassroomIO is for teams that want a modern course and learning platform with assessments, certificates, learner management, communities, organization portals, integrations, and AI-assisted authoring in one place.
Secondary angles:
- More learning-native than creator storefront tools.
- More modern and easier to operate than traditional/open-source LMS stacks.
- More flexible for education businesses than community-only products.
- More approachable for growing teams than enterprise LMS products.
## Competitor Research Briefs
### 1. Thinkific
Category: Hosted course platform
Recommended page slug: `/compare/thinkific`
Primary search intent: "Thinkific alternative", "Thinkific vs ClassroomIO", "best Thinkific alternative"
Public positioning:
- Thinkific is a platform for creating, marketing, selling, and delivering online courses, communities, memberships, and digital products.
- Pricing page currently presents tiers including Basic, Start, Grow, and Plus. Public entry pricing varies by billing cadence and promotions, so cite the page directly at publish time.
Pricing research:
- Source: https://www.thinkific.com/pricing/
- Verify again before launch. Pricing pages are high-change surfaces.
ClassroomIO comparison angle:
- Use when buyers want more than a course storefront: assessments, grading, certificates, org/audience management, learner operations, widgets, API/MCP, and training workflows.
- Thinkific is strong for course sales and creator businesses. ClassroomIO should be framed as stronger for structured learning delivery, teams, education businesses, and organizations that need learning operations.
Feature notes:
- Thinkific has mature course commerce and course site features.
- ClassroomIO should emphasize exercises/submissions/marks, certificates, compliance/attendance, programs, widgets, learner/community surfaces, and technical extensibility.
Choose ClassroomIO if:
- You need structured assessments and grading workflows.
- You manage learners, tutors, cohorts, programs, or organizations.
- You want course widgets, API/MCP/Zapier, custom domains, and an organization learning portal.
Choose Thinkific if:
- Your main goal is selling self-paced courses with a mature creator commerce stack.
- You want a large hosted course platform ecosystem with established creator-focused templates.
### 2. Teachable
Category: Hosted course-selling platform
Recommended page slug: `/compare/teachable`
Primary search intent: "Teachable alternative", "Teachable vs ClassroomIO"
Public positioning:
- Teachable focuses on monetizing knowledge through online courses, digital downloads, coaching, memberships, and community.
- Pricing page presents a free plan plus paid Starter, Builder, Growth, and Advanced tiers, with plan limits and transaction fees varying by tier.
Pricing research:
- Source: https://teachable.com/pricing
- Verify transaction fees, product limits, and membership/community availability before page launch.
ClassroomIO comparison angle:
- Teachable is good for creators monetizing knowledge. ClassroomIO should be positioned for teams that need deeper learning management: exercises, submissions, marks, certificates, audience import, tutors, programs, communities, organization setup, and integrations.
Feature notes:
- Teachable's strongest frame is creator monetization.
- ClassroomIO should not over-index on "selling courses"; focus on learning experience and operations.
Choose ClassroomIO if:
- You run a bootcamp, training program, cohort, school, or partner/customer education operation.
- You need assignments, grading, certificates, attendance/compliance, and learner management.
- You want a branded learning portal plus widgets and technical integrations.
Choose Teachable if:
- You are a solo creator prioritizing course checkout, payments, and simple product packaging.
### 3. Kajabi
Category: Premium all-in-one creator business platform
Recommended page slug: `/compare/kajabi`
Primary search intent: "Kajabi alternative", "Kajabi vs ClassroomIO"
Public positioning:
- Kajabi bundles courses, coaching, memberships, website, email, funnels, payments, and creator business tools.
- Pricing is premium and changes over time; the public pricing page is the required source.
Pricing research:
- Source: https://www.kajabi.com/pricing
- Verify plan names, monthly/annual rates, and limits immediately before publication.
ClassroomIO comparison angle:
- Kajabi is a business/marketing suite for creators. ClassroomIO is the better comparison for teams that care more about learning delivery, assessments, certificates, learner management, and education operations than funnels and email marketing.
Feature notes:
- Kajabi likely wins for built-in marketing funnels/email/sales-page maturity.
- ClassroomIO should win the narrative around education workflows, organization learning portals, assessments, certifications, programs, API/MCP, and LMS customization.
Choose ClassroomIO if:
- You need a learning platform first, not a marketing automation suite first.
- You have tutors, cohorts, learners, programs, grading, certificates, or compliance needs.
- You want extensibility through API, Zapier, MCP, widgets, and custom domains.
Choose Kajabi if:
- You want one premium creator-business suite with email/funnels deeply built in.
### 4. LearnWorlds
Category: Advanced hosted LMS/course platform
Recommended page slug: `/compare/learnworlds`
Primary search intent: "LearnWorlds alternative", "LearnWorlds vs ClassroomIO"
Public positioning:
- LearnWorlds offers a course platform/LMS with interactive video, assessments, certificates, website builder, memberships, subscriptions, mobile app options, and enterprise/SCORM-type capabilities depending on plan.
Pricing research:
- Source: https://www.learnworlds.com/pricing/
- Verify tiers such as Starter, Pro Trainer, Learning Center, and High Volume / Corporate before publication.
ClassroomIO comparison angle:
- LearnWorlds is one of the closest advanced course-platform competitors. ClassroomIO should focus on modern team workflows, community/program management, widgets, MCP/API, organization learning portals, and simpler operations.
Feature notes:
- LearnWorlds is strong on interactive learning and mature course website features.
- ClassroomIO should avoid claiming feature parity on every advanced LMS capability unless confirmed during implementation.
Choose ClassroomIO if:
- You want course operations, people management, community, programs, widgets, and modern technical integrations in one simpler platform.
- You need an organization-first learning portal instead of a course-business storefront only.
Choose LearnWorlds if:
- Interactive video, branded mobile app options, and mature advanced LMS packaging are top priorities.
### 5. Mighty Networks
Category: Community-led learning, memberships, events
Recommended page slug: `/compare/mighty-networks`
Primary search intent: "Mighty Networks alternative", "Mighty Networks vs ClassroomIO"
Public positioning:
- Mighty Networks centers on communities, memberships, events, livestreams, challenges, and courses.
- Public pricing includes community/business style plans and higher-tier branded app options. Pricing and plan names change, so cite the official pricing page at launch.
Pricing research:
- Source: https://www.mightynetworks.com/pricing
ClassroomIO comparison angle:
- Mighty is community-first. ClassroomIO is learning-first with community included.
- This page should speak to teams that like community engagement but need course structure, assessments, certificates, grading, audience import, learner progress, and training operations.
Feature notes:
- Mighty should be credited for community UX, memberships, events, and mobile/community engagement.
- ClassroomIO should emphasize course depth and learning operations.
Choose ClassroomIO if:
- Courses, assessments, certificates, learner tracking, and programs are core to the business.
- Community is important but should support a structured learning journey.
Choose Mighty Networks if:
- Your primary product is a community/membership network with courses as one part of engagement.
### 6. Circle
Category: Community platform with courses and memberships
Recommended page slug: `/compare/circle`
Primary search intent: "Circle alternative", "Circle vs ClassroomIO", "Circle community alternative"
Public positioning:
- Circle positions around branded community, courses, events, memberships, discussions, and monetization.
- Public pages show plan-based pricing and transaction-fee considerations; exact plan details should be verified at launch.
Pricing research:
- Sources:
- https://circle.so/pricing
- https://circle.so/platform/courses
ClassroomIO comparison angle:
- Circle is community-first and strong for member engagement. ClassroomIO is better positioned for organizations where courses, exercises, certificates, cohorts/programs, learner analytics, and integrations are first-class.
Feature notes:
- Circle is a serious community competitor and should be treated respectfully.
- ClassroomIO pages should avoid saying "Circle is not an LMS" too bluntly; instead say "Circle is strongest when community is the center; ClassroomIO is built when learning delivery is the center."
Choose ClassroomIO if:
- You need assessments, marks, certificates, attendance/compliance, and course/program operations.
- You want a learning portal with communities, not only a community with courses.
Choose Circle if:
- Your main product is a paid community, membership, or customer community with lightweight learning content.
### 7. TalentLMS
Category: SMB/company training LMS
Recommended page slug: `/compare/talentlms`
Primary search intent: "TalentLMS alternative", "TalentLMS vs ClassroomIO"
Public positioning:
- TalentLMS is a business training LMS for onboarding, compliance, customer training, partner training, sales training, and employee development.
- Pricing page includes free and paid tiers with user limits, and enterprise/custom options.
Pricing research:
- Source: https://www.talentlms.com/prices
ClassroomIO comparison angle:
- TalentLMS is a traditional business LMS. ClassroomIO should position as a more modern, education-business-friendly and creator-friendly alternative for teams that still need training-grade features.
Feature notes:
- TalentLMS likely has mature SCORM, branches, compliance, and enterprise training features.
- ClassroomIO should emphasize modern course authoring, public course/org pages, communities, widgets, AI/MCP, and learning experiences that can serve both business training and education businesses.
Choose ClassroomIO if:
- You need a modern learning portal for customers, partners, cohorts, or education communities.
- You want branded public course pages, widgets, communities, and AI-assisted authoring alongside training controls.
Choose TalentLMS if:
- Your buying checklist is classic corporate LMS, SCORM-heavy training, and formal HR/training department administration.
### 8. Moodle
Category: Open-source LMS
Recommended page slug: `/compare/moodle`
Primary search intent: "Moodle alternative", "Moodle vs ClassroomIO", "open source LMS alternative"
Public positioning:
- Moodle is the most established open-source LMS, widely used by schools, universities, companies, and training organizations.
- Moodle software is open source. Managed options such as MoodleCloud and Moodle Workplace have paid plans or partner/custom pricing.
Pricing research:
- Sources:
- https://moodle.org/
- https://moodle.com/products/moodlecloud/
- https://moodle.com/solutions/moodle-workplace/
ClassroomIO comparison angle:
- Moodle is powerful and highly customizable but often requires setup, hosting, plugins, theme work, maintenance, and admin expertise.
- ClassroomIO should be positioned for teams that want a modern LMS-like experience without maintaining a Moodle stack.
Feature notes:
- Do not imply Moodle lacks capabilities; it has a huge ecosystem.
- The comparison should focus on operational complexity, modern UX, faster setup, creator/team workflows, widgets, AI/MCP, and integrated organization/course/community surfaces.
Choose ClassroomIO if:
- You want a hosted modern learning platform without plugin/theme/server maintenance.
- You need fast course/program launch, branded portals, widgets, AI assistance, and integrated community/course operations.
Choose Moodle if:
- You require deep open-source customization, institutional LMS conventions, plugin ecosystem breadth, and direct control over infrastructure.
### 9. Open edX
Category: Open-source large-scale learning platform
Recommended page slug: `/compare/open-edx`
Primary search intent: "Open edX alternative", "Open edX vs ClassroomIO", "MOOC platform alternative"
Public positioning:
- Open edX is an open-source platform for scalable online learning, MOOCs, universities, enterprises, and governments.
- The software is open source, but production deployments usually require hosting, DevOps, implementation, customization, and support.
Pricing research:
- Sources:
- https://openedx.org/
- https://github.com/openedx/
ClassroomIO comparison angle:
- Open edX is best for institutions that need large-scale, highly customizable online learning infrastructure.
- ClassroomIO should be positioned for organizations that want a faster, simpler, more integrated learning platform for courses, communities, certificates, programs, and learner operations.
Feature notes:
- Open edX has significant depth and scale but high implementation complexity.
- ClassroomIO should focus on speed to launch, lower operational overhead, and practical all-in-one workflows.
Choose ClassroomIO if:
- You want a modern hosted platform without assembling and operating an Open edX deployment.
- Your team prioritizes courses, assessments, certificates, programs, communities, and learner management over deep platform engineering.
Choose Open edX if:
- You need MOOC-scale infrastructure, open-source codebase control, and can invest in engineering/implementation support.
### 10. Canvas LMS
Category: LMS with open-source core and institutional market presence
Recommended page slug: `/compare/canvas-lms`
Primary search intent: "Canvas LMS alternative", "Canvas vs ClassroomIO"
Public positioning:
- Canvas LMS by Instructure is a major LMS for K-12, higher education, and institutions.
- Canvas has an open-source core, while commercial Canvas offerings, hosting, support, and institutional packages are provided by Instructure.
Pricing research:
- Sources:
- https://www.instructure.com/canvas
- https://github.com/instructure/canvas-lms
ClassroomIO comparison angle:
- Canvas is institution-first. ClassroomIO is better framed for smaller teams, education businesses, bootcamps, customer/partner training, and organizations that need modern course/community/program workflows without institutional LMS overhead.
Feature notes:
- Canvas likely wins for deep school/institution LMS workflows, gradebook maturity, SIS integrations, and academic administration.
- ClassroomIO should emphasize fast launch, modern UX, public course/org pages, widgets, communities, AI/MCP, and business-friendly learning operations.
Choose ClassroomIO if:
- You are not a traditional school district/university and do not need a full institutional LMS.
- You want branded course delivery, communities, certificates, widgets, and simpler admin.
Choose Canvas if:
- You need a school/university LMS with institutional workflows, gradebook/SIS expectations, and formal academic administration.
## Cross-Competitor Feature Matrix
Use this as a drafting guide, not a legal claim table. The implementation agent should verify final wording before publication.
| Capability | ClassroomIO | Thinkific | Teachable | Kajabi | LearnWorlds | Mighty | Circle | TalentLMS | Moodle | Open edX | Canvas |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Hosted course builder | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Self/managed | Self/managed | Self/managed/commercial |
| Assessments/submissions/marks | Strong | Moderate | Moderate | Moderate | Strong | Limited/moderate | Limited/moderate | Strong | Strong | Strong | Strong |
| Certificates | Yes | Yes/plan-dependent | Yes/plan-dependent | Yes/plan-dependent | Yes | Limited/plan-dependent | Limited/plan-dependent | Yes | Yes/plugins/core | Yes | Yes/available workflows |
| Communities/discussions | Yes | Yes | Yes/plan-dependent | Yes | Yes | Strong | Strong | Limited/moderate | Yes | Discussions | Yes |
| Programs/cohorts | Yes | Limited/moderate | Limited/moderate | Moderate | Moderate | Yes | Moderate | Learning paths | Yes | Yes | Yes |
| Public course/org pages | Yes | Yes | Yes | Yes | Yes | Limited | Limited | Limited | Requires setup | Requires setup | Institution-focused |
| Widgets/embed | Yes | Limited | Limited | Limited | Limited | Limited | Limited | Limited | Requires custom work | Requires custom work | Requires custom work |
| Custom domains/branding | Yes | Yes/plan-dependent | Yes/plan-dependent | Yes | Yes | Yes/plan-dependent | Yes/plan-dependent | Yes/plan-dependent | Yes with hosting | Yes with hosting | Yes with hosting |
| SSO/auth controls | Yes | Enterprise/plan-dependent | Advanced/enterprise | Higher tiers | Higher tiers | Higher tiers | Higher tiers | Yes/plan-dependent | Yes/plugins | Yes | Yes |
| API/integrations | API, Zapier, MCP | Yes | Yes | Yes | Yes | Yes | Yes | Yes | Extensive/plugins | Extensive | Extensive |
| AI assistance | Yes | Platform-specific | Platform-specific | Platform-specific | Platform-specific | Platform-specific | Platform-specific | Yes/features vary | Plugin/custom | Custom | Vendor/custom |
| Open-source control | Not primary | No | No | No | No | No | No | No | Yes | Yes | Yes core |
## Pricing Guidance For Pages
Because competitor pricing changes frequently, use this rule on every page:
- Include the exact date pricing was checked.
- Link to the official pricing page.
- Avoid anchoring the whole page on exact price if plans, promotions, or annual discounts are likely to change.
- For Moodle, Open edX, and Canvas, explain that open-source software may be free to download but total cost includes hosting, setup, maintenance, upgrades, plugins, security, support, and implementation.
Pricing snapshot verified on 2026-05-12:
| Competitor | Published pricing snapshot | Notes |
| --- | --- | --- |
| Thinkific | Start: $99/mo monthly or $74/mo annual billing. Grow: $199/mo monthly or $149/mo annual billing. Expand: $499/mo monthly or $374/mo annual billing. Plus: custom. | USD per site, taxes extra. Start includes unlimited courses, certificates, assignments, compliance tools, memberships, and 1 community. |
| Teachable | Starter: $39/mo. Builder: $89/mo. Growth: $199/mo. Advanced: $499/mo. | Starter has 7.5% transaction fee. Builder, Growth, Advanced, and Custom list 0% transaction fees when using Teachable payment options; processing fees still apply. |
| Kajabi | Basic: $143/mo billed annually, or $179/mo monthly. Growth: $199/mo billed annually, or $249/mo monthly. Pro: $399/mo billed annually, or $499/mo monthly. | Kajabi says no revenue sharing; payment processing rates still apply. |
| LearnWorlds | Starter: $29/mo monthly or $24/mo annual billing, plus $5 per course enrollment. Pro Trainer: $99/mo monthly or $79/mo annual billing. Learning Center: $299/mo monthly or $249/mo annual billing. High Volume & Corporate: custom. | Starter has per-enrollment fee; Pro Trainer and above list no transaction fees. |
| Mighty Networks | Launch: $79/mo. Scale: $179/mo. Growth: $354/mo. Mighty Pro: custom. | Transaction fees shown by plan: 2%, 1%, 0.5%, 0.5%. Annual billing gives 2 months free. |
| Circle | Professional: $89/mo. Business: $199/mo. Circle Plus: custom. | Add-ons and usage limits can affect total price; verify transaction fees and add-ons at launch. |
| TalentLMS | Core: from $119/mo for 1-40 users on annual billing. Grow: from $229/mo for 1-70 users on annual billing. Pro: from $449/mo for 1-100 users on annual billing. Enterprise: custom. | Pricing is based on monthly active users who log in. Annual billing saves 20%. |
| Moodle | Moodle LMS software: free/open source under GPL. MoodleCloud examples: Mini 100 users/2.5GB at $250 USD annual; Medium 500 users/20GB at $1,110 USD annual; Standard 750 users/50GB at $1,980 USD annual. | MoodleCloud is billed annually and official support notes say billing is in AUD; displayed USD may be indicative. Moodle Workplace / premium hosting is quote-based via partners. |
| Open edX | Open-source software; no standard SaaS list price from Open edX. | Total cost depends on hosting, DevOps, service provider, implementation, support, and customization. Official docs state production installation is not simple and recommend a service provider. |
| Canvas LMS | Open-source core under AGPLv3; Instructure commercial Canvas pricing is quote-based. | Total cost depends on whether using open-source self-hosted Canvas, Canvas Cloud, institution contracts, support, and integrations. |
Current pricing source links:
- Thinkific: https://www.thinkific.com/pricing/
- Teachable: https://teachable.com/pricing
- Kajabi: https://www.kajabi.com/pricing
- LearnWorlds: https://www.learnworlds.com/pricing/
- Mighty Networks: https://www.mightynetworks.com/pricing
- Circle: https://circle.so/pricing
- TalentLMS: https://www.talentlms.com/prices
- MoodleCloud: https://moodle.com/products/moodlecloud/
- Moodle Workplace: https://moodle.com/solutions/moodle-workplace/
- Open edX: https://openedx.org/
- Canvas LMS: https://www.instructure.com/canvas
## SEO Targets
Primary keyword pattern:
- `[competitor] alternative`
- `ClassroomIO vs [competitor]`
- `[competitor] vs ClassroomIO`
- `best [competitor] alternative`
Secondary keyword patterns:
- `online course platform alternative`
- `community LMS alternative`
- `open source LMS alternative`
- `Moodle alternative`
- `Open edX alternative`
- `Canvas LMS alternative`
- `Thinkific alternative for teams`
- `Teachable alternative for training`
- `Kajabi alternative for education`
## Conversion Requirements
Every comparison page should include:
- A primary CTA near the hero.
- A secondary CTA after the comparison table.
- A final CTA after FAQ.
- Link to pricing.
- Link to relevant use-case pages where they exist: customer education, partner training, compliance training, teach.
Recommended CTA copy:
- `Start building with ClassroomIO`
- `See ClassroomIO pricing`
- `Book a demo`
## Content Tone
- Be direct and practical.
- Use "best for" framing rather than winner/loser framing.
- Avoid unverifiable claims such as "the #1 alternative".
- Do not say "free" for open-source platforms without explaining total cost of ownership.
- For competitor pricing, use "published pricing" and include the verification date.
## Implementation Notes
- Build a reusable comparison page data model so each page can be generated from structured competitor data.
- Keep page copy in content/data files where possible so pricing and claims can be updated without editing component layout.
- Add a `/compare` index before or alongside individual pages.
- Update `apps/website/src/lib/components/footer.svelte` as part of launch.
- Add sitemap/metadata entries if the website has an existing SEO/sitemap flow.
- Use existing website components where possible: navigation, footer, page header, FAQ, page signup CTA.
## Acceptance Criteria
- `/compare` exists and links to all 10 comparison pages.
- All 10 individual comparison pages exist with unique competitor-specific copy.
- Every page has a current pricing/source section with "verified on" date.
- Every page includes an honest "choose ClassroomIO if / choose competitor if" section.
- Footer includes comparison page navigation.
- Pages do not contain unsupported superiority claims.
- Pages are responsive and match the existing website visual system.
- Build passes with the website package command.
+234
View File
@@ -0,0 +1,234 @@
---
name: Multi-Workspace (Multiple Orgs Under One Account)
overview: Allow a single customer account to operate multiple organizations ("workspaces") under one subscription. The customer pays in their primary workspace; secondary workspaces inherit the subscription, share pooled quotas (learners, AI tokens), and don't bill separately. Surfaces as a paid tier feature — Growth includes 2 workspaces, Business 3, Enterprise unlimited; extras as a paid add-on. Wedge story: "one account, multiple academies" — customer-facing + internal + partners under one bill.
todos:
- id: schema-decision
content: Decide between Option A (parentOrganizationId on organization) and Option B (separate account table). Recommendation: Option A for v1.
status: pending
- id: data-model
content: Add parentOrganizationId column to organization table; backfill existing orgs to NULL (primary)
status: pending
- id: billing-routing
content: Refactor Stripe subscription handling so the primary workspace holds the subscription and webhook events propagate state to all linked workspaces
status: pending
- id: pooled-quotas
content: Move learner-count and AI-token quota enforcement from per-org to per-account (sum across linked workspaces)
status: pending
- id: account-endpoints
content: Build POST/GET/DELETE /account/workspaces and GET /account/usage endpoints
status: pending
- id: account-settings-ui
content: Build account settings page accessible from primary workspace — list workspaces, per-workspace usage, "Create workspace" CTA
status: pending
- id: workspace-switcher
content: Update existing org switcher to clearly distinguish "workspaces in my account" vs "orgs I'm invited to"
status: pending
- id: secondary-billing-ui
content: Hide or alias billing UI in secondary workspaces — show "Billing managed by [primary workspace name]"
status: pending
- id: downgrade-grace
content: Implement 7-day read-only grace period when a customer downgrades below their current workspace count
status: pending
- id: free-tier-cap
content: Enforce 1-workspace cap on Free tier to prevent abuse
status: pending
- id: pricing-page-update
content: Update marketing pricing page to surface "Workspaces included" row and add-on pricing
status: pending
- id: homepage-section
content: Add "One account, multiple academies" section to apps/website homepage (after feature ships)
status: pending
isProject: true
---
# Multi-Workspace PRD
## Status
- Draft (2026-05-15)
- Owner: TBD
## Problem
Today, every ClassroomIO organization is its own billing entity. A customer who wants:
- A customer-facing academy on `learn.acme.com`, AND
- An internal employee training portal on `team.acme.com`
…must create two separate orgs with two separate paid subscriptions. This:
1. Doubles the cost for no clear product reason
2. Creates billing friction (two invoices, two payment methods)
3. Discourages expansion
4. Misses the wedge story — "one account, multiple academies"
## Goals
1. Let a customer create multiple workspaces (full orgs) under a single subscription
2. Enable centralized billing — one Stripe customer, one invoice
3. Share quotas (learners, AI tokens) across linked workspaces
4. Surface this as a paid tier feature: Growth includes 2 workspaces, Business 3, Enterprise unlimited; extras as paid add-on
5. Keep each workspace fully independent operationally (own brand, domain, members, courses, certificates)
## Non-goals (v1)
- Cross-workspace data sharing (a learner enrolling in courses across both workspaces with a single identity)
- Cross-workspace analytics roll-ups
- Reparenting a workspace to a different primary mid-subscription (manual support op for v1)
- Self-serve "split off" of a secondary workspace into its own subscription (manual for v1)
- Per-workspace seat limits separate from pooled quota
## Users & jobs
| Persona | Job |
|---|---|
| **Account owner** (founder / VP CX) | "I want a second academy for our internal team without paying for a second plan." |
| **Workspace admin** (delegated owner of a secondary workspace) | "I want to manage my workspace fully — branding, courses, members — without seeing billing." |
| **Learner** | No change. Sees only their workspace. |
## Key concepts
- **Account** — the billing entity. Tied to one Stripe customer. Owns 1+ workspaces.
- **Workspace** — a full `organization` row (custom domain, branding, members, courses). Each workspace has exactly one parent account.
- **Primary workspace** — holds the subscription. The first org a user creates becomes their primary by default.
- **Secondary workspace** — any workspace beyond the primary in the same account. Inherits subscription state.
## User stories
### Onboarding
- As an existing paid customer on Growth, I can create a second workspace from a "Workspaces" tab in account settings without entering payment info again.
- The new workspace counts against my plan's workspace allowance (Growth = 2 included).
- If I exceed the allowance, I'm prompted to add a paid workspace add-on or upgrade tier.
### Day-to-day
- I can switch between workspaces via the org switcher.
- I can see pooled usage (X / 1,000 learners, Y / 10M AI tokens) and a per-workspace breakdown.
- A workspace admin (not the account owner) sees their workspace normally; billing UI is hidden or shows "Managed by [primary workspace name]".
### Billing
- The Stripe subscription lives on the primary workspace.
- One invoice lists: base plan + workspace add-ons + overages.
- If the primary workspace cancels or fails payment, **all** linked workspaces are affected (downgrade to free or readonly per existing policy).
### Downgrade / overage handling
- If a customer downgrades from Growth (2 included) to Starter (1 included) while having 2 workspaces:
- All workspaces remain readable but lock to read-only until the customer either deletes a workspace or upgrades back.
- 7-day grace period to resolve.
- If a customer exceeds pooled learner quota, existing per-tier overage policy applies.
### Edge: primary owner leaves the company
- Support can manually transfer subscription ownership to another admin in the primary workspace. Self-serve in v2.
## Functional requirements
### Data model (proposed)
**Option A — direct parent pointer (recommended for v1):**
```
organization.parentOrganizationId → organization.id (nullable)
```
- Primary = `parentOrganizationId IS NULL`
- All workspaces with same parent (or themselves as parent) belong to one account
- ✅ Minimal migration
- ⚠️ Reparenting requires updating all children
**Option B — explicit account table (cleaner long-term):**
```
account (id, stripe_customer_id, plan_id, created_at)
organization.account_id → account.id
```
- ✅ Cleaner billing semantics; future-proof for transfers
- ⚠️ Migration: every existing org needs an account row
**Recommendation: Option A for v1.** Migrate to Option B in v2 if data-model strain shows up.
### Subscription / billing
- One Stripe subscription per account, on the primary workspace.
- Subscription line items:
- 1× base plan
- N× workspace add-on (N = total workspaces − tier's included count, ≥ 0)
- Overage line items
- Webhook handlers must propagate subscription state to all linked workspaces.
### Quota enforcement
- Learner count = SUM of active learners across all workspaces in account.
- AI token usage = SUM of tokens consumed across all workspaces in account.
- Quotas checked at the **account** level on every usage event.
- Per-workspace usage tracked for visibility, not enforced separately.
### Routes & API surface
**New endpoints:**
- `POST /account/workspaces` — create a secondary workspace (account-level auth required)
- `GET /account/workspaces` — list all workspaces in account with per-workspace usage
- `DELETE /account/workspaces/:id` — delete a secondary workspace (cannot delete primary while account exists)
- `POST /account/workspaces/:id/transfer-primary` — promote secondary to primary (v2)
- `GET /account/usage` — pooled usage breakdown
**Existing endpoints affected:**
- All `organization/*` endpoints already scope to the active workspace — no change
- Billing/subscription endpoints operate on the account/primary workspace
### Dashboard UI
1. **Workspace switcher** — existing; needs to scope to "workspaces in my account" plus invited-as-member orgs
2. **Account settings page** (new) — accessible from primary workspace only:
- List of workspaces with status, learner count, AI usage
- "Create workspace" button (tier-aware: "1 of 2 included" / "Add another for $79/mo")
- Billing tab moved here from per-workspace settings (or aliased)
3. **Per-workspace settings** — billing UI hidden on secondary workspaces; shows "Billing managed by [primary workspace name]"
4. **Pooled usage banner** — in account settings: "1,247 of 5,000 active learners across 3 workspaces"
## Pricing logic
| Tier | Workspaces included | Extra workspace |
|---|---|---|
| Free | 1 | – (must upgrade) |
| Starter $49 | 1 | – (must upgrade) |
| Growth $149 | 2 | +$79/mo each |
| Business $399 | 3 | +$149/mo each |
| Enterprise | Unlimited | included |
- Extras prorate normally.
- Annual subscriptions: workspace add-ons priced at 10× monthly (2 months free), matching plan annual logic.
## Success metrics
- **Activation:** % of paid customers who create a 2nd workspace within 90 days. Target: 20% by month 6, 30% by month 12.
- **Expansion ARR lift:** `workspace_addon_mrr / base_plan_mrr`. Target: 10%+ blended lift.
- **Retention:** Net retention on customers with 2+ workspaces vs 1. Hypothesis: 2+ workspace customers churn ~50% less.
- **Support tickets:** No more than 1 ticket per 10 workspace creations in v1.
## Rollout plan
### v1 (4 weeks)
- Schema: add `parentOrganizationId` to `organization`
- Backend: secondary workspace endpoints, pooled quota enforcement, billing updates
- Dashboard: account settings page, workspace switcher tweak, pooled usage banner
- Marketing: ship "one account, multiple academies" homepage section
- Ship to existing paid customers first (manual feature flag), then GA
### v2 (post-launch, scope TBD)
- Self-serve "split workspace into own subscription"
- Cross-workspace analytics roll-up
- Account-level RBAC (single user as admin across all workspaces without per-org invites)
- Migrate to `account` table (Option B) if data model strain emerges
## Open questions
1. **Should free-tier users be able to create multiple workspaces?** Recommend: no (1-workspace cap).
2. **Quota fairness:** if Workspace A burns all the AI tokens, Workspace B has zero — do we expose per-workspace caps as an optional admin control? Recommend: not in v1.
3. **Are workspaces transferrable between accounts?** v1: no, manual support. v2: yes, with consent flow.
4. **Subdomain vs custom domain per workspace:** already supported per-org — confirm SSO/auth flows scope correctly.
5. **Billing edge case:** when adding a paid workspace add-on mid-cycle, prorate immediately or at next renewal? Recommend: immediate prorate (Stripe default).
## Risks
- **Confusing UX** if terminology isn't tight — pick one term ("workspace" or "academy") and use it everywhere
- **Quota gaming** — customers stuffing free workspaces; mitigated by 1-workspace cap on Free
- **Per-workspace SSO config** — each workspace's OIDC config is independent; confirm no cross-pollination of identities
- **Backwards compat** — existing orgs become primary by default; migration is a single backfill (no-op, NULL is already default)
## Out of scope
- Cross-workspace shared course library
- Account-level admin role separate from per-workspace admin
- Public marketplace of shared courses across accounts
@@ -0,0 +1,336 @@
---
name: Website Customer-Education Positioning
overview: Rewrite apps/website to lead unambiguously with customer education for SaaS as the primary wedge. Compliance, partner training, and internal academy stay as supporting use cases. Target reader is a CS / Customer Education leader at a B2B SaaS company who should immediately recognize "this is for me" on the homepage. Grounded in shipped features only — no marketing of unbuilt integrations or capabilities.
todos:
- id: hero-rewrite
content: Replace the wedge-agnostic homepage hero copy with a customer-education-first headline and subhead; swap the hero visual to a branded customer academy
status: pending
- id: homepage-section-reorder
content: Reorder homepage section blocks in +page.svelte to the new flow (Hero → TrustBand → ROI → AI Builds → Brand/Domain → AI Tutor → Certs+Programs → API/Automation → Multi-Academy → OSS → Testimonial → CTA)
status: pending
- id: trustband-on-home
content: Promote the existing TrustBand component from /customer-education to the homepage (Built for product-led SaaS)
status: pending
- id: roi-band
content: Add a "Why customer education, why now" section to the homepage and the /customer-education page with industry stats (+22% retention, +38% adoption, -6.1% support costs) with source attribution
status: pending
- id: ai-builds-academy-section
content: Build a new homepage section highlighting AI course creation (templates + assistant) and the MCP server for agent-driven course authoring — currently underused in marketing
status: pending
- id: multi-academy-section
content: Add a "One account, multiple academies" homepage section explaining multi-workspace (customer-facing + internal + partner portals, each with own brand and domain)
status: pending
- id: programs-section
content: Add a "Many programs in every academy" section highlighting programs as the multi-track primitive (Onboarding, Admin Cert, Power-User Track)
status: pending
- id: vs-help-docs-section
content: Add a "vs help docs" comparison section/table on the /customer-education page positioning the academy against Intercom Articles, Zendesk Guide, Confluence
status: pending
- id: nav-reorder
content: Reorder Solutions in navigation.svelte to Customer Education → Compliance → Internal Training; fold Partner Training into Customer Education or rewrite it (see partner-training-rewrite)
status: pending
- id: nav-developers-dropdown
content: Add a new top-level "Developers" dropdown to navigation.svelte containing Automation (API + webhooks + MCP), Docs (API reference + self-hosting), MCP Recipes (/mcp-recipes), and GitHub.
status: pending
- id: page-vs-help-docs
content: Create /customer-ed/vs-help-docs page — direct comparison vs Intercom Articles / Zendesk Guide / Confluence; SEO-targeted at "alternative to" queries
status: pending
- id: page-templates
content: Create /templates page — public gallery of AI course templates from packages/ai-assistant/src/templates (Product 101, Onboarding, Expert). Audience is course creators / CS leaders, not developers. Top-level route; linked from homepage hero/section + customer-education page + footer. Do not put it under the Developers dropdown.
status: pending
- id: page-automation
content: Create /automation page (replaces planned /integrations) — covers public API, webhooks, MCP server. Lives under the new Developers nav dropdown. No integration logo grid; no fake logos.
status: pending
- id: page-mcp-recipes
content: Create /mcp-recipes page — public gallery of agent prompts/workflows using ClassroomIO's MCP server. The developer-side analog to /templates. Ship 12 recipes grouped by category (Course creation, Content updates, Bulk ops, Publishing, Power user). Lives under the new Developers nav dropdown.
status: pending
- id: partner-training-rewrite
content: Rewrite /partner-training to lead with the multi-workspace pattern ("spin up a dedicated partner workspace alongside your customer academy")
status: pending
- id: compliance-page-soften
content: Soften /compliance-training claims — remove "7-state compliance lifecycle" overclaim and any "audit log export" mention; current module is basic status tracking only
status: pending
- id: footer-cta-rewrite
content: Rewrite the homepage footer CTA to be customer-education specific (replace "Stop chasing training completion manually" with something like "Stop forwarding help articles to every new customer")
status: pending
- id: remove-overweight-sections
content: Move LearnerSection, QuestionTypes, and CertEditorSection off the homepage into feature deep-dive pages; keep linked but de-emphasized
status: pending
- id: language-claim-soften
content: Soften any "10 languages" claim to "Deliver lessons in 10 languages" since UI translation is incomplete
status: pending
- id: seo-target-mapping
content: Map each new/updated page to a primary SEO target keyword and set page metaTags accordingly
status: pending
- id: dont-market-list
content: Audit all pages and remove copy that markets unbuilt capabilities — native integrations (Salesforce/HubSpot/Slack/etc), SCIM, audit-log export, SCORM/xAPI
status: pending
isProject: true
---
# Website Customer-Education Positioning PRD
## Status
- Draft (2026-05-15)
- Owner: TBD
- Source: `company/website-customer-ed-pivot.md`
## Problem
The current `apps/website` homepage treats all four use cases — customer education, compliance, partner training, internal academy — as equal. The hero copy says *"...for teams, customers, and partners."* This produces a wedge-agnostic page where a VP Customer Education at a B2B SaaS company cannot immediately recognize that the product is for them.
The strongest opportunity is **customer education for SaaS** — fastest-growing segment, weakest entrenched competition in the SMB / mid-market slice, strongest ROI proof points. The website needs to commit to that wedge.
The dedicated `/customer-education` page is already strong (~574 lines) but doesn't get the homepage traffic that should funnel into it.
## Goals
1. Make customer education for SaaS the unambiguous primary wedge on the homepage
2. Surface shipped-but-underused capabilities: AI course creation, MCP server, multi-workspace, programs
3. Strengthen the `/customer-education` page with ROI proof, comparison vs help docs, and the multi-academy / many-programs story
4. Add supporting pages a CS / Customer Education leader expects: vs-help-docs comparison, template gallery, automation/API page
5. Demote (don't kill) compliance and partner-training pages; rewrite partner-training around multi-workspace
6. Keep all copy grounded in shipped features — no fake integration logos, no SCIM, no audit-log export, no SCORM
## Non-goals
- Pricing changes or any references to plan/tier mechanics on the marketing site
- Building an ROI calculator
- A native-integration logo grid (we don't have native integrations)
- Building new product features (this PRD covers website only)
- Translating the marketing site into multiple languages
- Redesigning the visual system beyond what the section reorder needs
## Users & jobs
| Persona | Job |
|---|---|
| **VP / Director Customer Education** at a B2B SaaS company (50–500 employees) | "I need to launch a customer academy to reduce support load and drive feature adoption. Is this the right tool?" |
| **CS leader evaluating Skilljar / Intellum / Northpass alternatives** | "Show me how this compares, with a credible product depth and lower friction." |
| **PLG founder / head of CX** at a Series A/B SaaS | "I want a branded learning portal under our domain — fast, AI-assisted, not a generic LMS." |
| **Compliance / partner-program lead** | (Secondary) "Can this do my use case too?" — should still find a clear path two clicks deep |
## Approach
### Homepage rewrite
**New hero copy (replaces wedge-agnostic copy in `apps/website/src/lib/components/hero.svelte`):**
- Headline: *"Teach your customers your product before support has to."*
- Subhead: *"Launch a branded customer academy in days. Train customers, certify power-users, drive adoption — under your own domain, with an AI tutor in every lesson."*
- Primary CTA: *"Launch your academy free →"*
- Secondary CTA: *"See a live academy"*
- Hero visual: a branded customer academy in a browser (e.g. `learn.acme.com`), not the current compliance/security mix
**New homepage section order in `apps/website/src/routes/+page.svelte`:**
| # | Section | Source |
|---|---|---|
| 1 | Hero (customer-education first) | Rewrite |
| 2 | TrustBand — "Built for product-led SaaS" | Promote from `/customer-education` |
| 3 | "Why customer education, why now" — ROI band | New |
| 4 | "AI builds the academy" — templates + chat + MCP | New |
| 5 | "Your brand, your domain" — custom domain + white-label | Existing FeaturesSection, retitle |
| 6 | "AI tutor in every lesson" | Existing AiSection, reframe for adoption |
| 7 | "Verifiable certificates + programs" | Combine existing cert sections |
| 8 | "API, webhooks, MCP — automate everything" | New (no logo grid) |
| 9 | "One account, multiple academies" | New |
| 9b | "Many programs in every academy" | New |
| 10 | "Open source, self-host, no per-seat fees" | New |
| 11 | Testimonial + CTA — customer-ed–specific | Rewrite footer CTA |
**Sections to remove from homepage** (move to feature deep-dive pages, still linked from nav/footer):
- `LearnerSection`
- `QuestionTypes`
- `CertEditorSection`
### Navigation update (`apps/website/src/lib/components/navigation.svelte`)
Reorder Solutions:
1. **Customer Education** (primary, subhead "Customer academies for SaaS")
2. Compliance Training
3. Internal Training
4. Partner Training — rewritten around multi-workspace (or folded into Customer Education)
**Add a new top-level "Developers" dropdown** containing:
- **Automation** → `/automation` (API + webhooks + MCP overview)
- **Docs** → API reference + self-hosting guide
- **MCP Recipes** → `/mcp-recipes` (developer activation gallery)
- **GitHub** → repo link
This is the right home for the OSS + API + MCP positioning that doesn't fit under Solutions.
`/templates` does **not** belong under Developers — it's a content / activation surface for course creators (CS leaders building academies), so it sits as a top-level route linked from the homepage and `/customer-education`. The developer-side analog is `/mcp-recipes`.
### `/customer-education` page enhancements
The page is already substantial. Add three things:
1. **ROI proof band** near the top: "+22% retention, +38% adoption, -6.1% support costs" with industry-stat source attribution
2. **"vs help docs" comparison section** — direct fair-fight against Intercom Articles, Zendesk Guide, Confluence (which we win on certification, programs, AI tutor, analytics)
3. **"One account, multiple academies" + "Many programs per academy"** — explain multi-workspace + programs as separate but complementary patterns
Do NOT add an integration logo grid (no native integrations).
### New pages
| Page | Lives under | Purpose | Primary SEO target |
|---|---|---|---|
| `/customer-ed/vs-help-docs` | Solutions › Customer Education | Captures "alternative to Intercom Articles / Zendesk" intent | "alternative to intercom articles", "customer academy vs help docs" |
| `/templates` | Top-level (linked from homepage section + `/customer-education` + footer). **Not** under Developers — audience is course creators / CS leaders. | Public gallery of AI course templates | "customer onboarding course template" |
| `/automation` | **Developers (new dropdown)** | Public API + webhooks + MCP server | "lms api", "open source lms api", "mcp lms" |
| `/mcp-recipes` | **Developers (new dropdown)** | Gallery of agent prompts/workflows using ClassroomIO's MCP server — developer-side analog to /templates | "mcp examples", "claude mcp lms", "claude course automation" |
### Rewrites / softening
| Page | Change |
|---|---|
| `/partner-training` | Rewrite around multi-workspace: "Spin up a dedicated partner workspace alongside your customer academy — separate brand, separate domain, one bill." |
| `/compliance-training` | Soften "7-state compliance lifecycle" to "track compliant / expiring / non-compliant"; remove any "audit export" mention; module is basic status tracking only |
| Homepage footer CTA | Replace "Stop chasing training completion manually" with customer-ed-specific copy (e.g. "Stop forwarding help articles to every new customer") |
| Any page mentioning "10 languages" | Soften to "Deliver lessons in 10 languages" — UI translation is incomplete |
### Honest-claims rules (applies to every page)
- Don't list native integrations (Salesforce, HubSpot, Slack, Zapier, Notion, GitHub, Intercom, Zendesk, Segment) — none are built
- Don't mention SCIM, audit log export
- Don't mention SCORM / xAPI
- Don't pitch sub-orgs / nested tenancy as separate from multi-workspace (they are the same shipped feature)
- "Multi-tenant" = per-org branded academies AND multi-workspace under one account (both shipped)
## Functional requirements
### Components touched
- `apps/website/src/routes/+page.svelte` — section reorder
- `apps/website/src/lib/components/hero.svelte` — copy + visual rewrite
- `apps/website/src/lib/components/navigation.svelte` — reorder, add Customers link
- `apps/website/src/lib/components/trust-band.svelte` — promote to homepage
- `apps/website/src/lib/components/features-section.svelte` — retitle for branded-academy framing
- `apps/website/src/lib/components/ai-section.svelte` — reframe for adoption
- `apps/website/src/lib/components/page-signup-cta.svelte` — rewrite copy
- Existing wedge pages (`customer-education`, `compliance-training`, `partner-training`) — content updates per above
### New components (likely)
- ROI band component (reusable on homepage and `/customer-education`)
- "AI builds the academy" section (templates + chat + MCP triple)
- "One account, multiple academies" section (multi-workspace pitch)
- "Many programs per academy" section (programs pitch)
- "vs help docs" comparison table component
- Case-study card component
### New routes
- `apps/website/src/routes/(marketing)/customer-education/vs-help-docs/+page.svelte` (match existing marketing-group pattern)
- `apps/website/src/routes/templates/+page.svelte`
- `apps/website/src/routes/automation/+page.svelte`
- `apps/website/src/routes/mcp-recipes/+page.svelte`
### `/mcp-recipes` page spec
**Top of page:**
- Hero — *"Build and manage courses with your AI agent. 12 recipes using ClassroomIO's MCP server."*
- 3-step setup: install MCP, connect ClassroomIO, paste a recipe
- "Why MCP" 2-line explainer for non-technical readers
**Body:**
- Filter chips by category (Course creation / Content updates / Bulk ops / Publishing / Power user)
- Grid of recipe cards
**Per recipe card → detail page:**
- Title + 1-line outcome
- Use case ("when to reach for this")
- **Copyable prompt** — the actual text to paste into an agent
### Recipes to ship at v1 (12 total)
**Course creation (4):**
1. Create a course from a PDF
2. Spin up a Customer Onboarding academy from your docs site
3. Convert a Loom recording (transcript) into a lesson
4. Generate a course from a one-line brief
**Content updates (3):**
5. Regenerate quiz questions for an existing course
6. Translate a course's lessons to Spanish
7. Rewrite a course landing page for a new audience
**Bulk ops (2):**
8. Re-tag every course by topic using AI
9. Reorder lessons across multiple courses for consistency
**Publishing (2):**
10. Publish a draft to production
11. Clone a flagship course into a new program
**Power user (1):**
12. Daily course-health digest (list courses, summarize completion, post to Slack via webhook)
### SEO
- Each new page sets primary keyword in metaTags
- Internal linking: homepage → customer-education → vs-help-docs / case-studies / templates / automation
- Keep existing `docs-vs-company-academy` page; cross-link
## Success metrics
- **Homepage clarity:** qualitative — usability test with 3–5 CS leaders; can they describe the product in one sentence after 30 seconds?
- **Customer-ed page traffic:** % of homepage sessions that click through to `/customer-education` — track increase post-launch
- **Demo / trial signups attributed to customer-ed pages:** baseline now, target 2× by month 3
- **Developers dropdown engagement:** clicks on the new Developers nav item; visits to `/automation`, `/mcp-recipes`, and self-host docs
- **SEO rankings:** track positions for "customer academy software", "customer education platform", "alternative to skilljar/intellum", "open source LMS for customer education"
- **No regression** in compliance / partner / internal-training conversion paths (they remain reachable, just demoted)
## Rollout plan
### Week 1 — homepage + nav
- Hero rewrite, section reorder, nav reorder
- Add new **Developers** dropdown
- Footer CTA rewrite
- Promote TrustBand to homepage
- Soften any unbuilt-feature claims sitewide
### Week 2 — customer-education page enhancements
- ROI band
- vs-help-docs section / table
- Multi-academy + many-programs sections
### Week 3 — supporting pages
- `/templates` (gallery from AI templates)
- `/automation` (API + webhooks + MCP) under Developers
- `/mcp-recipes` (12 agent recipes) under Developers
### Week 4 — rewrites
- `/partner-training` rewrite around multi-workspace
- `/compliance-training` softening pass
- `/customer-ed/vs-help-docs` page
## Open questions
1. **Hero visual asset:** do we have a usable screenshot of a real branded academy, or do we need a mockup designed?
2. **Partner-training nav slot:** keep it as a top-level Solutions item or fold into Customer Education? Recommend: keep as its own item now that multi-workspace makes it real.
3. **Internal training:** does it need its own page or is it adequately covered by the demoted Compliance + Partner pattern? Recommend: defer until there is signal from inbound.
4. **vs-help-docs page tone:** direct and named (Intercom Articles, Zendesk Guide, Confluence) or generic? Recommend: named — captures the comparison intent and is fair.
5. **Developers dropdown items beyond /automation:** include /docs route if one exists; otherwise the dropdown is API + self-host + GitHub for v1.
6. **Case studies:** noted absent for v1; revisit when we have a named customer willing to be quoted. Footer CTA + testimonials remain as social proof in the meantime.
## Risks
- **Wedge over-narrowing** alienates compliance/internal/partner inbound. Mitigation: keep those pages live and reachable two clicks deep; don't delete content.
- **Hero copy too cute** ("before support has to") may not match buyer phrasing. Mitigation: A/B test against a more literal alternative in week 2.
- **New pages launched with thin content** dilute brand. Mitigation: case-studies allowed placeholder; vs-help-docs and templates require real content before launch.
- **Sectional bloat** if every new section is added without removing the moved-off ones. Mitigation: keep the section-removal todos paired with the new-section work.
## Out of scope
- Any pricing-page changes
- Visual redesign / theme work
- Dashboard / product UI changes
- Translation of marketing site
- Building the ROI calculator
- Building native CRM / support-tool integrations