Skip to content

Roles, people, and training

In an earlier version, SteadyOn had a single Training module that mixed up who-does-what, who-was-trained, and what-they-trained-in. It was deceptively simple in toy examples and impossible to use in real ones. This page explains what changed and why.

  • Roleswhat responsibilities exist. A role is a named seat: First Aider, Site Supervisor, Forklift Operator. Roles are org-level definitions; they don’t change when individuals come and go.
  • Peoplewho you have. A person is anyone in your H&S roster — staff, contractors, volunteers, visitors. Some people are also members (i.e. have logins); many aren’t.
  • Training Courseswhat training is available. A course is a definition: title, description, default validity period.

The three are independent. You can have roles defined before you have people. You can have courses defined before anyone enrols. You can have people on the roster who don’t fill any role yet.

The registers are joined by three many-to-many tables:

RelationshipJoinsCaptures
RequirementsRole ↔ CourseWhich courses are required (or recommended) for a role.
AssignmentsPerson ↔ RoleWhich roles a person currently fills. One can be primary.
EnrollmentsPerson ↔ CourseWhich courses a person has completed (or is enrolled in). With status, completed date, expiry, and an optional supersession link to the previous enrollment.

Putting it together:

  • Role: First Aider
    ↓ requires (via Requirements)
    Course: Workplace First Aid
  • Person: Bob Wilson
    ↓ assigned to (via Assignments)
    Role: First Aider
  • Person: Bob Wilson
    ↓ enrolled in (via Enrollments)
    Course: Workplace First Aid — passed 2025-08-12, expires 2027-08-12.

Bob is now a First Aider with current first-aid training. Take any of the three away — the assignment, the enrollment, the requirement — and SteadyOn can show you exactly which gap exists.

Why this is better than one big “Training” module

Section titled “Why this is better than one big “Training” module”

A single module forces you to combine concepts that don’t actually belong together:

  • The role of First Aider exists whether or not Bob currently fills it.
  • Bob’s training in CPR exists whether or not he’s currently a First Aider.
  • CPR as a course exists whether or not the org currently requires it for any role.

Combining them means you can’t easily ask:

  • “How many First Aiders are required, and how many do we have right now?” (role coverage independent of training).
  • “Whose first-aid training expires in the next 60 days?” (enrollment expiry independent of role).
  • “If Bob leaves, do we still have enough First Aiders?” (a what-if independent of any individual).

With three registers and three joins, all three questions become direct queries.

  • User — a sign-in identity (an email + auth credentials in WorkOS).
  • Member — a user who’s joined an organisation in a role (owner / admin / member / guest). Members can sign in to that org.
  • Person — a row in the People register. May or may not be linked to a member.

A consultant you’ve hired may be a person on your roster (so the roles and training apply) without being a member of your workspace (no SteadyOn login).

A casual employee may be a member of your workspace (they can sign in to report incidents) without being a person on your roster (no formal role assignment, no required training).

When email matches, members and people auto-link. The link is what lets you assign a member to a role via their person record.

Some roles really do apply to everyone — Worker, Inducted Personnel. Tick the Universal flag on those roles and SteadyOn auto-assigns every non-exempt person to them. See Universal roles.

When training expires and the person re-trains:

  • Don’t edit the existing enrollment to change the date. That loses history — an inspector wouldn’t be able to see the original certification date.
  • Use Renew instead. SteadyOn creates a new enrollment linked to the old one via supersession. You can show the trail back.

Over years, supersession trails become valuable. “Bob has held unbroken first-aid training for the last seven years” is a stronger demonstration than “Bob’s current first-aid training is dated last year”.