Content
Content items are the publishable units of Cursare: each one brings together the authoring, distribution, learner experience, and commercial configuration of a course, lesson, or path. This page describes the data model, the two kinds of content, ownership, settings, and lifecycle.
The model: one row, updated in place
Each content item is a single row in the database, with two documents:
| Field | Role |
|---|---|
draftDocument | The editable draft — what the team sees in the editor. |
publishedDocument | What learners read — a frozen copy, written only when you publish. |
The row's id is the content item's stable identity across the entire platform: enrollments, purchases, reviews, quiz history, and the reference edges of a composition all point to it. As long as publishedDocument is null, the content is a draft — invisible to learners and absent from the catalog.
Two kinds: course and material
Every content item has a kind, and creation offers two doors:
| Kind | Created via | Public slug | Offers | Read where |
|---|---|---|---|---|
| Course | New course | Yes — /{organization}/{slug} is its sales page | Born with the primary Standard offer and always keeps exactly one primary | On its own public page |
| Material | New material | None | None, not even archived | Inside the courses that reference it |
New course is title-first: you type the title and the URL handle is derived automatically (and stays editable before you confirm). Creating the course creates its primary Standard offer — free and unlisted — in the same transaction. Selling terms are configured in Enrollment. A course is never "not yet sellable": it is born whole.

New material asks only for a title — plus the owner, when the organization has teams. A material has no slug, no public page, and no commercial settings. It contains the lessons and activities learners read inside parent courses. Its editor makes that role explicit with Learning content and Used in, where the team can see and navigate every authorized parent course.

The handle (slug) rules, for courses:
- 1 to 120 characters, only lowercase letters, numbers, and hyphens (
^[a-z0-9-]+$); - unique within the organization.
On creation you can also pick the owning team (optional) — see Ownership below.
From the list's ⋯ menu you can also Duplicate a content item: this creates a new draft with the title renamed to <title> (copy) and, for courses, a free slug in the -copy, -copy-2, … series. The copy carries over the packaging (kind, tags, theme, pricing, seat limit, and ownership), but never the published document, learners, reviews, or sales.
Changing kind: promote and demote
The kind is a ceremony, not a cage:
- Promote to course — on a material's Advanced tab. The material gains a public handle and its primary Standard offer, and starts to sell like any course.
- Turn into material — the reverse: the course's offers are deleted and its slug is released. It is refused while the course has learners, sales, any enrollment-request history, or campaigns targeting its offers — those all depend on the course's public, sellable existence.
See Publishing and access for how kind interacts with publishing and the public page.
Configuration areas
A content item's configuration is organized into grouped submenus. Each area has a specific responsibility; the editorial body lives only in the editor. Materials show only the areas that apply to them (no Audience, no Business).
| Group | Submenu | Purpose |
|---|---|---|
| Authoring | Editor | One course surface containing the public Presentation, the ordered material Curriculum, and Related courses. |
| Authoring | Learning content | The full lesson and activity editor. Materials only. |
| Authoring | Used in | Authorized parent courses whose draft Curriculum includes the material. Materials only. |
| Setup | Basics | Handle (courses, once published) and theme — the content's address and look. The title and description stay in the document header. |
| Setup | Discovery | Tags, search appearance (meta title/description), social image, and the search-engine switch — how people find this course. |
| Audience | Learners, Cohort, Insights | Who is enrolled, the course's cohorts, and its reports. Courses only. |
| Business | Pricing / Enrollment / Offers | The course's offer(s): price, installments, approval, intake form, seat limit, listing. Courses only. |
| Manage | Advanced | Ownership (the responsible team or person), the kind ceremony (promote/demote), and the danger zone. |
Authoring profiles
A course has a rich public Presentation and an ordered Curriculum. Presentation accepts public storytelling blocks but not lessons, graded activities, private learning media, or material references. Curriculum accepts only material references. A material keeps the complete learning editor: sections, media, code, activities, assessments, polls, and flashcards.
All three controls live in the same course Editor and the same course document. The Curriculum selector accepts an existing material or New material…, which creates an empty draft material and inserts it into the path. Each reference exposes its own editable URL segment; that address belongs to the course and does not give the reusable material a slug. Related courses uses the same compact selector pattern but accepts existing courses only; recommendations appear on the sales page and never grant learner access or count toward progress.
Ownership of a content item
Every content item belongs to exactly one side — never both:
| Owner | How it looks | Who is responsible |
|---|---|---|
| Team | teamId set, ownerId null | The team's members, according to each one's role. |
| Person | ownerId set, teamId null | The owning person is responsible for all functions. |
| Organization | both null | Only organization owners/admins (content created via API). |
When there is no team, the owning person is responsible for everything. Reassigning ownership (to a team or to an organization member) always leaves exactly one side set. Organization owners and admins are a fallback over any content item.
Functions and roles
A content item has three functions, and each function corresponds to a per-member role in the owning team (team_member_role):
| Role (team_member_role) | Function | What it authorizes |
|---|---|---|
editor | content | Edit the draft, publish, rename the handle, tags, theme, and duplicate. |
finance | finance | Price, currency, installments. |
cohort | cohort | Manage cohorts: administer, moderate, and make up the tutor pool. |
Authorization resolution, from the highest ceiling down to the lowest:
- Organization owner/admin — passes on any function and also in the danger zone.
- Owning person — holds all of the content's functions.
- Member of the owning team — only the function whose role they carry.
- Organization content (no owner and no team) — grants only to organization owners/admins.
Catalog, listed, and unlisted but sellable
An organization's public catalog gathers its courses that are published AND listed (listed = true), from most recent to oldest. Storefront listing is paid-only: a course can be listed only once it has a price, so free courses are always unlisted and reachable by direct link only. Materials never enter the catalog at all — they have no public page. This separates two important cases:
- A course's internal modules (materials) never appear as standalone cards: they are read inside the composition only.
- Unlisted but sellable: a course can be out of the catalog and still have a price and be purchased via direct link. It is also the way out for a course that has already sold and that you want to take out of circulation — unlist instead of deleting.
Pricing and access
A course's commercial life lives in Enrollment — entry, price, delivery, and rules. With one option the workspace edits the learner path directly; with two or more it becomes Ways to enroll. The full model — the Standard offer born with the course, additional offers, campaigns, and buyer checkout — is in Pricing & checkout; the enrollment journey is in Learners and enrollments.
Two rules worth carrying everywhere: the currency locks after the first sale, and a course always keeps one active offer — archiving the last one is refused.
Tags and theme
- Tags — free-text labels: type anything and it sticks. Names are normalized to lowercase and deduplicated, limited to 12 tags per content item, each up to 32 characters. The editor suggests tags your other contents already use, so spellings converge naturally.
- Theme — sets the trio of accent colors the components render with; it must be a known theme.
Renaming the handle
Renaming a course's handle is safe by design: the id is the stable identity everywhere, and course URLs use edge slugs that belong to the parent content, so renaming a child never breaks the compositions that use it. Only the old public links start returning 404. Materials have no handle to rename.
Lifecycle
The recommended flow is draft → review → publish → follow-up → republish in place:
- Draft — edit the body in the editor; learners see nothing until you publish.
- Review — use the preview before publishing, and avoid changing commercial rules at the same moment you deeply change the content.
- Publish — validates the persisted authoring profile, copies the draft into
publishedDocument, recordspublishedAt, and recalculates Curriculum edges and section ids. Materials publish too; reused materials show an impact warning. - Follow-up — see engagement and outcomes in Insights.
- Republish — repeat as many times as you need; learner progress is preserved.
Danger zone (deletion)
Deletion is restricted to the owning person or an organization owner/admin and has two safety locks:
- Referenced by other content — refused while another composition uses this content as a module. Remove the references first, otherwise the courses would be left hanging.
- Already purchased — refused while any purchase exists. A purchase is a promise: unlist instead of deleting.
When deletion proceeds, enrollments, reviews, and quiz history are removed in cascade. Prefer taking it out of the catalog or halting new enrollments whenever there are still learners attached.