-
-
Notifications
You must be signed in to change notification settings - Fork 29
Training for Portal Users
Pushing LMS courses to the people who use your service desk, not just the people who run it.
Until this, the LMS could only ever assign a course to a group of analysts. A course can now go to a group of people, to one named person, or to everyone on the self-service portal β and portal users take it in the portal, with the same player, the same knowledge checks and the same marking.
LMS β Assignments β Assign, then Who for. One list holds all four, because you know you want "Finance" β not which table Finance is stored in.
| Target | Reaches | Use it for |
|---|---|---|
| Learning group | analysts only | Staff training, by team or role. The original, and still the default. |
| People group | analysts and portal users | Training for a set of people across the organisation. See People Groups. |
| Everyone on the portal | every active portal account, including people added later | Mandatory training for the whole company. |
| One person⦠| one named analyst or portal user | A single starter, a contractor, somebody who missed the group session. |
The number beside each group is how many people it will reach. For a people group it excludes lapsed memberships, because those are not people the course will reach.
"One person" opens a search rather than a dropdown. A list of every portal user is unusable the moment an installation has more than a screenful, and a real one has thousands.
Use the pencil on any row to change the course, who it is for, or the deadline. Previously this meant deleting the row and starting again, which threw away the deadline you had already typed and left a gap where the course reached nobody.
No one's progress is affected by an edit. Training records are held against the person and the course, never against the assignment β so moving a course from one group to another does not erase what anybody has already done. Somebody who is no longer reached keeps their record too; it just stops being expected of them.
A Training tab in the portal's navigation, listing each course with its state, how far through it they are and when it is due.
It appears only for somebody who actually has training. On an installation that has never pushed a course to the portal β which is most of them β a permanent tab leading to an empty page is a worse answer than no tab.
On their dashboard, above their ticket counts, anything still to do appears as cards: soonest first, anything overdue in front of that and marked. Only outstanding courses are listed; a panel that also showed finished ones would become permanent furniture that stops meaning anything. It is absent entirely for anybody with nothing to do.
Taking the course works exactly as it does for an analyst. Both kinds of course play β ones you have written and SCORM packages you have uploaded β progress is saved as you go, and the result appears beside everybody else's on the Progress tab.
A portal user can only ever open a course assigned to them. A course that is not theirs and a course that does not exist give the same answer, so the URL cannot be used to discover what exists.
A deadline is a day, not a moment. Somebody given until Friday has the whole of Friday, and becomes overdue once Friday has finished.
That sounds obvious and was not always true: the check used to ask whether the stored instant had passed, and since a picked date is stored as midnight, a course due on the 9th turned red at one second past midnight on the 9th. Anybody told they had until Friday opened it on Friday to find they were already late.
LMS β Settings β Reminders.
An analyst sees their courses whenever they use FreeITSM. Somebody who only uses the portal has no reason to sign in unless you tell them β so a course pushed to 400 staff with no email attached is a course 400 people never find out about. Reminders are what make the portal push a real feature rather than a page nobody visits.
- Send training reminders β off until you switch it on.
-
Remind this many days before the deadline β a list, e.g.
7, 1. Use0for the day it is due. - Keep reminding after the deadline, and how often.
- Send even without a scheduled task β see below.
Every other default here is chosen to be safe; this one is chosen to be inert. Upgrading FreeITSM must never, on its own, email several hundred people about training they were assigned months ago β which is exactly what a helpful "default on" would do on the first run after an upgrade.
The screen shows how many reminders would be sent right now, and how many people have no usable email address. Nobody should have to switch on a mail merge to find out how big it is.
That count is produced by the same code that does the sending, so the number you are shown is the number that will go.
Reminders are found by asking "whose deadline is N days away", which stays true all day. The send is recorded once, so re-running sends nothing.
Moving a deadline is genuinely new information, and does prompt a fresh reminder. Finishing a course stops all of them immediately β nobody is chased for training they have passed.
Not to get started. With Send even without a scheduled task left on, FreeITSM sends anything due whenever somebody opens the LMS, at most once an hour. Reminders work out of the box.
But that is a fallback, not a schedule. If nobody opens the LMS for a week, nothing is sent for a week.
For reliable daily sending, run cron/lms_reminders.php once a day:
# Linux
0 8 * * * /usr/bin/php /path/to/freeitsm/cron/lms_reminders.php
# Windows: Task Scheduler, daily, running php.exe with the full script path
Over HTTP it needs a shared secret in lms_reminder_cron_token; from the command line it needs nothing. If no token is configured the HTTP door is shut, not open.
Reminders also need a mailbox that can send. The settings screen says so plainly if there is not one, rather than letting you switch reminders on and wait for email that cannot leave the building.
Every reminder is recorded in the outbound email log under its own route, Training reminder, so "did the chase go out, and to whom" is answerable.
Some people deliberately have no mailbox β warehouse and shop-floor staff often do not. They still see their training when they sign in to the portal, but no reminder can reach them.
The Reminders screen counts them separately and says so. A failure count that is really "these people have no email" tells an administrator nothing.
- People Groups β making the groups you assign to
- LMS β the module as a whole
- Self-Service Portal
- Training for Portal Users Developer Guide
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- π§ͺ Developer tests
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- π Date & Time Formats
- Theming & Dark Mode
- ποΈ Recent β getting back to what you were doing
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
-
MobileβFriendly
- β³ π« Mobile: Tickets
- β³ π» Mobile: Assets
- β³ π Mobile: Calendar
- β³ π Mobile: Knowledge
- β³ π¦ Mobile: Service Status
- β³ πΌ Mobile: Watchtower
- β³ π§© Mobile: Problem Management
- β³ π Mobile: Change Management
- β³ πΏ Mobile: Software
- β³ β Mobile: Tasks
- β³ π Mobile: Forms
- β³ π Mobile: Contracts
- β³ π Mobile: Domains
- β³ π Mobile: People
- β³ π Mobile: LMS
- β³ πΊοΈ Mobile: CMDB
- β³ πΊοΈ Mobile: Network Mapper
- β³ π§ Mobile: Process Mapper
- β³ βοΈ Mobile: Workflow
- β³ π₯οΈ Mobile: System
- β³ π Mobile: Reporting
- β³ π Mobile: System Wiki
- β³ π Mobile: Self-Service Portal
- β³ π§° Mobile: Techniques & Tricks
-
Security
- Layer 1 β which modules you can enter
- β³ π§© Module Access Control
- β³ π οΈ Module Access β Developer Guide
- Layer 2 β what you can administer
- β³ π Roles & Permissions
- β³ π οΈ Roles β Developer Guide
- β³ π€ Why capabilities are constants
- Layer 3 β the System module
- β³ π Admin Access Control
- Hardening
- β³ π Security review response 2026-08
- β³ π‘οΈ Security hardening 2026-08
- β³ π οΈ Security hardening 2026-08 β Developer Guide
- β³ π‘οΈ Round three β plain English
- β³ π οΈ Round three β Developer Guide
- β³ π‘οΈ CSRF protection (S4) β Developer Guide
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- π CardDAV contact sync
- Browser Extension
- API Reference
-
π REST API β how it works
- β³ π« REST API: Tickets
- β³ π» REST API: Assets
- β³ π΄ REST API: Problems
- β³ π REST API: Changes
- β³ π REST API: Knowledge
- β³ β REST API: Tasks
- β³ ποΈ REST API: CMDB
- β³ π REST API: Contracts
- β³ ποΈ REST API: Calendar
- β³ πΏ REST API: Software
- β³ π REST API: Domains
- β³ π¦ REST API: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ π·οΈ REST API: Cost centres
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ π Rota copy and paste β Developer Deep Dive
- β³ β Checklists & SOPs
- β³ βοΈ Mandatory fields
- β³ π·οΈ Ticket categories
- β³ π₯ Assigning tickets to a team, and escalation
- β³ π’ One board across every company
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
-
β³
βοΈ Telegram channel - β³ β CSAT company scope and filters β Developer Guide
- β³ π₯ Microsoft Teams channel
- β³ π¨οΈ Mattermost channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ β Record previews
- β³ π Ticket notes: internal or shared
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ π¨ Telling the analyst a ticket is theirs
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ π Confidential tickets
- β³ π₯ Portal managers
- β³ π Who has seen a ticket
- β³ π Reading long tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ ποΈ The folder pane
- β³ π½ Just my tickets, or no closed ones
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- β³ π Scheduled work in your own calendar
- Problem Management
- Tasks
-
Assets
- β³ π’ Moving an asset between companies
- β³ π Shared asset locations
- β³ π§βπΌ Assigning assets to analysts
- β³ π Warranty and lease alerts
- β³ π Saved table views
- β³ π¨οΈ Recording anything, and importing it
- β³ π·οΈ QR asset labels
- β³ π Who holds what, and handover documents
- β³ π₯οΈ The inventory agent (PowerShell)
- β³ ποΈ Proxmox VE servers
- β³ βοΈ VMware Cloud Director servers
- β³ π Linking equipment to tickets
- β³ βοΈ Follow-up tasks on a ticket
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
-
Forms
- β³ π¨ The form designer β Developer Guide
- β³ π Layout & the grid β Developer Guide
- β³ ποΈ Collections β grouping submissions
- β³ π Submissions as PDFs
- β³ β‘ What happens next β a form's own actions
- β³ π οΈ Sections & conditional logic β Developer Guide
- β³ π οΈ Lookup fields β Developer Guide
- β³ π‘οΈ Catalogue request approvals
- People
- Domains
- Contracts
- Service Status
- π Notifications
- π¨ War Room
- Self-Service Portal
- LMS
- Process Mapper
- CMDB
- Network Mapper
- Workflows
- Issue trackers (Jira, Azure DevOps)
- System
-
Overview
- β³ π Progress tracker
- β³ Concepts & vocabulary
- β³ Email routing & mailboxes
- β³ Settings: global vs per-company
- β³ Users & self-service
- β³ Staff cross-company access
- β³ π’ One board across every company
- β³ Worked examples
- β³ Pitfalls & gotchas
- β³ Scope: what it's for
- β³ π οΈ Developer Guide (make a module multi-company)
- β³ ποΈ Case study: CMDB (a linked graph)
- β³ π§ͺ Test harness (prove it's isolated)
- What this is
-
π Bugs resolved
- β³ πΌοΈ Logo and courses broke on Apache with PHP-FPM
- β³ π’ Chat tickets ignored your ticket numbering
- β³ π Dates shown as a dash, or in server time
- β³ π Assets β Users showed people from other companies
- β³ π Restricted analysts could read other modules' data
- β³ πΌοΈ Replies with a picture in the thread failed to send
- β³ π Reply attachments never reached the customer
- β³ π οΈ Outbound email attachments β Developer Guide
- β³ π A global SSO provider was missing from the portal
- β³ π Behind a proxy, the SSO redirect said http
- β³ βοΈ The portal tagline moved when you saved it
- β³ π¨ The portal settings screen forgot what you saved
- β³ π‘οΈ The approvals inbox said "Error" and nothing else
- β³ π A table's answers were missing from the PDF
- β³ β A single-select column let you tick every option
- β³ π The portal ignored a form's field widths
- β³ π The tasks board stopped taking clicks
- β³ ποΈ #121 The index list is out of date after upgrading
- β³ π #133 The calendar subscription was empty
- β³ π #131 Tasks always reopened on the board
- β³ π₯ #129 Every page returned HTTP 500 after upgrading
- β³ π³ #127 A PHP warning above the System page
- β³ π #126 Notes stamped with the server's clock
- β³ π Storing every date in UTC
- β³ πͺ The portal was down for everyone signed in
- β³ βοΈ #120 Workflow notes could never be written
- β³ βοΈ #123 Three errors when running Database Verification
- β³ π #122 The description box was a stub in the corner
- β³ π£ Demo data deleted real accounts
- β³ π #117 Sign-in redirected to the wrong address
- β³ π¨ #108 The priority dot was invisible
- β³ β±οΈ #116 Time logged from the right-click menu
- β³ π #114 API keys refused by our own guard
- β³ ποΈ #110 Assigning a task told nobody
- β³ πͺ #107 Signed out while still working
- β³ π #103 "Share with Requester" reached nobody
- β³ π #102 Search found nothing for hyphens
- β³ πͺ #101 Source code editor opened behind
- β³ βοΈ #88 Subtasks could not be ticked off
- β³ π» #84 Asset deep link selected nothing
- β³ π« #79 A new ticket arrived with no status
- β³ π§ #79 A ticket from email did not say so
- β³ π #78 Bell opened to nothing
- β³ π¬ #77 Mail only collected from Inbox
- β³ π #74 The default password could not be changed
- β³ π¦ #70 Renaming an impact level
- β³ π€ #67 App-only mailboxes could not send
- β³ π #45 Verify only ever worked for Microsoft
- β³ π #45 IMAP reported as not authenticated
- β³ βοΈ An email template stopped escaping itself
- β³ π The portal dashboard showed the wrong time
- β³ π’ The folder said 99 and the list showed 96