Content
Content items are the publishable units of Cursiva: each one brings together the authoring, distribution, learner experience, and commercial configuration of a course, lesson, or path. This page describes the data model, ownership, settings, and lifecycle of a content item.
The model: one row, updated in place
Each content item is a single row in the database, with two documents:
| Field | Role |
|---|---|
content | The editable draft — what the team sees in the editor. |
publishedContent | 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 publishedContent is null, the content is a draft — invisible to learners and absent from the catalog.
Creating a content item
Use Content in the dashboard to create, find, and open content items. A new content item is born as an unpublished draft, with an empty body. On creation you define:
- Slug — the identifier in the URL. It must be 1 to 120 characters and use only lowercase letters, numbers, and hyphens (
^[a-z0-9-]+$). It is unique within the organization. - 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 a free slug in the -copy, -copy-2, … series. The copy carries over the packaging (tags, theme, price, currency, seat limit, and ownership), but never the published state, learners, reviews, or sales.
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.
| Group | Submenu | Purpose |
|---|---|---|
| Setup | Basics | Title, description, slug, theme — the content's identity. |
| Setup | Catalog | Tags, presentation, and discovery; catalog visibility (listed). |
| Enrollment | Access | Entry rules: price, installments, approval, intake form, and seat limit. |
| Enrollment | Format | Experience behavior: standalone content, course/path composition, and temporal pacing. |
| Manage | Ownership | The responsible team or person and members' roles. |
| Manage | Danger | Deleting the content — the irreversible action. |
Format: a content item's three formats
The same type of content takes on three formats, depending on its configuration:
| Format | How it forms | Behavior |
|---|---|---|
| Standalone | Published, with no references and no price. | Read on its own; free when listed, appears as a card in the catalog. |
| Sellable | Given a price. | Goes through checkout; can be unlisted but sellable (sold via direct link). |
| Composition (bundle) | Gains references to other content in the editor. | Becomes a navigable course/path; each reference is a learner destination. |
A composition is assembled by adding references in the editor — ideal for programs with independent modules, paths that reuse fundamentals, and libraries by level. References are resolved into edges (referenceEdges) only at publish time. See Platform concepts for the relationship between content and reference.
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 slug, tags, theme, seat limit, approval, intake, temporal, duplicate. |
finance | finance | Price, currency, installments. |
community | community | Manage communities: 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
The public catalog gathers every content item that is published AND listed (listed = true), from most recent to oldest. This separates two important cases:
- A course's internal modules stay unlisted: they are read inside the composition but never appear as a standalone card in the catalog.
- Unlisted but sellable: a content item 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 content item that has already sold and that you want to take out of circulation — unlist instead of deleting.
Seat limit
The seatLimit sets the maximum number of enrolled learners. A null value or 0 means no limit; Cursiva rejects non-integer values and caps the ceiling at 10,000,000. A content item reports seat usage (enrolled count, limit, and whether it is full when the enrolled count reaches the limit).
Pricing and access rules
Price and access are governed by the finance function (and, for approval and intake, by the content function):
| Setting | Rule |
|---|---|
| Price | In the currency's cents (smallest unit); null or 0 = free. Ceiling of $1,000,000.00. |
| Currency | A 3-letter code (ISO-4217, e.g., BRL, USD). Cannot change once the content item has sales. |
| Installments | From 2 to 12 monthly card charges; null = pay in full only. |
| Approval | When active, free sign-ups become requests to approve. |
| Intake | Points to a reusable form (Settings → Intakes) from the same organization; null detaches it. |
For prices, coupons, and the buyer checkout, see Pricing & checkout; for the enrollment journey, see Learners and enrollments.
Tags and theme
- Tags — each tag must already exist in the organization's registry; the assignment adopts the registered spelling and is limited to 12 tags per content item, each up to 32 characters. A content item never carries a label that the organization does not manage.
- Theme — sets the trio of accent colors the components render with; it must be a known theme.
Renaming the slug
Renaming the slug 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.
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 — copies the draft into
publishedContent, recordspublishedAt, and recalculates reference edges and section ids. - 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.