Stale Enrolments Cleanup
Bulk-clean ACTIVE enrolments whose class ended more than 6 months ago. Available on the Enrolled lifecycle stage with Enrolments: Manage.
Last updated 16 Oct 2026
Stale Enrolments Cleanup
Most RTOs that have been running for years accumulate "zombie" enrolments, students who never formally completed, never withdrew, and never had their enrolment archived. These rows sit at completion_status='ACTIVE' forever, polluting the active CRM lifecycle.
The Stale Enrolments panel surfaces them and lets you bulk-action them in a few clicks.
Access required
Choose the task you are doing. Each row is a separate action.
| Task | Required access |
|---|---|
| See the lifecycle queue | Enrolments: View |
| Use the bulk stale-enrolment cleanup actions | Enrolments: Manage |
Where it appears
Open Lifecycle → Enrolled. With Enrolments: Manage, the Stale Enrolments panel appears below the per-page enrolment list with a red badge showing the count.
The panel is collapsed by default. Click the chevron to expand.
What counts as stale
An enrolment is flagged stale if all of these are true:
completion_status = 'ACTIVE'- The class's
end_datewas more than 6 months ago - The student's
last_activity_atis null OR also more than 6 months ago
This is a deliberately conservative definition, only enrolments with no signal of life in the last six months get included.
Bulk-cleaning
Expand the panel and review
The data table shows student name, course, class, end date, days stale, and payment status. Sort by Ended or Days Stale to find the oldest cohorts first.
Select rows
Use the checkboxes to select individual rows, or the header checkbox to select the entire visible page. The selected count appears in a toolbar above the table.
Choose a bulk action
Click Bulk action and pick one:
- Mark as Completed: for students who genuinely finished training but were never marked complete. Sets
completion_dateto each enrolment's classend_date(the AVETMISS-correct date, not today). Skips any enrolment where a unit lacks a definite outcome (you'll get a "skipped" toast listing those, fix those individually first). - Mark as Withdrawn: for students who clearly disengaged.
- Archive: for clearly-dead records that you want gone from the active queue but preserved for audit.
Provide a reason
A modal asks for a reason (minimum 10 characters). This is stamped against every enrolment as an entity note and recorded in the audit log, so the bulk action is fully traceable.
Confirm
The action runs in a single batched UPDATE per group. A toast confirms the count actioned and lists any skipped rows with their skip reason.
What "Mark as Completed" actually does
For each selected enrolment with all-passing unit outcomes:
- Sets
completion_status = 'COMPLETED' - Sets
completion_date = class.end_date(the historical date, AVETMISS NAT00130-correct) - Sets
pipeline_stage = 'COMPLETED'andpipeline_stage_entered_at = completion_date: so the row leaves the active lifecycle view immediately - Stamps an entity note with the reason
- Logs the change to the audit log
Enrolments where any unit lacks one of the AVETMISS final outcome codes (20, 30, 51, 52, 60) are skipped: their incomplete units would block AVETMISS reporting, so they need individual attention first.
Warning
Bulk operations are scoped to your selected rows only, the audit trail captures who did the bulk action, when, why, and against which enrolments. There's no built-in undo, but the audit_logs delta records the previous state of every changed field if you need to manually revert.
Day-to-day workflow
Run a Stale Enrolments cleanup pass:
- Once at deploy time: clear out the historical noise
- Quarterly: keep ahead of new accumulation. Set a calendar reminder.
After a successful cleanup, your active Lifecycle stages will contain enrolments with real recent activity, which keeps the work queue meaningful.
Tip
The lifecycle period selector defaults to the last 12 months and also offers the last 24 months, all time or a custom range. Stale Enrolments uses its own conservative 6-month definition because it is a cleanup queue, not a reporting-period filter.