EIIƎ User Guide
ModulesServices

Survey Templates

Survey Templates define the structure and behaviour of surveys. As an administrator, you configure field groups, field types, validation rules, and conditional logic to create surveys tailored to your business needs.

Template Structure

A survey template consists of:

Survey Template
├── Name, Category, Description
├── AI Prompt (template-level guidance)
├── Unit Pronunciations (custom TTS dictionary)
├── STT Context (speech recognition vocabulary)
├── Check Items (reusable field patterns)
├── Field Groups (logical sections)
│   ├── Group settings (collapsible, repeatable, nested)
│   └── Reference images (up to 5 per group)
└── Fields (data to collect)
    ├── Field type and validation
    ├── Options and voice shortcuts
    ├── Conditional display rules
    ├── Calculated formulas
    ├── Default values
    └── Photo hints and location pins (placed by hand, never asked by voice)

Check Items (Reusable Field Patterns)

Check Items are the way to handle repeating field patterns in inspection forms and surveys. Instead of manually creating the same set of fields for each check item, you define a field pattern once and add check items that reference it. Fields are generated automatically at runtime.

When to Use Check Items

Use check items when a template has 3 or more items that each require the same set of fields. For example, a pressure vessel inspection where each component (Shell, Nozzle, Insulation) needs: Condition (select), Anomaly (text), Anomaly Class (select), and Comments (textarea).

How It Works

  1. Define a field pattern — specify the fields that each check item will have (e.g., "Condition" select, "Comments" textarea)
  2. Add check items — each item has a name (e.g., "Shell", "Nozzle") and references the field pattern
  3. Fields are materialised automatically — at runtime, each check item generates one field per pattern field, following the naming convention "{Item Name} - {Field Label}" (e.g., "Shell - Condition")

Creating a Field Pattern

  1. In the left panel, find the Field Patterns section
  2. Click New Pattern to open the pattern editor
  3. Enter a pattern name (e.g., "Inspection Check")
  4. Add fields — each field defines one survey field that will be generated per check item:
    • Label: Display name (e.g., "Condition")
    • Key: Unique identifier, auto-generated from label (e.g., "condition")
    • Type: Field type (select, text, textarea, number, etc.)
    • Configure options, validation, voice labels, and AI prompts as needed
  5. Use the {name} placeholder in AI prompts — it will be replaced with the check item name at runtime

Editing a Field Pattern

When you edit a field pattern, all check items are updated automatically. Because fields are materialised at runtime from the pattern definition, changes to options, validation, types, or any field property take effect immediately for every check item — no manual mass update step needed.

Adding Check Items

Check items can be added in two ways:

Via the AI Template Builder:

  • Upload a document and the AI automatically identifies repeating check items
  • The AI creates the field pattern and check item list from the document structure
  • Add or remove items by asking the AI: "Add brake light inspection" or "Remove the exhaust check"

Via the manual template builder:

  • Find the field pattern in the Field Patterns section
  • Type a name (e.g., "Shell") in the add input and click Add
  • Use Bulk mode to add multiple items at once (one name per line)

Requiring a Comment on Failed Items

Inspection check items usually pair a result (e.g. Acceptable / Not Acceptable) with an optional comment. By default the voice assistant skips the comment when you give a passing result, so you can breeze through acceptable items — but you often want the comment to be mandatory when an item fails.

To enforce this, open the field pattern, expand the comment sub-field, and turn on "Required when…". Add a condition such as Result equals Not Acceptable. Now:

  • When the result is Not Acceptable, the comment becomes required — the voice assistant asks for it and the survey can't be finalised until it's filled.
  • When the result is Acceptable, the comment stays optional and is skipped as before.

The rule lives on the field pattern, so it applies to every check item that uses it. The AI Template Builder also adds this automatically when it recognises a pass/fail-with-comments inspection pattern (it leaves plain Yes/No checklists alone and never overrides a rule you've set).

This is different from conditional visibility (show/hide a field) — "Required when…" controls whether a field must be filled, not whether it's shown.

Generating a Conditional Summary

For field patterns with check items, click the Summary button to auto-generate a conditional summary calculated field:

  1. Select the trigger field (e.g., "Condition") and the condition (e.g., "is not empty")
  2. Select the value field (e.g., "Comments") — the data to include in the summary
  3. Choose a target group and field name
  4. Click Generate — creates a calculated field with one entry per check item

This completes the pipeline: field pattern definition → check item list → report aggregation.

Key Benefits

  • Compact storage — 50 check items are stored as 50 compact rows, not 200+ individual field definitions
  • Automatic updates — editing the field pattern instantly updates all check items
  • AI-friendly — the AI Template Builder can generate and maintain large check item lists (50+ items) efficiently
  • Deterministic field IDs — field IDs follow the pattern ck__{item-id}__{field-key}, making data references stable and predictable

Creating a Template

  1. Navigate to Survey Templates in the services menu
  2. Click New Template
  3. Enter the template name, category, and description
  4. Add field groups to organise your survey
  5. Add fields to each group
  6. Configure validation and conditional logic
  7. Save the template

Field Groups

Field groups organise related fields into logical sections. Groups appear as collapsible sections in the form view and are announced as context during voice surveys.

Groups, repeating groups and office-only fields

Group Settings

SettingDescription
NameDisplay name for the section
DescriptionOptional helper text
CollapsibleAllow users to collapse/expand the section
RepeatableAllow multiple instances of this section

Best Practices for Groups

  • Keep groups focused — aim for 3-8 fields per group
  • Use descriptive names — "Equipment Details" rather than "Section 1"
  • Order matters for voice — fields are presented in order during voice surveys; place identifying fields first
  • Assign all fields to groups — fields without a group appear in an "Other Fields" section

Repeatable Groups

Use repeatable groups when the count of items varies per survey — rooms in a building, equipment items to inspect, tasks completed.

Visual Overview

┌─ Room 1: Kitchen ──────────────────────────┐
│  Room Name: [Kitchen]                        │
│  Blinds Product: [Roller blind]              │
│  Fabric: [Nordic Grey]                       │
│                                              │
│  ┌─ Window 1 ─────────────────────────────┐ │
│  │  Width: [1200] mm    Height: [800] mm   │ │
│  └─────────────────────────────────────────┘ │
│  ┌─ Window 2 ─────────────────────────────┐ │
│  │  Width: [900] mm     Height: [1400] mm  │ │
│  └─────────────────────────────────────────┘ │
│  [+ Add Window]                              │
└──────────────────────────────────────────────┘

[+ Add Room]

Configuration

SettingDescriptionDefault
RepeatableEnable dynamic instance creationOff
Instance Label TemplateTemplate like "Room {n}" — the {n} is replaced with the instance numberGroup name + number
Label Source FieldsThe fields whose values name an instance, checked in the order listedA field named "Label", then "Name"
Allow Zero InstancesUsers can skip the group entirelyOn (min 0)
Maximum InstancesLimit how many can be added, from 1 to 10050

Zero-Instance Groups (Optional Items)

Some repeatable groups represent items that may not exist in every survey:

  • Defects — a quality inspection may have zero defects
  • Issues — an equipment check may find no issues
  • Exceptions — a compliance audit may have no exceptions

Enable "Allow Zero Instances" for these groups. This changes the behaviour:

  • Voice UX — AI asks "Are there any defects?" before creating the first instance
  • Form UX — shows a "No [Items]" button for explicit confirmation
  • Display — shows "None recorded" when skipped

To require at least one instance (e.g., tasks in a task report), disable "Allow Zero Instances".

Instance Labelling

Instances are labelled automatically based on field values or the template:

Resolution order:

  1. The first of the group's Label Source Fields that has a value
  2. If no label source fields are chosen: the value of a field named "Label", then one named "Name"
  3. Instance Label Template with {n} replaced (e.g., "Room 1", "Room 2")
  4. Fallback: "Group Name 1", "Group Name 2"

Once label source fields are chosen, the "Label" and "Name" fields are no longer used unless you list them.

Best practice: Include a "Label" or "Name" field at the start of repeatable groups so surveyors can provide meaningful labels like "Kitchen" or "Master Bedroom".

Items known by a serial or tag. Put {id} in the Instance Label Template and choose the field that holds the identifier under Label Source Fields. "Bolt {id}" reads "Bolt A128" once the serial is given, and "Bolt 7" until then. If two items are given the same identifier, the value is still saved and the surveyor is told "A128 is already Bolt 1."

Voice UX for Repeatable Groups

After completing all fields in an instance, the AI asks:

"Room 1 complete. Add another room?"

Users navigate between instances by label ("go back to the kitchen"), by number ("go to room 2"), or relatively ("previous room" / "next room").


Nested Groups

Create parent-child hierarchies for complex structures:

  • Room → Window
  • Building → Floor → Room
  • Vehicle → Component → Inspection Point

Configuration

  1. Create the parent group with "Repeatable" enabled
  2. Create the child group with "Repeatable" enabled
  3. Set the child group's Parent Group to the parent

Nesting Rules

  1. Only repeatable groups can be parents
  2. No circular references — a group cannot be its own parent or ancestor
  3. One level of nesting recommended — keep hierarchies simple for usability
  4. Child groups inherit parent context — fields know which parent instance they belong to

Voice UX for Nested Groups

The AI includes nested context in prompts:

"Kitchen, Window 2: What's the opening width?"

Example flow:

  1. AI: "What room is this?"
  2. You: "Kitchen"
  3. AI: "Kitchen. What blinds product?"
  4. You: "Roller blind"
  5. AI: "Kitchen: Let's add the first window. Opening width?"
  6. You: "1200 millimetres"
  7. AI: "Opening height?"
  8. You: "800"
  9. AI: "Kitchen, Window 1 complete. Add another window?"
  10. You: "No"
  11. AI: "Kitchen complete with 1 window. Add another room?"

Batches

Use a batch for a set of like items tested together: 12 bolts, 8 fire doors, 20 rooms. A batch lets the tester work one instrument at a time. They check the markings on every bolt, then the hardness of every bolt, instead of finishing bolt 1 before starting bolt 2. The report still reads one item at a time.

When to Use a Batch

  • The number of items is known at the start ("batch of 24")
  • Swapping tools takes longer than moving to the next item
  • Every item gets the same tests

For items found one by one as the survey goes, such as defects, use an ordinary repeatable group.

Setting Up a Batch

A batch is a repeatable group at the top level of the template. Each test is a child group under it. Select the parent group and scroll to Batch in its settings.

SettingWhat it does
Items at the startA new survey starts with this many items, numbered from 1. The survey never asks "add another?".
Question that sets the number of itemsA number field asked once per survey, such as "How many bolts in this batch?". Its answer sets the number of items. The field must sit outside any repeatable group.
PassesWhich tests are collected together across every item. Set each child group to Pass 1, Pass 2 and so on, or leave it at Not in a pass.
Pass N nameWhat the assistant says when the pass starts: "Pass 2, hardness".

You can set a starting number, a count question, or both. With both, the survey starts at the fixed number and the question changes it.

The number of items can't go above the group's Maximum Instances.

How Passes Work

A pass is one trip down the whole batch for one set of tests. With markings in pass 1 and hardness in pass 2, the survey asks markings for bolts 1 to 12, then hardness for bolts 1 to 12.

  • A group left at Not in a pass is asked last, after every pass. The builder tells you which groups these are.
  • The parent group's own fields appear in the list as "Bolt (its own fields: …)". Put them in Pass 1 if they include the serial or tag, so items are called by it from the start.
  • With no passes set, the survey asks every test for item 1 before moving to item 2, as an ordinary repeatable group does.
  • If the builder shows a warning under the passes, Fix the pass list repairs it.

Changing the Number of Items

When the count question is answered again during a survey:

  • A higher number adds empty items at the end.
  • A lower number removes empty items from the end.
  • An item that already has answers is never removed. The survey refuses the change and names the item.

What the Surveyor Sees

  • Voice — the assistant names the item with each question ("Bolt 7: Length?") and announces each pass. It moves to the next item by itself. See Batches in the Voice Assistant.
  • Web form — a batch has a By pass / By item switch. By pass shows a grid with one row per item and one column per field, and a tab for each pass.
  • Mobile form — By pass shows one item at a time with that pass's fields. See Batches in the Mobile App.
Loading...

In the grid, Enter moves down to the next item and Shift+Enter moves up. Enter on the last item carries on to the next pass.

When one value applies to most of the batch, enter it once and choose Fill N blanks with … on that column. It fills only the items with no value. An item that already has a value keeps it.

Best Practices

  1. Name each pass after the instrument or test — "hardness", "dimensions". The name is spoken at the start of the pass.
  2. Ask the identifier in pass 1 — later passes can then say "Bolt A128" instead of "Bolt 7".
  3. Keep each pass short — one to three fields per item keeps the rhythm quick.
  4. Use the count question when batch sizes vary — a fixed number suits a template that always tests the same quantity.

Field Types

TypeUse CaseVoice Behaviour
TextShort text (serial numbers, names)AI asks, user speaks
TextareaLong text (descriptions, notes)AI asks, user speaks longer response
NumberNumeric values (measurements)AI asks, user speaks number
BooleanYes/No questionsAI asks yes/no question
SelectSingle choice from optionsAI asks, user picks one
MultiselectMultiple choices from optionsAI asks, user picks several
DateDate valuesAI asks for date
TimeTime of day (24-hour clock)AI asks for time, user speaks naturally
RatingStar ratings (1-5 scale)AI asks for rating

Two more field types are placed by hand and never asked for by voice: Signature (a signing pad) and Location pin (marking the observation on an attached drawing). See Location Pin Fields.

Any of the types in the table above can also be calculated — deriving their value from a formula instead of user input. See Calculated Fields.

Field Type Selection Guide

Need to capture...
├── A single word/phrase → text
├── A paragraph or detailed notes → textarea
├── A measurement with units → number (with unit property)
├── A yes/no answer → boolean
├── One choice from a list → select
├── Multiple choices from a list → multiselect
├── A specific date → date
├── A time of day → time
├── A quality/condition score → rating
└── Where an observation is, on a drawing → pin (location pin)

Field Settings

SettingDescription
NameDisplay name — should be natural language
RequiredMust be completed before survey can be submitted
DescriptionHelper text shown below the input in form mode and used by AI for context
UnitMeasurement unit for number fields (e.g., "PSI", "mm")
AI PromptInstructions for the AI when asking for this field
Voice LabelShort label spoken by TTS instead of the field name (optional)
Voice AliasesShort names a surveyor may say for the field in offline voice (optional)

Voice Label (Short TTS Prompt)

Some fields need descriptive names for display and reports but shorter prompts for voice. The Voice Label overrides the field name in voice prompts only.

When to use Voice Label:

  • Paired fields where the name repeats context (e.g., "Comments on Seats and seat belts" with voice label "Comment")
  • Fields with long descriptive names that are awkward when spoken as questions
  • Any field where the voice prompt should differ from the display label

How it works:

  • Form and print — shows the full field name ("Comments on Seats and seat belts")
  • Voice prompt (TTS) — says the voice label ("Comment?")
  • AI context — the AI sees both the full name and the voice label, so it understands user responses in context
  • Falls back to the field name when no voice label is set (backward compatible)

Configuring in the builder:

  1. Select a field in the field editor panel
  2. Find the "Voice Label" input below Description
  3. Enter a short label (e.g., "Comment")
  4. Leave empty to use the field name as usual

Voice Aliases (Offline Voice)

Voice Aliases are short names a surveyor might say for a field, such as "width" for "Opening width in mm". Offline voice reads them as it reads the field's name, so "width 300" saves to that field. Online voice doesn't use them.

  • Find Voice Aliases (Optional) under Voice Label, type a name, and press Enter. Add as many as you need.
  • The builder warns you, without blocking the save, when an alias matches another field's name, voice label, alias or option.
  • Leave it empty and nothing changes.

Paired Field Pattern (Checklist Templates)

For inspection checklists where each check item has a Pass/Fail result followed by a comment field, set the voice label to "Comment" on each comment field and add template-level AI prompt coaching for compound utterances:

PAIRED FIELDS PATTERN: Each check item (Pass/Fail) is followed by a Comment field.

  • "Fail, brake light out" — save BOTH result and comment in one call
  • "Pass, skip comment" — save result and skip the comment
  • "Pass" alone — save result only, system prompts "Comment?" next

This lets inspectors say "Pass, skip comment" to breeze through passing items, or "Fail, brake light out" to capture both in one breath.

Naming Tips for Number Fields

Include the unit in the field name when known. This makes the expected input immediately clear:

Instead ofUse
Oil temperature readingOil Temperature in degrees C
Pressure valueOperating Pressure in PSI
Distance measurementDistance in metres
WeightNet Weight in kg

Using Field Descriptions

The description property is displayed below form inputs and used by the AI as additional context. Use it to clarify:

Field NameGood Description
Operating Pressure in PSINormal range: 30-150 PSI
Serial NumberFormat: XX-123456 (2 letters, dash, 6 digits)
Condition Rating1 = Critical replacement needed, 5 = Like new
Installation DateDate the equipment was first commissioned

Time Fields

Time fields capture a time of day, stored in 24-hour HH:MM format (e.g., "14:30"). The system automatically converts a wide range of spoken and typed formats.

Voice Input Conversions

User SaysSaved Value
"two thirty PM"14:30
"9:30 AM"09:30
"fourteen hundred" or "1400"14:00
"noon" or "midday"12:00
"midnight"00:00
"3 o'clock"03:00
"3 PM"15:00

Form Input

In form mode, a native time picker is displayed. The value is always stored in 24-hour HH:MM format regardless of how it's entered.

Best Practices

  • Use clear field names like "Start Time" or "Inspection Time"
  • Add a description if context helps (e.g., "Time the inspection was carried out")
  • The AI automatically converts natural time expressions — no special configuration needed

Select and Multiselect Options

Adding Options

  1. Click Add Option to create choices
  2. Enter the display text for each option
  3. Order options logically (most common first)

Voice Shortcuts (Aliases)

For technical fields with long option names, add voice shortcuts so users can speak abbreviations:

Example: Connection Type Field

OptionAliases
Electric Fusion (Arc) Weld / Spiral Weld (0.8)"arc", "spiral", "fusion"
Electric Resistance Weld (1.0)"resistance", "erw"
(Double) Submerged Arc Weld (1.0)"submerged", "saw"

Click the Aliases button next to each option to add shortcuts.

Alias Design Guidelines

  1. Include common abbreviations — "ERW" for Electric Resistance Weld
  2. Include partial matches — "spiral" for an option containing "Spiral Weld"
  3. Include industry terms — "SAW" for Submerged Arc Weld
  4. Avoid ambiguous aliases — don't use "arc" if multiple options contain "arc"
  5. Case insensitive — all alias matching is case-insensitive; no need to add variants

Option Count Guidelines

OptionsVoice UXRecommendation
2-3ExcellentAI can list all options naturally
4-6GoodAI asks without listing; user likely knows the domain
7-10AcceptableUse aliases heavily; consider AI prompt guidance
10+PoorConsider splitting into hierarchical fields

Code Input Fields

For text fields that capture codes (registration marks, serial numbers, part numbers), enable the Code Input option. This allows users to dictate using the NATO phonetic alphabet and number words.

When to Enable Code Input

  • Field captures alphanumeric codes (serial numbers, registration marks, part numbers)
  • Users may spell out codes character by character
  • Codes contain mixed letters and numbers

Voice Input Conversions

User SaysSaved Value
"Alpha Bravo Charlie one two three"ABC123
"Golf Bravo one two three Alpha Bravo"GB123AB
"Sierra November dash one two three four"SN-1234
"Hotel hyphen Mike four two"H-M42

Supported conversions:

  • Phonetic alphabet — Alpha to A, Bravo to B, through Zulu to Z
  • Number words — zero through nine (plus "niner" aviation form)
  • Homophones — to/too to 2, for to 4, won to 1, ate to 8, oh to 0
  • Symbols — hyphen/dash to -, slash to /, dot/point to ., underscore to _

Output is always UPPERCASE for consistency.

Configuring in the Builder

  1. Select a text or textarea field
  2. In the field configuration panel, find "Text Options"
  3. Toggle on "Code Input"

Calculated Fields

Calculated fields derive their values automatically from formulas referencing other fields. They are never prompted for — the value is computed in real time as dependencies are filled in.

When to Use Calculated Fields

ScenarioExample FormulaResult Type
Totals / subtotals{quantity} * {unit_price}number
Pass/fail determinationsIF(AND({brake_test} == "pass", {emissions} <= 100), true, false)boolean
Risk scoresIF({severity} > 3, "High", IF({severity} > 2, "Medium", "Low"))text
Summary textCONCAT({location}, " - ", {condition})text

Configuring Calculated Fields

  1. Create a field with the desired result type (number, boolean, text, etc.)
  2. Enable the "Calculated" toggle in the field configuration panel
  3. Enter the formula expression in the formula editor
  4. Review validation feedback — the editor shows parse errors, missing references, and cycle warnings

Formula Syntax

Field references — wrap field IDs in braces: {field_id}

Operators:

  • Arithmetic: +, -, *, /
  • Comparison: ==, !=, >, <, >=, <=
  • Logical: &&, ||, !

Built-in Functions

FunctionDescription
IF(condition, then, else)Conditional — returns then if truthy, else otherwise
SUM(a, b, c, ...)Sum of numeric values (skips nulls)
AVERAGE(a, b, c, ...)Arithmetic mean (skips nulls)
MIN(a, b, c, ...)Minimum value
MAX(a, b, c, ...)Maximum value
COUNT(a, b, c, ...)Count of non-null values
AND(a, b, ...)True if all arguments truthy
OR(a, b, ...)True if any argument truthy
NOT(value)Logical negation
CONCAT(a, b, c, ...)String concatenation (nulls become empty)
ROUND(number, decimals?)Round to N decimal places (default 0)
ABS(number)Absolute value
TEXTJOIN(separator, val1, val2, ...)Join non-empty values with separator (skips nulls and empty strings)

Null Propagation

If a dependency field hasn't been filled in yet, the calculated field shows "(not yet calculated)". The value appears once all dependencies have values. Division by zero returns null — no crash, no error.

Evaluation Chain

Calculated fields can reference other calculated fields. The engine evaluates them in topological order — if field C depends on B which depends on A, it evaluates A, then B, then C automatically.

Circular dependencies are blocked at save time. The template builder shows an error if a cycle is detected.

Voice and Form UX

  • Voice — AI never prompts for calculated fields. Use AI Prompt on the calculated field to guide how the AI reads back the result (e.g., "After all tests are complete, tell the surveyor the overall result")
  • Form — displayed as read-only with a purple accent and "Calculated" badge. Values update in real time as dependencies change

Hidden Calculated Fields

Mark a calculated field as Hidden to make it evaluate without appearing in the survey form. Hidden fields are excluded from:

  • The form view (web and mobile)
  • PDF reports and print preview (web and mobile)
  • Progress percentage calculations
  • The AI voice assistant — the AI won't read or prompt for them

Hidden fields are useful as intermediate calculations that feed into a visible summary. This keeps each formula small and debuggable rather than combining everything into a single large expression.

Configuring:

  1. Enable the "Calculated" toggle
  2. Enable the "Hidden from form" toggle that appears below it
  3. Enter the formula expression as normal

Conditional Summary Mode

For inspection-style surveys where many items share the same pattern (trigger field + comment field), Conditional Summary provides a point-and-click alternative to formula expressions.

Instead of writing CONCAT(IF({seat_status} == "Fail", CONCAT("Seats: ", {seat_comment}, "\n"), ""), ...), you configure a list of entries in the UI:

EntryInclude WhenValue FromLabel
1seat_status equals "Fail"seat_commentSeats
2lamp_status equals "Fail"lamp_commentWarning Lamps
3switch_status equals "Fail"switch_commentSwitches

The system evaluates each entry, collects matching values with their labels, and joins them with the configured separator (default: new line). Empty values are automatically skipped.

Supported "Value from" field types: text, textarea, number, select, and multiselect. Select field values are included as their selected option text.

Configuring:

  1. Create a text or textarea field and enable "Calculated"
  2. Change the Mode from "Formula Expression" to "Conditional Summary"
  3. Click Add Entry for each trigger/value pair
  4. Configure settings: include labels, label separator, line separator

Trigger operators:

OperatorUse When
EqualsTrigger field matches a specific value (e.g., "Fail")
Does not equalTrigger field is anything except a value (e.g., not "Pass")
Is not emptyTrigger field has any value
Is emptyTrigger field has no value

Settings:

SettingDefaultDescription
Include labelsOnPrefix each line with the entry label
Label separator: Text between label and value (e.g., "Seats: Worn fabric")
Line separatorNew lineHow to join multiple entries

TEXTJOIN for Aggregation

TEXTJOIN(separator, val1, val2, ...) joins non-empty values with a separator, automatically skipping nulls and empty strings. This is cleaner than nested CONCAT + IF patterns when aggregating multiple fields.

Example: Combine three optional comment fields into one summary:

TEXTJOIN("\n", {comment_1}, {comment_2}, {comment_3})

If comment_1 = "Worn fabric", comment_2 is empty, and comment_3 = "Intermittent", the result is:

Worn fabric
Intermittent

Inspection Template Pattern

For templates like vehicle inspections (MOT VT29), equipment audits, or quality checks, where each section has 5-15 check items with conditional comments, use one of these patterns:

Pattern A: Conditional Summary (recommended for most cases)

Create a single calculated field per section in Conditional Summary mode. Each check item's trigger/value pair is an entry in the list. No formula syntax needed.

Section: Interior
├── Seats Status [select: Pass/Fail]
├── Seats Comment [text, conditional on Fail]
├── Warning Lamps Status [select: Pass/Fail]
├── Warning Lamps Comment [text, conditional on Fail]
├── ...
└── Interior Summary [calculated, conditional summary mode]
    → "Seats: Worn fabric\nWarning Lamps: ABS light stays on"

Pattern B: Hidden per-row calcs + TEXTJOIN (for complex logic)

When each row needs custom logic (e.g., different conditions per item, or combining multiple fields per row), use hidden intermediate calculated fields:

Section: Interior
├── Seats Status [select: Pass/Fail]
├── Seats Comment [text, conditional on Fail]
├── _seat_line [calculated, HIDDEN]
│   → IF({seat_status} == "Fail", CONCAT("Seats: ", {seat_comment}), "")
├── Warning Lamps Status [select: Pass/Fail]
├── Warning Lamps Comment [text, conditional on Fail]
├── _lamp_line [calculated, HIDDEN]
│   → IF({lamp_status} == "Fail", CONCAT("Lamps: ", {lamp_comment}), "")
├── ...
└── Interior Summary [calculated, visible]
    → TEXTJOIN("\n", {_seat_line}, {_lamp_line}, ...)

Each hidden calc is a simple one-liner. The visible summary just joins them. Adding a new check item means adding one hidden calc and one TEXTJOIN argument.

When to use which:

CriteriaConditional SummaryHidden calcs + TEXTJOIN
All items follow same patternBest choiceWorks but more effort
Items have different trigger logicLimitedBest choice
Need to combine multiple fields per rowNot supportedBest choice
Number of itemsAny (scales well)Any (scales well)
Formula knowledge neededNoneBasic

Best Practices for Calculated Fields

  • Use ROUND() for currency and measurement calculations to avoid floating-point issues
  • Keep formulas readable — prefer IF(condition, "Pass", "Fail") over deeply nested expressions
  • Limit dependency chains to 3 levels max for clarity
  • Calculated fields are strictly read-only — don't use them for values users should override
  • For 5+ conditional items, prefer Conditional Summary mode over nested CONCAT(IF(...)) formulas
  • Use hidden intermediate calcs to decompose complex formulas into small, testable pieces
  • Name hidden calcs with an underscore prefix (e.g., _seat_line) to visually distinguish them from user-facing fields

Default Values from Job Line Metadata

Survey templates can configure fields to be pre-populated from the linked Job Line's metadata when a survey is created.

When to Use Metadata Defaults

Field PurposeMetadata KeyBenefit
Inspection datescheduled_dateAuto-fill from job schedule
Surveyor nameassignee_nameAuto-fill from assigned team member
Job referencejob_refInclude in report header automatically
Site/task titlejob_line_titlePre-populate survey title

Available Metadata Keys

KeyDescriptionData Type
job_line_titleJob line titleText
job_line_descriptionJob line descriptionText
job_line_notesJob line notesText
job_line_statusCurrent job line statusText
scheduled_dateScheduled dateDate
completed_dateCompletion dateDate
assignee_nameAssigned team member nameText
job_refParent job reference numberText

Configuring in the Builder

  1. Select a field in the field editor panel
  2. Scroll to "Default Value" section
  3. Choose "Job line metadata" from the Default Source dropdown
  4. Select the metadata field you want to use

Type Compatibility

Metadata TypeCompatible Field TypesNotes
Text fieldstext, textarea, selectDirect assignment
Date fieldsdate, textDate fields receive ISO date string
Any textnumberAttempts numeric conversion

The UI shows warnings when metadata types may not match field types well.

Voice UX Behaviour

When a field has a metadata default:

AI: "The inspection date is set to January 15th. Would you like to change it?"

Pre-filled fields count as "completed" in progress calculations. Users can override any pre-populated value.

Static vs Metadata Defaults

Default TypeUse Case
NoneField starts empty — user provides all input
StaticFixed default value (e.g., status = "Pending")
Job line metadataDynamic value from linked job line

Validation Rules

Number Fields

RuleDescription
MinMinimum allowed value
MaxMaximum allowed value

Example: Temperature field with min: -40, max: 300

Text Fields

RuleDescription
PatternRegular expression for format validation

Example: Serial number pattern: ^[A-Z]{2}-\d{4}$

The AI will ask users to re-enter values that fail validation.


Conditional Logic

Show or hide fields based on previous answers. This keeps surveys focused by only asking relevant questions.

Creating Conditional Rules

  1. Select the field to make conditional
  2. Click Add Condition
  3. Choose the trigger field, operator, and value
  4. Set whether to Show If or Hide If the condition is met

Available Operators

OperatorDescription
EqualsExact match
Not EqualsDoes not match
ContainsText contains substring
Not ContainsText does not contain substring
Greater ThanNumeric comparison
Less ThanNumeric comparison
BetweenRange check
Is EmptyField has no value
Is Not EmptyField has a value

Multiple Conditions

Combine conditions with AND/OR logic:

  • AND — All conditions must be true
  • OR — Any condition must be true

Best Practices

  • Keep dependency chains short (A to B to C max — avoid longer chains)
  • Don't hide required fields without alternatives
  • Don't create circular dependencies
  • Test all conditional paths before publishing

AI Prompts

Customise how the AI asks for each field using AI prompts.

Template-Level Prompt

Set overall behaviour for the entire survey:

"You are helping complete an HVAC equipment inspection. Be efficient and professional. For measurements, confirm values outside normal ranges."

Field-Level Prompts

Override behaviour for specific fields:

For confirmation-critical fields:

"Always confirm the serial number by reading it back. Ask user to spell out ambiguous characters."

For measurement fields:

"If value seems unusually high/low, confirm before saving. Normal range is 30-150 PSI."

For technical select fields:

"Ask for weld type. Accept common abbreviations. Don't list all options unless user asks."


Unit Pronunciations (Custom TTS Dictionary)

The system automatically converts common unit symbols to spoken forms for text-to-speech:

SymbolSpoken
degrees F, degrees C"degrees Fahrenheit", "degrees Celsius"
PSI, kPa"P S I", "kilopascals"
mm, cm, ft"millimetres", "centimetres", "feet"
rpm"R P M"
V, W, kW"volts", "watts", "kilowatts"
Hz, kHz"hertz", "kilohertz"

For unusual symbols not in the built-in table, add custom pronunciations:

  1. In the Template Properties panel, scroll to "Unit Pronunciations (Optional)"
  2. Enter the unit symbol exactly as it appears in your field's unit property
  3. Enter the spoken pronunciation you want TTS to use
  4. Click + to add the entry

Example custom entries:

SymbolPronunciation
mOhmmilliohms
dBmdecibel milliwatts
kN/m squaredkilonewtons per square metre

Custom pronunciations apply before built-in patterns and work across both web and mobile voice modes.


STT Context (Speech Recognition)

The system automatically extracts vocabulary from your template to improve speech-to-text accuracy. This includes field names, select options, voice aliases, and terms from AI prompts.

When to Add Manual Terms

For specialised vocabulary not captured automatically, add terms to the STT context:

  • Brand names and model numbers (e.g., "Sheer Flow 201")
  • Industry standards and codes (e.g., "API 1104", "ASME B31.8")
  • Chemical formulas and refrigerants (e.g., "R-410A")
  • Company-specific terminology

You don't need to add field names, select options, or voice aliases — these are extracted automatically.

Configuring in the Builder

In the Template Properties panel, scroll to "STT Context (Optional)". The editor has three sections:

Additional Terms — individual vocabulary words or phrases:

  1. Type a term in the input field
  2. Click + or press Enter to add it
  3. Each term appears as a removable badge

Domain Context — key-value pairs for broader context:

  1. Enter a key (e.g., "organisation", "equipment", "industry")
  2. Enter a value (e.g., "Acme Pipeline Services")
  3. Click + to add

Background Text — free-form text:

  1. Enter any additional context in the text area
  2. This is sent to the speech engine as-is

Manual terms are merged with the auto-extracted vocabulary and sent to the speech recognition engine on both web and mobile.

Context Budget

The speech recognition system accepts approximately 8,000 tokens of context. If you have extensive manual terms, prioritise the most critical vocabulary.


Reference Images

Add images to field groups to help users during surveys.

When to Add Images

  • Equipment nameplates showing where to find data
  • Condition examples (Good, Fair, Poor ratings)
  • Safety information and access points
  • Technical diagrams for complex equipment

Adding Images

  1. Select a field group
  2. Click Add Reference Image
  3. Upload the image (up to 5 per group)
  4. Add a descriptive caption

Caption Guidelines

Good captions help the AI find and display the right image:

  • "Nameplate location on XYZ-2000 series units"
  • "Example of corrosion requiring Poor rating"
  • "Refrigerant pressure gauge reading location"

During voice surveys, users can say "show me the nameplate" and the AI will display the matching image.


Photo Hints

Photo hints prompt the voice assistant to ask the inspector to take a photo at specific points during a survey. Unlike reference images (which show the inspector how to do something), photo hints tell the inspector what to photograph as evidence.

When to Use Photo Hints

ScenarioExample Hint
Equipment identification"Take a photo of the equipment nameplate"
Damage documentation"Take a photo of the damaged area"
Before/after evidence"Take a photo of the installation before starting work"
Condition assessment"Take a photo showing the overall condition of the unit"
Safety compliance"Take a photo of the safety label"

Writing Good Photo Hints

Photo hints are spoken to the inspector before the field question is asked. The inspector has no context about which field is coming next, so the hint text must be fully self-descriptive.

QualityExampleWhy
Good"Take a photo of the equipment nameplate"Describes exactly what to photograph
Good"Take a wide-angle photo of the full equipment setup"Clear subject and framing
Bad"Take a photo of this field"Inspector doesn't know which field
Bad"Photo"No description of what to capture
Bad"Take a photo"Too vague — what should they photograph?

Configuring Photo Hints

On a field:

  1. Select a field in the field editor panel
  2. Find the "Photo Hint" input below AI Prompt
  3. Enter the hint text (e.g., "Take a photo of the equipment nameplate")
  4. Leave empty if no photo is needed for this field

On a group:

  1. Select a group in the group editor panel
  2. Find the "Photo Hint" input above Reference Images
  3. Enter the hint text (e.g., "Take a wide-angle photo of the equipment before recording details")

Voice UX Behaviour

When the AI reaches a field with a photo hint:

AI: "Before we record the serial number, take a photo of the equipment nameplate." [Camera opens — inspector takes photo] AI: "OK, what's the serial number?"

When entering a group with a photo hint:

AI: "We're starting the equipment inspection. Take a wide-angle photo of the equipment setup." [Camera opens — inspector takes photo] AI: "First, what's the equipment type?"

Voice Commands for Photos

Inspectors can also request photos at any time during a voice session:

  • "Take a photo"
  • "Take a picture of the damage"
  • "Photograph this"
  • "Snap this"

The AI will open the camera and attach the photo to the current field context.

Best Practices

  • Use sparingly — only add photo hints where a photo genuinely adds value to the inspection record
  • Be specific — describe the subject clearly ("the nameplate", "the damaged section", "the overall setup")
  • Field-level vs group-level — use field-level hints for specific items (nameplate, label) and group-level hints for overview shots before a section
  • Don't duplicate — if a reference image already shows what to look at, a photo hint captures evidence of what was found

Location Pin Fields

A Location pin field lets the surveyor mark where an observation is, on a drawing or photo attached to the survey. The designed report then shows that drawing with a numbered marker per observation and a legend.

Pins are placed by hand in form mode on the phone. The voice assistant never asks for one, and pins don't count towards the progress percentage — like photos and signatures.

Full surveyor walkthrough in Drawings & Pins →

When to Use a Location Pin

Add one when where an observation is matters as much as what it is:

ScenarioExample
Condition surveyEach defect marked on the building's floor plan
Equipment auditEach asset marked on the plant-room schematic
Site inspectionEach observation marked on a photo of the elevation
Drainage / utility workEach finding marked on the relevant page of a drawing set

Don't add one when a text field already answers the question ("Room", "Panel reference"). A pin costs the surveyor a placement step, so it should earn it.

Adding the Field

  1. Select the repeatable group that holds the observations — "Defects", "Findings", "Rooms".
  2. Drag Location pin from the field palette into the group.
  3. Name it for the surveyor: "Location on plan" reads better than "Pin".
  4. Set Required if every observation must be pinned before the survey can be completed.

The field belongs on the group whose instances the markers should number. Put it on the "Defects" group and each defect gets its own marker.

Required Pins

A required pin is satisfied by one pin on any sheet. The surveyor doesn't have to pin the observation on every drawing attached to the survey.

When a required pin is missing:

  • The observation's card shows a "Pin needed" warning badge.
  • The form footer counts them — "2 location pins needed".
  • Complete is refused, naming the observation and the field. The same refusal appears on the phone, in the web completion dialog, and if the surveyor asks the assistant to finish.

What the Surveyor Sees

  • The field reads Place pin, then Pinned on 1 sheet / Pinned on 3 sheets once used.
  • Tapping it opens a full-screen placement view with every sheet on the survey.
  • If no sheets are attached yet, the field is inactive and says "Add a sheet in the Sheets section first."

Sheets are attached per survey, not per template — there's nothing to configure here for them.

Best Practices

  • One pin field per group. Two on the same observation confuse the badge and the report legend.
  • Put it near the end of the group — the surveyor records what the defect is first, then where it is.
  • Only make it required when every observation genuinely needs one. A required pin blocks completion, and a sheet isn't always available.
  • Pair it with findings. When an observation carries a survey finding, the report legend picks up that finding's classification and severity automatically.
  • Name it in plain words. The name appears on the card, in the legend and in the completion refusal.

Template Review Checklist

Before publishing a template, verify the following:

Voice UX

  • Field names are natural language (not database codes)
  • Numeric field names include the unit when known
  • Select fields with 7+ options have voice shortcuts configured
  • Critical fields (serial, model) have confirmation in AI prompt
  • Field order makes sense for a spoken conversation
  • No ambiguous aliases across different options
  • Repeatable groups have clear instance labelling configured
  • Nested groups have intuitive parent-child transitions
  • Code fields have "Code Input" enabled
  • Unusual unit symbols have custom pronunciations configured
  • Domain-specific vocabulary added to STT Context (brand names, codes, standards)
  • Paired fields (e.g., check + comment) use voice labels for succinct TTS prompts
  • Template AI prompt coaches AI on compound utterances for paired field patterns
  • Fields requiring photographic evidence have photo hints configured
  • Photo hint text is self-descriptive (doesn't assume field context)

Data Quality

  • Required fields are marked appropriately
  • Number fields have reasonable min/max validation
  • Select options are mutually exclusive and exhaustive
  • Text fields with known formats have pattern validation

Conditional Logic

  • No circular dependencies between fields
  • All conditional paths are reachable
  • Required fields aren't hidden without alternatives
  • Dependency chains are 3 levels or less

Calculated Fields

  • All calculated fields have valid formulas or conditional summary configs (no parse errors)
  • No circular dependencies between calculated fields
  • Calculated fields have AI prompt guidance for voice readback
  • Formulas tested with edge cases (zero, null, boundary values)
  • ROUND() used for currency/measurement outputs
  • Hidden calculated fields are marked hidden (not just visually suppressed via conditional rules)
  • Conditional summary entries all have a label, trigger field, and value field configured
  • Sections with 5+ check items use Conditional Summary or hidden calc pattern (not deeply nested formulas)

Check Items

  • Repeating field patterns (3+ instances) use check items, not manual duplication
  • Field pattern keys are descriptive (e.g., "condition", "comments")
  • Voice shortcuts and options configured at field pattern level (not per-item)
  • Conditional summaries generated for patterns with 5+ check items

Repeatable Groups

  • Instance label templates use {n} placeholder
  • Maximum instances set to a reasonable limit
  • First field in repeatable group is a "label" or "name" field
  • "Allow Zero Instances" enabled for optional groups (defects, issues)
  • "Allow Zero Instances" disabled for mandatory groups (tasks)
  • Nested groups have Parent Group correctly set

Batches

  • The batch is a top-level repeatable group with each test as a child group
  • A starting number or a count question is set
  • Each pass has a short spoken name
  • The identifier field, if there is one, is in Pass 1
  • No pass warnings show in the builder

Location Pins

  • The location pin field sits on the group whose observations the markers should number
  • Only one pin field per group
  • "Required" is set only where a sheet will always be available
  • The field name reads well on the card, in the report legend and in a completion refusal

Default Values

  • Fields that should match job line data have metadata defaults configured
  • Metadata default types are compatible with field types
  • Static defaults set for fields with known constant starting values

Completeness

  • All fields have clear, descriptive names
  • Fields with non-obvious expectations have descriptions set
  • All fields belong to a group
  • Groups have meaningful names and descriptions
  • Reference images have descriptive captions

Testing

  • Complete survey in voice mode — all fields accessible
  • Complete survey in form mode — all fields render correctly
  • Test all conditional paths
  • Test voice shortcuts for select fields
  • Test repeatable groups: add multiple instances, remove instances
  • Test nested groups: add parent with multiple children
  • Test "Add another?" flow in voice mode
  • Test navigation between instances
  • Verify calculated fields update when dependencies change
  • Verify custom unit pronunciations are spoken correctly in voice mode
  • Verify STT Context terms improve recognition of domain-specific vocabulary
  • Verify print preview shows all expected data
  • Attach a sheet on the phone, place a pin, and check the marker and legend in the designed report

Template Versioning

A template moves through three statuses: Draft, Published and Obsolete. You build and test a Draft, then click Publish to make it available for new surveys.

Once a template is Published, its structure is locked: the header shows Structure locked, and you can't add, remove or change fields, groups, field patterns or check items. You can still edit details such as the name and description.

Changing a Published Template

To change the structure of a template that's in use, make a new version:

  1. Open the Published template and click New Version
  2. If the template has report designs, choose Carry layouts to copy them onto the new version as Drafts, or Don't carry to start without one
  3. Edit the new version. It's a Draft with the next version number (for example 1.3 after 1.2), with the same fields, groups and reference images
  4. Click Publish when it's ready

Publishing the new version marks the previous Published version Obsolete. An Obsolete template can't be edited and isn't offered for new surveys. Surveys already started on it keep working, and keep the version they started with.

Reference images still being checked for viruses when you create the version aren't copied, and you see a message saying so. Upload them again on the new version.

Approving a Template for Use

When you click Publish on a Draft, the Approve this template for use dialog opens. It says that publishing locks the template structure and retires any Published version with the same label.

Tick I confirm I have reviewed this template and approve it for use. The Publish button stays unavailable until you do. Click Cancel to go back without publishing.

Your acceptance is recorded when you publish. Save any unsaved changes first: you can't publish while the template has unsaved edits.

Deleting a Draft

To remove a Draft you no longer need, such as a new version you've decided against, open it, click the More actions button (⋯) at the top right and choose Delete. Its reference images and report designs are deleted with it. This can't be undone.

Only Drafts can be deleted. A Draft that a survey has used can't be deleted, and a Published template is retired by setting it to Obsolete instead.

Publishing and Permissions

  • Templates must be published to be available for new surveys
  • Set visibility to control who can access the template
  • Assign templates to specific team members or roles

On this page

Survey TemplatesTemplate StructureCheck Items (Reusable Field Patterns)When to Use Check ItemsHow It WorksCreating a Field PatternEditing a Field PatternAdding Check ItemsRequiring a Comment on Failed ItemsGenerating a Conditional SummaryKey BenefitsCreating a TemplateField GroupsGroup SettingsBest Practices for GroupsRepeatable GroupsVisual OverviewConfigurationZero-Instance Groups (Optional Items)Instance LabellingVoice UX for Repeatable GroupsNested GroupsConfigurationNesting RulesVoice UX for Nested GroupsBatchesWhen to Use a BatchSetting Up a BatchHow Passes WorkChanging the Number of ItemsWhat the Surveyor SeesBest PracticesField TypesField Type Selection GuideField SettingsVoice Label (Short TTS Prompt)Voice Aliases (Offline Voice)Paired Field Pattern (Checklist Templates)Naming Tips for Number FieldsUsing Field DescriptionsTime FieldsVoice Input ConversionsForm InputBest PracticesSelect and Multiselect OptionsAdding OptionsVoice Shortcuts (Aliases)Alias Design GuidelinesOption Count GuidelinesCode Input FieldsWhen to Enable Code InputVoice Input ConversionsConfiguring in the BuilderCalculated FieldsWhen to Use Calculated FieldsConfiguring Calculated FieldsFormula SyntaxBuilt-in FunctionsNull PropagationEvaluation ChainVoice and Form UXHidden Calculated FieldsConditional Summary ModeTEXTJOIN for AggregationInspection Template PatternBest Practices for Calculated FieldsDefault Values from Job Line MetadataWhen to Use Metadata DefaultsAvailable Metadata KeysConfiguring in the BuilderType CompatibilityVoice UX BehaviourStatic vs Metadata DefaultsValidation RulesNumber FieldsText FieldsConditional LogicCreating Conditional RulesAvailable OperatorsMultiple ConditionsBest PracticesAI PromptsTemplate-Level PromptField-Level PromptsUnit Pronunciations (Custom TTS Dictionary)STT Context (Speech Recognition)When to Add Manual TermsConfiguring in the BuilderContext BudgetReference ImagesWhen to Add ImagesAdding ImagesCaption GuidelinesPhoto HintsWhen to Use Photo HintsWriting Good Photo HintsConfiguring Photo HintsVoice UX BehaviourVoice Commands for PhotosBest PracticesLocation Pin FieldsWhen to Use a Location PinAdding the FieldRequired PinsWhat the Surveyor SeesBest PracticesTemplate Review ChecklistVoice UXData QualityConditional LogicCalculated FieldsCheck ItemsRepeatable GroupsBatchesLocation PinsDefault ValuesCompletenessTestingTemplate VersioningChanging a Published TemplateApproving a Template for UseDeleting a DraftPublishing and Permissions