Systems & engineeringbeta

Listing lifecycle

Submission, review, publication, expiry and deletion — and what runs at each edge.

Last updated 16 Aug 2026

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

listing lifecycle
submitted -> under review -> published/live -> expired -> deleted
                  |                     |
          changes requested        EIES paused -> archived
                  |                     |
              resubmitted           reactivated

Stage 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

TypeRequired fieldsStudent-facing label
paidstipend_min, stipend_max, currencyCompany-paid
unpaidnone beyond the basicsUnpaid
fee_basedstudent_fee, fee schedule, what the fee covers, refund policyStudent-paid / Training

Fee disclosure is non-negotiable

A student-paid programme cannot be published without stating the fee amount, when it is collected, what it covers and the refund policy. Those four answers are the entire difference between a training programme and a trap.

Stage 2 — Review

  1. Triage

    A moderator opens the submission in the admin review queue alongside the exact rendering a student would see.
  2. Quality scoring

    The listing is scored and tagged, and a highlight reason may be attached. This score feeds the ranking engine's quality component.
  3. Decision

    Approve, request changes, or reject with a standardised reason. Every outcome enqueues a CTNE notification to the contact email.
  4. Publication

    Approval calls approve_employer_submission(), which writes the internships row atomically — no half-created listings.

Stage 3 — Live

  • Visible only while is_active = true and eies_state is normal or warning.
  • Application routing follows application_method: external, internal, or both. External-first is the default posture.
  • An INTERNSHIP_EXPIRING notification warns the employer as the deadline approaches, so extensions happen before the listing disappears.

Stage 4 — Expiry and deletion

SweepWhat it doesCadence
expire_stale_internships()Marks listings past their deadline as expired and stamps expired_atDaily
delete_old_expired_internships()Removes long-expired listings so the board stays cleanDaily

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

Employers: extending a deadline before expiry preserves the listing's history and its accumulated quality score. Re-submitting from scratch starts over.