Repository navigation
Contact Details
A person in FreeITSM is more than a login. Beyond an email address and a password, their record holds a job title, department, office, phone, mobile, employee ID and who they report to β the things an asset register, an approval chain and a service desk actually need in order to reach somebody.
There are four ways those details get filled in, and the whole design is about keeping them straight:
| Who fills them in | Where | What they may change |
|---|---|---|
| An analyst | Tickets β Users or Assets β Users | all seven |
| The person themselves | Self-service portal, My Account | job title, office, phone, mobile - whichever of those an administrator allows on System β Portal profile |
| A directory | automatically, on every import | all seven, and nothing else may touch them |
| A CardDAV address book | automatically, on every import | five of the seven - not employee ID, and not manager |
Tickets β Users and Assets β Users name it. Select somebody and their details say, for example, Details from: Baikal - address book (Tickets) or Kept up to date from the address book Baikal (Assets); somebody who only signs in through single sign-on says Signs in with instead. In the Assets list, the flag reads Address book or Directory accordingly.
Both lists also have a Source filter - everyone, only the people added in FreeITSM, or just the people from one directory or address book, with a count beside each. It only appears once at least one person is linked to one, and the counts only include people in the companies you can see.
A record kept up to date from somewhere else shows those details greyed out, because the next import would overwrite anything typed here β an edit that silently reverts an hour later is worse than one that says no.
Which details depends on where the person came from, and this is not cosmetic:
| Source | Read-only | Still yours to fill in |
|---|---|---|
| LDAP / Active Directory | all seven | β |
| CardDAV address book | the five it holds | employee ID and manager |
| CardDAV with write-back on | none | all seven |
π΄ The middle row was wrong until recently, and the bug is worth knowing about. Every managed record locked all seven fields regardless of source β but a contact card has nowhere to keep a payroll number or a reporting line, so a CardDAV import never sets those two. They were greyed out and refused on save on behalf of an import that would never populate them: permanently unfillable, while the help text cheerfully said the import left them alone.
The bottom row follows from the reason itself. Fields are locked because the next import would overwrite them β and an address book with write changes back switched on does not have that problem, because what you type is sent to the card. The justification disappears, so the lock does too. See CardDAV contact sync.
Either people screen will do β Tickets β Users if you came in from a ticket, Assets β Users if you came in from a piece of equipment. Both open the same editor (includes/person_editor.php), so it never matters which door you used. Manager access beside Edit opens the full-screen page for what that person can see as a portal manager.
Select a person, choose Edit, and fill in what you know. Everything is optional. Three of them earn their place beyond tidiness:
-
Office tells you which site somebody is at before you set off looking for them, and is one of the fields a directory fills in for you (
physicalDeliveryOfficeName).β οΈ It does not feed the ticket asset picker β that searches an asset's own location, fromasset_locations, and never readsusers.office. - Employee ID is the join key the day somebody reconciles FreeITSM against a payroll system that has never heard of an email address.
- Manager records the reporting line - type part of a name to find them. It doesn't route approvals today - catalogue request approvals go to a designated analyst - but when portal managers are switched on, a person's manager can see their tickets in the self-service portal.
Blank fields are left out of the person's detail panel rather than shown as a column of dashes, so what you see is what somebody actually answered.
A signed-in portal user opens My Account from their initials in the top-right, and can now maintain job title, office, phone and mobile themselves, alongside their preferred name and their password.
This exists because the alternative is worse. A phone number that changed is a phone number the service desk cannot reach, and routing every correction through a ticket means most of them never get made. Letting the person fix it themselves is both faster and more likely to be right β they know their own mobile number better than anyone.
They see a note saying only the IT team can see these details. That is worth leaving in place. People are reasonably cautious about typing a mobile number into a web form, and the honest answer β it goes to the service desk, nowhere else β is what makes them willing to do it.
System β Portal profile has a tick box for each of the four. On a new or upgraded system all four are ticked, which is what the portal has always offered. Untick one and it disappears from the portal form; nothing already stored is removed, and analysts can still change it. The setting can only narrow the four - the three below cannot be switched on from it.
Department, employee ID and manager are not editable by the person themselves, and the reasons are different in each case:
- Manager β nobody should choose their own approver. Nothing routes along the reporting line yet, so this is not a hole today; it would quietly become one the day approvals start following the chain, by which point a portal full of self-chosen managers would already be in place.
- Employee ID β a payroll number is a claim about who you are in another system, not a contact detail.
- Department β an organisational fact the service desk maintains. Somebody moving themselves between departments is other people's data changing under them.
The line is "what does this person know better than the service desk?", not "what is harmless?".
Where somebody was imported from LDAP or Active Directory β see Directory sync β the same details are read-only everywhere: on both analyst screens and in the portal. Each screen says so, in place, rather than letting an edit through.
That is a deliberate refusal rather than an oversight. The next sync would overwrite anything typed locally, so an edit accepted now and reverted overnight is precisely how somebody concludes FreeITSM lost their change. Refusing it immediately is the kinder answer, and it points at the fix: change the value in the directory, and it reaches FreeITSM on the next run.
Everything that is not the directory's stays editable on those records β the person's preferred name, their portal password, their company, their theme. Only the seven person fields are locked.
The short version: the people in FreeITSM should not be an island.
The longer version came from issue #133, where an operator running his own CardDAV address book pointed out that setting FreeITSM up had meant typing his customers in a second time, and that the two lists would drift from that moment on. He also made a data-protection argument: if customers can correct their own details, the correction becomes theirs to make rather than the service desk's obligation to chase.
He was right, and the useful discovery was that the portal did not let anybody edit their own contact details at all β so the self-correction his argument rested on did not exist yet, before any question of syncing it anywhere. That gap is what this page describes, and it was worth having on its own merits. β FreeITSM now speaks CardDAV in both directions β see CardDAV contact sync.
β His data-protection argument is now answered, as a choice for each organisation. Write-back sends an analyst's correction to the address book. His scenario was a customer correcting their own details in the portal. That is now possible too, but off by default, because it lets customers write into the operator's address book: tick Let them change these too, and send their change to the address book on System β Portal profile. It only reaches address books with write-back switched on.
With it on, a customer's change is sent to the address book first and saved in FreeITSM only if the address book accepts it - the opposite order from an analyst's edit. An analyst told "the address book refused this" can do something about it; a customer cannot, and a local save the address book refused would be put back by the next import, which is exactly the vanishing edit this page is about avoiding. A refusal (the server is unreachable, or the same detail was changed on the card since the last import) changes nothing anywhere and tells the person so. Each write is in the address book's write log, marked as the person's own change from the portal.
- Tickets β the analyst people screen, in context
- Directory sync β importing people, and the rules that keep it safe
- Self-Service Portal β everything else a portal user can do
- CardDAV contact sync β importing these details from an address book
- CardDAV write-back internals β how a change here reaches the address book, and what it will not do
- CalDAV and CardDAV β the analysis this came out of, and CalDAV, which is still open
- Contact details β 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: Projects
- β³ π 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
- π Projects
-
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