User guide
Custom Forms
Looking for what it does rather than how to use it? Read the Custom forms overview .
This guide covers building, publishing and versioning a custom form, attaching it to tickets, change requests, assets, sites, projects and project tasks by rule, publishing it to the client organizations an MSP manages, filling it in from the customer portal and the staff portals, and reviewing and exporting the responses.
Audience: organization administrators, MSP administrators and technicians, and anyone supporting them.
What it is
A custom form is a set of typed questions your organization writes itself, attached to records by rule and filled in alongside them. A form has a draft you edit, a published version people fill in, one or more placement rules that decide where it appears and to whom, and the responses collected against it. Published versions are frozen: editing a live form opens a new draft, and every response stays pinned to the version that asked its questions.
Forms live under Settings → Forms in both the organization portal (/org/settings/forms) and the MSP portal (/msp/settings/forms). The two screens are identical; what differs is whose records the rules reach.
Concepts
| Concept | What it is |
|---|---|
| Form | The named thing you build: name, status (Draft, Live, Archived), the version currently live, and its rules, shares and responses. |
| Draft | The single working copy the Build tab edits. Saving a draft changes nothing anyone is filling in. Publishing freezes it into a version and opens a fresh draft on the next edit. |
| Version | An immutable snapshot of the questions. Version numbers only go up. A response records the version it was collected under and always renders against it. |
| Section | A group of questions with an optional title, description and display rule. A form needs at least one. |
| Question | One field: a type, a label, help text, a placeholder, required or not, a width, validation, and an optional display rule. |
| Display rule | “Show this section or question only when …” — up to ten conditions on earlier answers, matched all-of or any-of. |
| Placement | A rule that attaches the form to a record type, narrowed by conditions, with an audience, a trigger and a required flag. |
| Audience | Who sees the placement: the person raising the record, staff working it, or everyone. |
| Trigger | When the placement is presented: when the record is created, or any time on the record. (See Limits for the resolve and close options.) |
| Must be filled in | A create page will not save the record until this form’s required questions are answered. |
| Share | An MSP publishing one of its forms into a client organization it manages. The client receives the form; the questions stay with the MSP. |
| Response | One filled-in form on one record: the answers, the version, who submitted it and when, and who last changed it. |
Roles and permissions
The role hierarchy is platform administrator > MSP administrator > MSP technician > organization administrator > power user > CUSTOMER`.
“Customer portal” below means a request made from the /user portal, or by anyone holding the CUSTOMER role in any portal. Every other request is a staff request.
| Action | platform administrator | MSP administrator | MSP technician | organization administrator | power user | CUSTOMER |
|---|---|---|---|---|---|---|
| Fill in a form placed for requesters or everyone | ● | ● | ● | ● | ● | ● |
| See and fill in a staff-only form | ● | ● | ● | ● | ● (staff portal) | — |
| Correct your own answers, while the form allows it | ● | ● | ● | ● | ● | ● |
| Correct anyone’s answers on a record in your scope | ● | ● | ● | ● | ● (staff portal) | — |
| Remove a set of answers from a record | ● | ● | ● | ● | ● (staff portal) | — |
| Browse the form library (read) | ● | ● | ● | ● | ● | ● |
| Create, edit, publish, revert, archive, delete, duplicate | ● | ● | ● | ● | — | — |
| Add, change and remove placement rules | ● | ● | ● | ● | — | — |
| Publish a form to managed client organizations | ● | ● | ● | ●¹ | — | — |
| View the Responses tab and export CSV | ● | ● | ● | ● | ● (staff portal) | — |
¹ The share list is the set of client organizations your account manages. An organization that manages no other organization sees “You do not manage any other organizations, so there is nobody to publish this form to.”
Three things to know about the floor:
- Every authoring write is floored at organization administrator, not MSP technician. MSP technician ranks above organization administrator in the hierarchy, so an MSP technician floor would lock out the organization administrators the feature is largely for. Both MSP roles clear the floor.
- Reads on the library are open to any signed-in user with an organization, so a technician can see which forms exist. The Settings → Forms navigation entry itself is shown only to users who can manage settings (organization administrator in the organization portal, MSP administrator in the MSP portal).
- The customer portal is limited by audience rather than by role: it never receives a staff-only placement, its answers, the Responses tab or the CSV export; it cannot remove answers and may correct only its own.
Walkthroughs
Building and publishing a form
- Go to Settings → Forms and choose New form. Enter a name (for example “New starter details”) and Create. The editor opens on the Build tab. The header reads “Draft — nobody can see this form until it is published.”
- Add questions from the palette on the left. It is grouped by how you think about the question — Text, Choice, Number, Date & time, Records, Layout — and each entry has a one-line hint. A new question lands in the selected section, or in the last section, or in a section created for it.
- Select a question to edit it on the right: label, help text, placeholder, Required, width (full, half or third), and the validation that applies to its type. See Configuration for the full list.
- Use Add section to group questions, and Move up / Move down on sections and questions to reorder. Everything is reachable from the keyboard.
- To branch, open a question’s Show this question when… rule, pick an earlier question, a comparison (“is”, “is not”, “contains”, “does not contain”, “is answered”, “is not answered”, “is more than”, “is less than”) and a value. A section can carry a rule too, and a question inside a hidden section is hidden regardless of its own rule.
- Choose Preview to see the form exactly as responders will, including the branching. Back to editing returns.
- Save draft at any time. A draft saves even while it has problems; the Build tab lists them.
- Publish. If any problem remains, publishing is refused and the list is shown under “This form cannot be published yet”. Otherwise the header changes to “Version 1 is live and up to date.” Publishing also saves the draft first, so the version that goes live is what you see on screen.
Attaching a form to ticket categories
- Open the form and choose the Placement tab.
- Under Attach to, choose Tickets and Add rule. A rule with no conditions matches every ticket.
- In the rule, set Shown to (The person raising it, Staff working it, or Everyone) and When (When the record is created, or Any time, on the record).
- Tick Must be filled in if the ticket should not be created until this form is answered. It is not available for an any-time rule, which has no moment to block.
- Under Only when…, choose the ticket categories, types, priorities and queues the rule applies to. Values within one list are OR; different lists are AND. Categories match by prefix: a rule on Access also matches Access / New Starter, and does not match Accessories.
- Rules save as you change them. If the form is still a draft, the tab says “Rules are saved now and take effect once the form is published.”
- Confirm from the other side: Settings → Ticket categories shows the form’s name against each category the rule covers, linking back to this tab. Queues, change templates and project templates carry the same label.
The same tab attaches a form to change requests (by type, category, risk level and template), assets (by type, category and status), sites and locations (by type), projects (by template and status) and project tasks (by the project’s template).
Filling in a form on a record
On a create page — the organization’s and the MSP’s new-ticket pages, the customer portal’s New request, the new-change wizard, asset intake and new project — any form placed for creation and matched by what has been chosen so far appears in place, marked Required where the rule says so. The page validates the form before creating the record and lists any problem against the question. Once the record exists, the answers are saved against it. A required form is always saved; an optional form is saved only if something was entered in it.
On an existing record — the ticket, change, asset, site, project and task screens — every placement for that record type and record appears under Additional information. An unanswered form offers Fill in; an answered one shows the answers read-only with Edit and Remove. The save button reads Save answers, and a saved form confirms with “Answers saved.” Answers are shown against the version they were collected under, so a question removed since still shows its answer.
An MSP technician opening a client’s ticket, change, site or project sees the client’s forms there and can answer them; the answers belong to the client.
Publishing a form to managed clients
MSP portal, on a form you author.
- Open the form and choose the Sharing tab. It lists the client organizations your account manages.
- Tick each organization that should receive the form and choose Save.
- The client now sees the form in its own Settings → Forms list with the badge “From
”. Opening it shows “Published to you by . You can attach it to your records and read the answers; only they can change what it asks.” The client can Duplicate it into a copy it owns and edit that. - Untick an organization and save to withdraw the form. Withdrawal deactivates the share rather than deleting it, so re-ticking restores exactly what was there.
The per-client option Let them decide where it appears in their own portal records a placement right on the share. See Limits and known behaviour before relying on it in this release.
Reviewing and exporting responses
- Open the form and choose the Responses tab. The tab shows the response count.
- A row collected under an older version shows blanks where that version had no such question.
- Export CSV downloads every response as a UTF-8 CSV that opens cleanly in Excel, with the same columns plus Submission ID, Organization, Attached to, Record ID, Submitted by and Submitted at. Choice answers export as their labels; person, asset and site answers export as the stored reference.
An MSP reviewing a form it published sees its own responses and every managed client’s; a client sees only its own.
Changing a live form
- Open the form and edit on the Build tab. The header changes to “Version N is live. Your changes are not live until you publish.”
- Save draft as often as you like. People filling in the form continue to see version N.
- Publish changes to release version N + 1, or Discard changes to throw the draft away and return to version N. Discarding asks for confirmation: “This form goes back to version N — the one people are filling in right now. Anything edited since is lost.”
- Changing a question’s Field key on a form that already has responses shows a warning, because answers are stored under the key and old answers would no longer line up with the question.
To retire a form, choose Archive (or Delete, if nothing was ever submitted against it) from the list. An archived form stops appearing everywhere, keeps its rules, and can be Restored to a draft. A form with responses is never deleted.
Configuration
Question types
| Group | Type | Stored as | Notes |
|---|---|---|---|
| Text | Short answer | text | Single line |
| Text | Paragraph | text | Several lines |
| Text | text | Must be an address | |
| Text | Phone | text | Digits, spaces and the usual punctuation |
| Text | Link | text | Must start with http:// or https://; rendered as a link |
| Number | Number | number | Whole or decimal, optional minimum and maximum |
| Number | Amount | number | A money amount |
| Number | Rating | number | Stars, 1 to 5 by default, maximum 3 to 10 |
| Number | Scale | number | Numbered scale with labelled ends, 1 to 10 by default |
| Date & time | Date | ISO date | |
| Date & time | Date and time | ISO date-time | |
| Date & time | Time | HH:MM | |
| Choice | Dropdown | option value | One answer from a list |
| Choice | Choose one | option value | One answer, all options visible |
| Choice | Choose many | list of option values | Any number of answers |
| Choice | Yes / No | true / false | |
| Records | File upload | list of stored files | 25 MB per file; see limits below |
| Records | Person | person reference | Picked from the organization’s people |
| Records | Asset | asset reference | Picked from the organization’s assets |
| Records | Site | location reference | Picked from the organization’s sites |
| Layout | Heading | — | Collects nothing |
| Layout | Instructions | — | A block of guidance; collects nothing |
| Layout | Divider | — | A horizontal rule; collects nothing |
Question settings
| Setting | Applies to | Effect if set | If unset |
|---|---|---|---|
| Label | every question | The question text. Required to publish. | Publishing is refused |
| Help text | every question | Shown under the label | Nothing shown |
| Placeholder | text, number, pickers | Hint inside the empty control | “Select…” on pickers |
| Required | every question | Blocks submission while unanswered and visible | Optional |
| Width | every question | Full, half or third of the row | Full |
| Field key | every question | The stored answer key; editing warns when responses exist | Derived from the label |
| Options | choice types | Value and label per option; at least one is required to publish | Publishing is refused |
| Min / max length | text types | “Use at least N characters” / “Use at most N characters” | No limit |
| Min / max | Number, Amount, Scale | “Enter N or more” / “Enter N or less”; on Scale these are the scale bounds | No bound |
| End labels | Scale | Text shown at the low and high ends | Numbers only |
| Maximum stars | Rating | 3 to 10 | 5 |
| Min / max selections | Choose many | “Choose at least N” / “Choose at most N” | No limit |
| Maximum files | File upload | 1 to 20 | 5 |
| Maximum file size (MB) | File upload | 1 to 25 | 25 |
| Accepted types | File upload | Comma-separated types or extensions, e.g. image/*, .pdf | Any type |
| Earliest / latest date | Date, Date and time | “Choose a later date” / “Choose an earlier date”; earliest can be “today” | No bound |
| Show this … when | question and section | Hidden unless the conditions hold; hidden answers are dropped on save | Always shown |
Accepted by the API but not offered in the builder in this release: a validation pattern with patternMessage, a numeric step, and a defaultValue.
Form settings
The Settings tab carries everything about a form that is not a question and not a rule. The form’s name stays in the header, edited in place.
| Setting | Effect | Default |
|---|---|---|
| Description | One line about what the form is for, shown wherever it is rendered | — |
| Icon and colour | How the form is marked on a record | — |
| Submit button says | Replaces “Save answers” on the record | “Save answers” |
| After submitting, say | Replaces “Answers saved.” after a save | “Answers saved.” |
| Can be filled in more than once | Each save creates a new response instead of updating the one on the record | Off — one response per record |
| Answers can be changed after submit | When off, a submitted response cannot be changed by its author; staff may still correct it | On |
| List it on the activity timeline | A completed form is listed on the record’s activity timeline as well as in “Additional information” | Off |
| Who hears about it | People notified in the app the first time a set of answers is submitted (up to 25) | Nobody |
Settings are merged on update, not replaced, so this tab and the header cannot clobber each other.
Placement settings
| Setting | Values | Default |
|---|---|---|
| Attach to | Tickets, Change requests, Assets, Sites & locations, Projects, Project tasks, Client onboarding | — |
| Shown to | The person raising it, Staff working it, Everyone | Everyone |
| When | When the record is created, When it is resolved, When it is closed, Any time, on the record | When the record is created |
| Must be filled in | On / off; unavailable for an any-time rule | Off |
| Active | On / off; an inactive rule matches nothing but keeps its configuration | On |
| Only when… (Tickets) | Categories (prefix match), types, priorities, queues | Every ticket |
| Only when… (Changes) | Change types, categories, risk levels, templates | Every change |
| Only when… (Assets) | Asset types, statuses | Every asset |
| Only when… (Sites) | Location types | Every site |
| Only when… (Projects) | Templates, statuses | Every project |
| Only when… (Tasks) | Project templates | Every task |
Condition keys that do not belong to the chosen record type are stripped on save, so a control that does nothing is never shown back to you.
Sharing settings
| Setting | Effect |
|---|---|
| Organization ticked | The client sees the form in its library and its records can carry responses to it |
| Let them decide where it appears in their own portal | Grants placement rights on the share. The client’s Placement tab then offers its own organization as a target; without it the tab is read-only for them |
| Organization unticked | The share is deactivated, not deleted. The form stops resolving in that organization at once; re-ticking restores it |
Plan tiers
Custom forms carry no plan gate. Building, publishing, placing, sharing, collecting and exporting are available on every tier, including Free, in both the MSP and end-customer tier families.
The one plan-linked limit is storage. Every file answer counts toward the account’s storage allowance, and an upload that would exceed it is refused before anything is written, with a message and, where a larger plan exists, an upgrade prompt.
| Tier family | Free | Tier 2 | Tier 3 | Tier 4 | Enterprise |
|---|---|---|---|---|---|
| MSP | 1 GB | Starter — 25 GB | Growth — 100 GB | Scale — 500 GB | Unlimited |
| End customer | 1 GB | Essentials — 10 GB | Professional — 50 GB | Business — 250 GB | Unlimited |
Limits and known behaviour
- Sizes. Name up to 150 characters; description 2,000; 50 sections per form; 200 questions per section; 200 options per choice; 10 conditions per display rule; labels 300 characters; instructions blocks 4,000; field keys lowercase letters, digits and underscores, up to 64, starting with a letter; up to 500 share targets; files 25 MB each and at most 20 per question; CSV export up to 10,000 responses; list pages up to 100 forms and 200 responses.
- Where forms appear. Create pages: organization and MSP new ticket, customer portal new request, new change wizard, organization asset intake, new project. Record pages: ticket (organization and MSP), change, asset (organization), site, project hub, and the task editor when editing an existing task. Forms placed on a new task appear only once the task exists.
- Resolve and close triggers. “When it is resolved” and “When it is closed” are evaluated. A form on either trigger does not appear on the record until it reaches that state, and a required one blocks the transition: resolving or closing a ticket with an unanswered required form is refused with “Fill in … before resolving it.” Two deliberate exceptions: a required form whose audience is the person raising it never blocks staff (they cannot answer it), and a customer accepting a resolution from their own portal is never blocked either. If the check itself cannot be run, the transition is allowed — a form gate must not freeze a queue.
- Placing a shared form in the client’s organization. The Placement tab takes a target organization. An MSP sees its own organization plus every client it has shared the form to; a client that a form was shared to sees its own organization, and only when “Let them decide where it appears” is ticked. A rule that lives in an organization you cannot write to is shown but not editable. A client is never told which other organizations the form was shared with, or where they placed it.
- Customer portal after submission. The customer’s request detail page shows the forms pointed at the requester, with what they submitted. They can correct their own answers where the form allows it.
- Per-record visibility. A customer-portal reader must be able to see the RECORD, not just its organization: the ticket’s own service is asked whether the request is theirs. Staff are unaffected. If that check cannot be run the answer is “no”, so a customer may briefly see no forms on their own request rather than someone else’s answers on another.
- Record pickers render as a dropdown of the organization’s people, assets or sites and store the reference. The responses table shows the stored reference; the CSV export resolves it to the person’s name, the asset’s name or tag, and the site’s name.
- Draft responses. Saving a response with
status: DRAFTskips required questions but still type-checks and still drops hidden answers. The screens always submit; drafts are reachable through the API. A draft never satisfies a required form on resolve or close. - Abandoned uploads. A file uploaded on a create page that is then abandoned stays in storage under the tenant’s prefix until the tenant’s data is erased.
- Audit log. Publishing, sharing, archiving and answering write to the platform audit log (
FORM_PUBLISHED,FORM_SHARED,FORM_ARCHIVED,FORM_SUBMITTED) alongside the attribution on the rows themselves. - Notifications. The people named under Who hears about it are notified in the app the first time a set of answers is submitted. Corrections afterwards do not notify again, nobody is notified about their own submission, and anyone who has left the account is dropped.
- Not on mobile.
Troubleshooting
| What you see | Why | What to do |
|---|---|---|
| “This form cannot be published yet” with a list | The draft has a problem publishing refuses: see the messages below | Fix each listed item on the Build tab and publish again |
| “Add at least one section.” / “Add at least one question.” | The form is empty | Add a section and at least one question that collects an answer |
| “Every question needs a label.” | A question has an empty label | Give it a label |
| ”… has an invalid field key. Use lowercase letters, numbers and underscores.” | The key was edited to something outside the allowed pattern | Correct the key |
| “Two questions share the field key …. Answers are stored by key, so one would overwrite the other.” | Two keys collide | Change one of them |
| ”… is a choice question with no options.” / ”… has an option with no value.” / ”… has two options with the value …” | A dropdown, choose-one or choose-many is incomplete | Add or fix the options |
| ”… has an invalid validation pattern.” | A pattern set through the API does not compile | Correct or remove the pattern |
| ”… needs a scale maximum above its minimum.” | Scale bounds are inverted or equal | Raise the maximum |
| ”… has a display rule pointing at …, which is not a question on this form.” | A rule references a question that was renamed or deleted | Point the rule at an existing question or remove it |
| The form does not appear on the create page | It is a draft, archived, has no rule, its rule is inactive, its conditions do not match, or the audience excludes you | Check the header says a version is live, the Placement tab has an active rule for that record type, and the conditions match what has been chosen |
| “This form is not attached to anything yet, so nobody will ever see it. Add a rule above.” | No placement | Add a rule on the Placement tab |
| “Rules are saved now and take effect once the form is published.” | The form is a draft | Publish |
| “Some answers need attention.” with messages under questions | A required visible question is blank or an answer fails validation | Correct the marked questions; a hidden question never causes this |
| ”… is required” / “Enter a valid email address” / “Enter a valid phone number” / “Enter a link starting with http:// or https://” | Type validation | Correct the answer |
| “Choose one of the listed options” / “Choose from the listed options” | The answer is not one of the current options, usually after the options changed | Choose again |
| “Attach at most N files” / “Each file must be under N MB” | File rule on the question | Remove files or attach smaller ones |
| Upload refused with “Storage allowance exceeded” | The account is at its storage limit | Free storage or move to a larger plan |
| “This form has already been completed for this record and cannot be changed.” | The form is set not to allow edits after submit and a response exists | Staff can still correct it from the record; otherwise change the setting through the API |
| “You can only change your own answers.” / “This form cannot be changed once it has been submitted.” | A customer-portal user is editing someone else’s response, or one locked after submit | Ask staff to make the correction |
| “Answers can only be removed by staff.” | Remove was attempted from the customer portal | Ask staff |
| “This form was shared with you read-only. Ask the provider who published it to add a placement, or duplicate it to make your own.” | A client tried to place a shared form without placement rights | Duplicate the form, or ask the provider |
| “You can only publish a form to organizations you manage.” | A share target is not a managed client | Choose from the listed organizations |
| “You do not manage any other organizations, so there is nobody to publish this form to.” | The account manages no client organizations | Nothing to do; the form applies to your own records via the Placement tab |
| “Published to you by …. You can attach it to your records and read the answers; only they can change what it asks.” | The form was shared in | Duplicate it to get an editable copy |
| “Not available in the customer portal” | The Responses tab or export was requested from the customer portal | Use a staff portal |
| “This form has never been published.” | Export requested on a draft | Publish first |
| “Organization context required” | The session carries no organization | Sign in to a portal with an organization |
| “Form not found” / “Submission not found” / “Placement not found” / “Organization not found” | Not in your scope, or an organizationId outside your scope was named | Check the identifier and which organization you are acting in |
| An answered form shows a question that is no longer on the form | By design: answers render against the version they were collected under | Nothing; the export shows blanks for questions the live version does not have |
| Two editors: my change vanished | Only one draft exists per form; the last save wins | Reload the editor before editing |