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

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.

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 LabelTemplate like "Room {n}" — the {n} is replaced with the instance numberGroup name + number
Allow Zero InstancesUsers can skip the group entirelyOn (min 0)
Max InstancesLimit how many can be added50

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. Value of field with ID label (if exists and non-empty)
  2. Value of field with ID name (if exists and non-empty)
  3. Instance label template with {n} replaced (e.g., "Room 1", "Room 2")
  4. Fallback: "Group Name 1", "Group Name 2"

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".

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?"

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

Any of these types 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

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 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

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 session 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

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

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

Template Versioning

Templates are versioned automatically. When you edit a template:

  • Existing sessions continue using the version they started with
  • New sessions use the latest version
  • Version history is preserved for auditing

Publishing and Permissions

  • Templates must be published to be available for new sessions
  • 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 GroupsField TypesField Type Selection GuideField SettingsVoice Label (Short TTS Prompt)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 PracticesTemplate Review ChecklistVoice UXData QualityConditional LogicCalculated FieldsCheck ItemsRepeatable GroupsDefault ValuesCompletenessTestingTemplate VersioningPublishing and Permissions