CursivaDocs
Start here

Platform concepts

This is Cursiva's mental model: a small set of concepts that combine to describe any learning experience, from a standalone piece of text to a complete program. Understanding how they connect prevents you from duplicating material and creating conflicting rules.

Content is the central unit

A content is the platform's only publishable unit. It owns identity (slug, tags, theme) and the editorial body; access, format, and commercial terms live on its offers (see Offers & checkout), and a course always has at least one. Everything else in Cursiva — enrollments, purchases, reviews, quiz history, and references — points to a content's stable id.

Each content is a single row in the database, updated in place. It holds two states:

StateWhat it isWho reads it
Draft (content)The editable working versionThe team, in the editor
Published (publishedContent)The frozen copy from the last publishLearners

Publishing copies the draft into the published state, records the date, and recomputes derived facts. There are no version rows: the learner always reads the latest publish, and progress survives because it is anchored to stable section identifiers, not to version numbers.

Course and material: the first-class distinction

Every content has a kind, and the kind decides its whole public life:

KindPublic pageOffersWhere it is read
CourseYes — /{organization}/{slug} is its sales pageAlways at least one active offer and exactly one defaultOn its own page, by enrolled learners
MaterialNone — no slug, no public URLNone, not even archivedInside the courses that reference it

A course is the sellable, enrollable unit. It has a public slug, and its page is where visitors read the pitch, pick an offer, and enroll or buy. A course is born with its offer: creating one ("New course" — you type a title, the handle is derived automatically and stays editable, and you can set a price on the spot) creates the course and its default Standard offer — free and unlisted until you say otherwise — in a single act. There is no separate "make it sellable" step, and a course never exists without at least one active offer.

A material is pure substance: a lesson, a reference chapter, a resource. It has no slug, no public page, no offers, and never appears in the marketplace. Learners reach it only inside a course that references it, through URL segments owned by the parent course. The team edits it directly by id.

The kind is not a cage. A material can be promoted to a course — it gains a slug and a Standard offer — and a course can be turned into a material — its offers are deleted and its slug is released — as long as no learners, sales, enrollment-request history, or campaigns depend on them. See Publishing and access for the ceremony.

The content list, with course and material kinds distinguished and the single New button

Three shapes of the same idea

Combining kind, price, and references, the same object takes on three roles:

  • Standalone course — a course that stands on its own. It is read end to end, without depending on others. Published and priced, it can be listed to appear as a card in the catalog; while free, it stays reachable by direct link only.
  • Composed course — a course that references other contents. Instead of copying lessons into several courses, it points to the originals and becomes a course, path, or program assembled from reusable pieces.
  • Material — the reusable piece itself: authored once, referenced by any number of courses, never sold on its own.

Composition through references

A reference is an edge that links a parent content to a child content. You insert it in the editor, and it carries three pieces of information:

Reference fieldMeaning
keyThe id of the referenced content (what the edge points to)
slugThe URL segment, owned by the parent course (the child can be renamed without breaking the parent)
titleA snapshot of the title, used in breadcrumbs without loading the child

A content's references form a directed graph. On publish, this graph is recomputed and sanitized: each edge only survives if the target is a published content from the same organization. This discards — by rendering the reference inert — three dangerous cases:

  • Targets from another organization — prevents an enrolled learner from reading someone else's paid or unlisted material for free.
  • Targets with no published version — prevents a card that could never be completed, leaving the course forever incomplete.
  • Deleted targets — prevents dangling edges.

In addition, cycles are removed: a content cannot reference another one that already reaches it. The result is always an acyclic intra-organization graph. Publishes within the same organization are serialized (by a lock), so that two simultaneous publishes don't jointly form a cycle.

Continuous navigation under a single enrollment

A composition can have any depth of nesting, but the learner enrolls only once, in the root course — the sellable unit. There is no separate enrollment for each referenced material.

From the root, the learner navigates continuously across the entire referenced tree. The platform resolves each URL segment against the enrolled tree (the shallowest match wins) and builds the breadcrumb along the shortest path from the root to the open module. A module is only accessible if it belongs to that person's active enrollment tree.

Access and progression

Access determines who can get in. Progression determines what becomes available after someone is already in. The two rules are independent: a learner can have access to the entire course and still find modules released over time (drip) or by prerequisite.

ConceptResponsibility
PublishingDefines the version visible to the learner
ListingDefines whether the course appears in the catalog
AccessDefines who can get in (price, approval, seat limit)
OfferThe sellable package of a course — price, format, entry terms
EnrollmentLinks a person to a course (the learner row)
ProgressRecords completed sections by stable id
DripReleases steps after an interval
PrerequisiteRequires completing another step before releasing

Because every course is born with an offer, access derives above all from the offer's price: a free offer allows direct enrollment; with a price, access goes through checkout. Additional layers can require approval (free enrollment becomes a request) and impose a seat limit. A course can also carry multiple offers — different prices and terms for the same access — and campaigns can discount them; everything aggregates on the course. Progress is stored as the set of completed section ids; because completion is always recomputed against the current ids, removed sections drop out of the calculation and genuinely new sections honestly reopen the course.

Completing a tree

A composed course is only considered complete when all of its own sections are done and every referenced content, at any depth, is also complete. It is this whole-tree completion, starting from the root, that unlocks the certificate.

Learners and members

Two distinct populations coexist in an organization, and the distinction must always stay clear:

RoleWho they areLink
LearnerA student enrolled in a course through an offerlearner row (person + course + current offer)
MemberSomeone on the team who runs the operationOrganization member

The same user can be a learner in one organization and a member in another — they are independent links. There is at most one enrollment per person and course, and it points to exactly one offer of that course. Alternative offers are entry choices before enrollment, not parallel entitlements: while the enrollment is active or past due, the learner cannot switch offers or buy another offer for the same course. Enrollment is idempotent: enrolling through the same offer returns the existing row. Only an active enrollment grants access; refunded or past-due enrollments keep the row (for history) but do not open the course. A paid learner also points to its exact current purchase, while free/comped learners keep that pointer null.

Member roles and the content's three functions

At the organization level, owner and admin hold structural authority and pass any content check. Below that, authority over a content is assigned by function, and each function corresponds to a member's role on the content's owning team (content.teamId):

Function (domain)Team roleWhat it authorizes
contenteditorEdit the body, publish, tags, theme, format
financefinancePrice, currency, installments, refunds, listing
cohortcohortManage cohorts, moderate, act as tutor

Campaigns (coupons) are not covered by any of these functions: creating and editing them is an organization surface, restricted to owner and admin.

A content can be owned by a person (personal content) or a team — never both at the same time. The owning person holds all functions over their content. Owner-level actions (transferring ownership, deleting), however, require the owning person or an organization admin — no team role reaches that level.

Organizational structure

The organization is the operation's main space; it is the source of the public catalog and the producer pages. Within it:

  • Teams are the organization's schools: they slice the staff by curriculum area (a School of Programming, a School of Backend), not by company function, and each school owns the contents of its area. The team that owns a content is the authority over it, and the per-member roles (editor, finance, cohort) provide the granularity described above.
  • Cohorts are delivery groups for one offer: they keep dates, seats, one tutor, and discussion together. An enrollment points directly to at most one cohort of its own offer.

Self-paced or cohort delivery

Format belongs to the offer, not the content. The same course may have a self-paced offer and a cohort-delivered offer:

deliveryModeHow it works
self_pacedThe learner advances at their own pace; drip counts from enrollment. A cohort is optional and can exist only for discussion.
cohortEnrollment points to a dated cohort of the same offer; drip counts from that cohort's start.

Cohort-delivered offers can create cohorts automatically, with configurable duration, seat limit, and tutor. The tutor can be fixed or selected by least load among eligible owning-team members.

Next steps

Your privacy choices

Necessary cookies keep Cursiva working. Analytics and marketing technologies are optional and stay off until you choose them. Privacy Policy.