-
Notifications
You must be signed in to change notification settings - Fork 15
Custom Asset Fields
Printers, monitors, headsets, televisions, projectors. The built-in asset details describe a computer, because that's what the inventory script reports β so anything that isn't a computer has nowhere to put the things that actually matter about it.
Custom fields are how you record those things. You decide what gets recorded, and against which kinds of asset. Adding a field takes effect immediately: no database change, no downtime, and nothing already recorded is touched.
Worth getting these straight before you start. Everything else follows easily once they click.
| Field | One thing you want to record. Resolution, Screen size, Wireless. Defined once for the whole system. |
| Field set | A bundle of fields you attach in one go. Screen might hold Screen size and Resolution. |
| Asset type | Television, Monitor, Printer. You attach sets to types. |
So: a field goes in a set, and a set goes on a type.
The part that makes this worth doing is that a field is defined once and can appear in as many sets, on as many types, as you like. "Resolution" on a webcam is the same field as on a television β which is what lets you search for a resolution and find both, or export one column covering every screen you own. Fourteen separate "Resolution" fields could never be looked at together.
Settings β Custom fields opens with How it all fits together β a read-only picture of every asset type, the sets attached to it and the fields inside them, plus a list of each field and everywhere it's used. When something isn't appearing where you expect, look there first.
The quickest route is the top section, Fields by asset type: pick a type, click Add, and the field is on that type straight away. A set is created behind the scenes, so you never have to think about sets at all until you want to reuse a bundle.
- Text β anything, optionally over several lines
-
Number β with an optional unit shown beside the box (
", GB, kg) and a choice of decimal places - Date β a date, a time, or both
- Yes / no β and not filled in stays a third, separate answer
- Pick from a list β you supply the choices
- Web address, Email address
- Link to something else β a person, another asset, or a configuration item
Offer as a column in the asset list β makes it available in the Table view's column picker. It isn't forced on everybody; each person turns it on for themselves.
Find assets by this field β search, including βK, will match on its values. Good for serial and part numbers. Bad for free-text notes, which would make half the estate match half the queries.
No two assets may share a value β for a serial or MAC address. Checked within your own company, so two customers can each hold a PR0001.
If you type a name that already exists as a built-in field β Make, Serial number, Cost β you'll be warned. Every asset already has those as proper columns, and having both means the Add dialog asks twice and no report can put the two together.
Sets earn their keep when several types want the same handful of fields. Make Peripheral basics holding Serial number and Warranty end, attach it to Headset, Webcam and Keyboard, and all three record both. Add a fourth field to the set later and all three gain it at once, rather than you editing three types.
Types often want overlapping but not identical fields, and that's what more than one set is for:
| Set | Fields | Attached to |
|---|---|---|
| Screen | Screen size, Resolution | Television, Monitor |
| Image | Resolution | Webcam, Projector |
A webcam has a resolution but no screen, so it gets the second set. Resolution is still one field, appearing in both β so a search finds screens and webcams together.
Whether a field is required is set on its place in a set, not on the field itself, because a serial number may be compulsory for laptops and optional for keyboards.
Ten televisions in meeting rooms. Three are being trialled as smart TVs and need an IP address, a MAC address and a Netflix switch. The other seven shouldn't grow three empty boxes.
Rather than splitting the type in two, make a set for the extra fields and add it to those three assets individually: open the asset, and under Other details use Add a set of fields.
The other seven don't get blank fields β they don't have the fields at all.
A set added to one asset shows as a small removable chip on that asset, so it's always obvious why it has fields its type doesn't.
Removing the set again hides the fields but keeps everything recorded in them. Add it back and the values are all still there, so an accidental click costs nothing.
Computers arrive on their own β the inventory script, Intune and vCenter all report in. Anything that can't report for itself is added by hand: on the asset list, click Add, beside Scan and Assign tags.
Name, type, status, location, then the built-in details. Pick a type that records custom fields and those fields appear in the dialog too, so a television goes in complete in one go.
Names must be unique. A second asset with a name you already use is refused, pointing you at the existing one β a duplicate would split that asset's history in two.
The hardware details the inventory script collects for itself β CPU, memory, BIOS, operating system β deliberately aren't offered here. On anything that does report, typing them in would only be overwritten by the next sync.
Ten items is ten trips through a dialog. Settings β Import takes a CSV instead β a supplier's stock list, an export from another system, or whatever somebody's been keeping in Excel.
A CSV with a heading row. It reports how many rows and columns it found. Up to 5000 rows, and it says so rather than quietly importing the first 5000.
It guesses, including matching a column to one of your own custom fields, and shows the first few values from your file beside each one so a wrong guess is obvious before it does any damage.
Columns you don't want are set to Do not import, and it says how many and which are being ignored β a column that silently goes nowhere is how half an import disappears.
Type, status, location and supplier are matched by name, so a column full of the words Printer and Monitor works as you'd expect. A name that doesn't exist is refused rather than invented β otherwise the first typo quietly creates an asset type called "Televsion".
This is the setting that matters, and the one people skip.
You tick the columns genuinely unique to one piece of equipment β a name, an asset tag, a serial number. Each row is then looked up on those columns, in the order you ticked them:
| Matches | What happens |
|---|---|
| Nothing | A new asset is created |
| Exactly one | That asset is updated |
| More than one | Nothing is changed. The row is set aside for you |
Get it right and importing the same file next month updates what's there. Get it wrong β or leave it on something that isn't unique, like a model number β and you either duplicate the estate or merge things that were never the same item.
Picking one at random when several match is how records get quietly overwritten, so it doesn't.
Matching is always within your own company, so two customers can each have a "LAPTOP-01" without ever being confused.
A preview does every single check and writes nothing at all. It tells you, row by row, exactly what the real run would do.
The Import button stays switched off until you've run a preview, and switches off again if you change the mapping β because the preview is the only thing standing between a mis-mapped column and hundreds of wrong records.
Two other choices: whether the file's values replace what's already recorded or only fill in blanks, and what to do with a value that isn't on a list field's choices (set the row aside, or add it to the list).
A row that can't be imported is kept. Not thrown away, and not guessed at.
The Rows needing attention list shows each one with which file and row number it came from, exactly what was wrong β "No asset type called 'Printer'", "Screen size expects a number" β and what your file actually said, verbatim.
So you fix the spreadsheet and import it again, or create whatever was missing and re-run, rather than working out from scratch what went astray. Mark a row Done to take it off the list.
A failed row leaves nothing behind. If it got as far as creating an asset and then hit a problem, the whole row is undone β so "needs attention" never means "half of it worked".
Recording things is only half of it.
- The asset itself β under Other details, grouped by set, with a "3 of 3 filled in" count. Blanks are tucked away until you ask for them.
- The Table view β any field marked Offer as a column joins the column picker, sortable and filterable like any other.
- CSV and PDF export β whatever columns you're looking at, custom ones included.
- Search and βK β for fields marked Find assets by this field. The result tells you which field matched.
- Handover documents β switch any custom field on as a column, so a monitor is signed for with its size on the paperwork.
-
The REST API β every asset carries a
fieldsobject keyed by field name. - Asset history β changes to a custom field are audited exactly like built-in ones.
Nothing is ever deleted. Retiring a field, deleting a set, or removing a set from an asset all keep every value recorded. Put it back and the values return.
"Not filled in" is a real answer. A yes/no field has three states, and filtering to No won't sweep up every asset that simply hasn't got the field. This matters more than it sounds β it's the difference between "we checked and it's off" and "nobody has ever looked".
A field's kind can't change once values exist. You can rename it freely, and you can always change how it's presented β a date field can switch between date and date-and-time β but text can't become a number once answers have been given. The editor tells you before you try, rather than after.
The reference name is fixed. Each field has a short reference name used by imports and reports. Renaming the field's label never changes it, so a saved import mapping can't break because somebody reworded a heading.
Companies can have their own fields. On a multi-company install, a field created while working in a client company belongs to that company; one created in the default company is shared by all of them.
Link fields are read-only on the asset for now. They display, and an import can set them, but choosing a person or another asset by hand needs a picker that hasn't been built yet.
The asset tag can't be set by an import. It can be used to identify a row, but not written β it's unique per company and that check lives with the asset tag itself.
Two separate rights, under System β Roles:
- Design custom asset fields and field sets β creating fields, sets, and attaching them to types
- Import assets in bulk from a file β marked sensitive, because one import can create or overwrite thousands of records
Filling a field in on an asset is ordinary asset access, exactly like editing any other detail. So you can let somebody run an import without letting them redesign what an asset records, or the other way round.
- Assets β the module as a whole
- Who holds what, and handover documents
- QR asset labels
- Custom Asset Fields β Developer Guide β the field engine and how it's shared with the CMDB
- Asset Import β Developer Guide β reconciliation, the run log and the holding area
FreeITSM β an open-source IT Service Management platform Β· github.com/edmozley/freeitsm Β· MIT licence
- Installation
- β° Scheduled tasks (cron jobs)
- Architecture
- AI Providers
- Internationalisation (i18n)
- Timezones & Time Handling
- Theming & Dark Mode
- β¨οΈ Command palette (βK)
- π Searching inside tickets
- π Attached documents
- MobileβFriendly
-
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
- Single Sign-On (SSO)
- ποΈ LDAP & Active Directory
- 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: Service Status
- β³ βοΈ REST API: Morning Checks
- β³ π REST API: Forms
- β³ βοΈ REST API: Workflow
- β³ πΊοΈ REST API: Network Mapper
- β³ π§ Using the API docs page
- β³ π OpenAPI specification
- β³ β OpenAPI: kept correct
- β³ π οΈ Maintaining the catalogue
- Watchtower
-
Tickets
- β³ Mailbox Authentication
- β³ π€ Email send log
- β³ Basic IMAP mailboxes
- β³ Email rendering & images
- β³ SLA Management
- β³ WhatsApp channel
- β³ π¬ Web chat channel
- β³ π£ Slack channel
- β³ π Linking tickets
- β³ ποΈ Canned responses
- β³ βοΈ Limiting replies to particular senders
- β³ βοΈ Email signatures
- β³ π The public web address
- β³ π’ Ticket numbering
- β³ π Raising a ticket for someone else
- β³ π Merging tickets
- β³ β Splitting tickets
- β³ β Selecting several tickets
- β³ π οΈ Snoozing tickets β Developer Guide
- β³ π₯ Collision detection
- β³ β±οΈ Time tracking
- Problem Management
- Tasks
- Assets
- Knowledge
- Change Management
- Calendar
- Morning Checks
- Reporting
- Software
- Forms
- 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
- β³ 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)