Overview
A listing on CareerTruss has a beginning, a working life and an end. Nothing stays live by inertia. The lifecycle engine is what keeps the board from silting up with opportunities that closed months ago.
The full path
submitted -> under review -> published/live -> expired -> deleted
| |
changes requested EIES paused -> archived
| |
resubmitted reactivatedStage 1 — Submission
Anyone can submit through /post-internship; no account is required to start. The form writes an employer_submissionsrow with status = pending. Submissions are never visible to students.
Validation is strict at the door, because fixing a listing after publication costs far more than rejecting a bad one before it. Required fields include company, contact email, title, location, duration, deadline, at least one required skill, an "About the company" and an "About the role" section, plus a currency and a compensation declaration.
Compensation is a declared type, not free text
| Type | Required fields | Student-facing label |
|---|---|---|
| paid | stipend_min, stipend_max, currency | Company-paid |
| unpaid | none beyond the basics | Unpaid |
| fee_based | student_fee, fee schedule, what the fee covers, refund policy | Student-paid / Training |
Fee disclosure is non-negotiable
Stage 2 — Review
Triage
A moderator opens the submission in the admin review queue alongside the exact rendering a student would see.Quality scoring
The listing is scored and tagged, and a highlight reason may be attached. This score feeds the ranking engine's quality component.Decision
Approve, request changes, or reject with a standardised reason. Every outcome enqueues a CTNE notification to the contact email.Publication
Approval callsapprove_employer_submission(), which writes theinternshipsrow atomically — no half-created listings.
Stage 3 — Live
- Visible only while
is_active = trueandeies_stateisnormalorwarning. - Application routing follows
application_method: external, internal, or both. External-first is the default posture. - An
INTERNSHIP_EXPIRINGnotification warns the employer as the deadline approaches, so extensions happen before the listing disappears.
Stage 4 — Expiry and deletion
| Sweep | What it does | Cadence |
|---|---|---|
expire_stale_internships() | Marks listings past their deadline as expired and stamps expired_at | Daily |
delete_old_expired_internships() | Removes long-expired listings so the board stays clean | Daily |
Both sweeps skip listings held by EIES. Enforcement outranks housekeeping: a paused listing must resolve its state before the lifecycle engine is allowed to act on it.
Tip