Lifecycle & Journeys
The lifecycle is an institution-wide state machine that defines every stage a profile can occupy and the allowed transitions between them. It powers the journey from first contact to alumni status, tracks withdrawal, and enforces valid state changes.
Overview
Each institution has a single lifecycle definition. The lifecycle is a tree of states, each containing one or more substates, connected by transitions:
A profile's position in the lifecycle is stored on each of its roles. Since a profile can have roles in multiple contexts (institution, classes, courses), it can be at different lifecycle stages simultaneously — for example, student::enrolled in one class and applicant::submitted in another.
States and Substates
States
States are the top-level stages of the lifecycle. Common states include:
| State | Description |
|---|---|
prospect |
A person who has shown interest but has not applied |
applicant |
A person with an active application |
student |
An enrolled student |
alumnus |
A graduated student |
contact |
An external contact (not in the student pipeline) |
staff |
An institutional staff member |
admin |
A platform administrator |
lecturer |
An instructor or professor |
Substates
Each state contains one or more substates that add granularity:
Example substates for the applicant state:
| Substate | Description |
|---|---|
draft |
Application started but not submitted |
submitted |
Application submitted, awaiting review |
processing |
Application under review |
decision_made |
Decision issued |
The state::substate Pair
A role's position is always expressed as a state::substate string — for example, applicant::submitted or student::enrolled. This pair is the primary key for lifecycle queries.
Transitions
Transitions define which moves between substates are valid. Each transition specifies a starting position, a destination position, and the event that triggers it. Attempting an invalid transition is blocked by the platform.
Transition Access by Role
Transitions can be filtered by the user's role. For example, admissions staff may see different available transitions than academic staff. This enables role-aware workflows where each team only sees the actions relevant to their responsibilities.
Journeys
A journey is the ordered path through the lifecycle's fluid states. Fluid states are the states that represent forward progression (typically prospect, applicant, student, alumnus), as opposed to lateral states like staff or contact.
Journey Ordering
The lifecycle defines an ordered sequence of fluid states. Within each state, substates are also ordered. This produces a fully ordered sequence that powers:
- Journey visualization — progress bars showing how far a profile has advanced
- Comparison — determining if one role is "higher" than another
- Downstream navigation — knowing which states come after the current position
Downstream Exclusions
Individual substates can define downstream_excluded_states — positions that should not be reachable from that substate. This prevents scenarios like a withdrawn student re-enrolling in the same cohort without going through readmission.
Roles in Contexts
Lifecycle states are assigned to profiles through roles, and each role belongs to a context:
| Context Type | Description | Example |
|---|---|---|
| Institution | The institution itself | General staff, admin roles |
| Class (Cohort) | A specific intake or cohort | student::enrolled in "MBA 2026" |
| Course | An individual course | student::active in "Marketing 101" |
A profile interacts with the lifecycle independently in each context. Enrolling in a new class creates a new role starting at the lifecycle's initial state.
Adding and Removing Roles
Roles can be added, removed, and transitioned through the platform UI, automation workflows, or the API:
- Add — Creates a new role in a context and triggers automation events
- Remove — Removes the role after checking for dependencies (e.g., active applications)
- Update state — Transitions the role to a new state/substate through the lifecycle state machine
Ownership and Campus
Each role can have:
- An owner — a staff profile responsible for the person in that context
- A campus — linking the role to a specific campus location
Potential
Each role carries a potential rating used for lead scoring and prioritization:
| Value | Numeric | Description |
|---|---|---|
unknown |
0 | Not yet assessed |
low |
1 | Low priority |
medium |
2 | Medium priority |
high |
3 | High priority |
Potential ratings enable sorting and filtering profiles by priority level.
Withdrawal
A role can be marked as withdrawn to indicate the profile has left that context. Withdrawal is separate from lifecycle state — a student can be withdrawn from a class without changing their overall lifecycle state.
Withdrawal Details
Each withdrawal records:
- Whether the role is withdrawn
- When the withdrawal occurred
- One or more withdrawal reasons
- An optional free-text explanation
Withdrawal Reasons
Institutions can configure withdrawal reasons. The default set includes:
unknownpersonalprofessionalfinancialcompetitiondeferred
Institutions can also define custom withdrawal reasons.
Withdrawal Operations
- Withdraw — Marks the role as withdrawn, records the timestamp and reasons
- Unwithdraw — Reverses the withdrawal, clearing the flag and timestamp
Withdrawal publishes automation events, enabling workflows like sending exit surveys or updating CRM records.
Account States
Beyond lifecycle roles, every profile has a user role that tracks account-level status:
| Substate | Description |
|---|---|
inactive |
Account created but not yet activated |
active |
Account is fully active |
suspended |
Temporarily blocked — session invalidated, cannot log in |
deleted |
Soft-deleted — marked as deleted, unsubscribed from communications |
forgotten |
GDPR forgotten — data encrypted, journey roles removed |
See Profile Operations for details on activate, suspend, delete, and forget operations. See Authentication for how account states affect login.
Initial State
The lifecycle defines an initial_state and initial_substate (typically prospect::cold). When a new profile enters a context, its role starts at the initial position unless explicitly specified.