User Journey
A user journey controls which questions a respondent sees during an assessment. Without one, every control in a policy is shown. With one, a control can be made to appear only when an earlier answer calls for it — so a team is not asked about model training when they said they bought the system off the shelf.
User journeys belong to the Assessment stage, and they are configured separately from the policy itself. A policy defines what is asked; a user journey defines when it is asked. See the Overview for how Assessment fits with Authoring, Testing and Runtime Governance.
For the concept and how it appears to a respondent, see Conditional Form Logic. This page covers the configuration.
Table of Contents
- The one structural rule
- How a journey is put together
- Fields
- How visibility is decided
- Which journey applies
- Configuring a journey
- Common patterns
- Quick reference
The one structural rule
Conditional flow works within a single control bundle, not across bundles.
A dependency lives inside a bundle’s configuration, and both controls it refers to — the one being shown or hidden, and the one whose answer controls that — must be in that same bundle.
A cross-bundle dependency does not raise an error. It is silently ignored. When the platform works out visibility for a bundle and a dependency names a control it cannot see, that condition is skipped and the dependent control stays visible. Nothing appears in the interface to say the rule did not take effect.
This is the single most common reason a journey “does not work”. If a control is not hiding when you expect it to, check first that its parent is in the same control bundle.
If you need a question to depend on an answer in a different bundle, restructure the policy so the two controls sit together, or use a screening rule to decide which policies are attached in the first place — see Rules Configuration.
How a journey is put together
User Journey for one policy, its versions, roles, and organisation
└── Bundle config one per control bundle
└── Dependency "this control is conditional"
└── Input "…on this parent control answering this way"
└── Input "…and on this other parent too"
A dependency can have several inputs. Every input must pass for the dependent control to show.
Fields
User journey
| Field | Type | Required | Description |
|---|---|---|---|
policyIdentifier | string | Yes | The policy this journey applies to |
policyVersions | string[] | Yes | Policy versions it covers. Use * to match any version |
roles | string[] | Yes | Roles it applies to. Use * to match any role |
orgId | string | No | The owning organisation. SYSTEM makes it available to every organisation |
bundles | BundleConfig[] | Yes | One entry per control bundle you want to add conditions to |
Bundle config
| Field | Type | Required | Description |
|---|---|---|---|
controlBundleIdentifier | string | Yes | The bundle these dependencies apply to |
controlBundleVersions | string[] | No | Restrict to particular bundle versions |
dependencies | Dependency[] | Yes | The conditional controls in this bundle |
Dependency
| Field | Type | Required | Description |
|---|---|---|---|
dependentControlIdentifier | string | Yes | The control that is shown or hidden |
inputs | Input[] | Yes | The conditions that decide it. All must pass |
Input
| Field | Type | Required | Description |
|---|---|---|---|
controlIdentifier | string | Yes | The parent control whose answer is checked. Must be in the same bundle |
answerOptionIdentifiers | string[] | Yes | Which answer options satisfy the condition. Empty means any answer will do |
isInverse | boolean | Yes | false shows the control when the condition is met; true shows it when the condition is not met |
How visibility is decided
A single condition
| Situation | Result with isInverse: false | Result with isInverse: true |
|---|---|---|
| Parent has no answer yet | Hidden | Visible |
answerOptionIdentifiers is empty, parent has any answer | Visible | Hidden |
| All listed options are selected | Visible | Hidden |
| Some but not all listed options are selected | Hidden | Visible |
Listing several answer options means all of them, not any of them. With
["opt.a", "opt.b"]the condition passes only when both are selected — which is only reachable on a multi-select control. To show a control when either answer is chosen, list the options on separate dependencies or use a single option per input.
Several conditions on one control
All inputs must pass. Any failing input hides the control.
Chained conditions
If a parent control is itself hidden, everything depending on it is hidden too, however that parent was answered earlier. Chains resolve in order, so a control can depend on a control that depends on another.
When nothing is configured
The platform fails open at every level: no journey for a policy, no configuration for a bundle, a dependency with no inputs, or a parent the bundle does not contain — in each case the control is shown. A misconfigured journey therefore shows too much rather than hiding something a team needed to answer.
Which journey applies
Several journeys can exist for the same policy. When a respondent opens an assessment, the platform picks one by scoring the candidates and taking the best. It compares, in this order:
- Organisation — a journey owned by the respondent’s organisation beats a
SYSTEMone. - Policy version — an exact version match beats
*. - Role — an exact role match beats
*.
A journey whose policyVersions does not contain the assessment’s version, or whose roles does not contain the respondent’s role, is disqualified — a wildcard is needed for it to apply broadly. If two journeys score the same, the most recently created wins. If none qualifies, no conditions are applied and every control is shown.
Prefer wildcards unless you mean to narrow. A journey listing
policyVersions: ["1.0"]stops applying the moment the policy moves to1.1, and the assessment quietly reverts to showing every control.
Configuring a journey
Journeys are managed in the User Journey tab of the System Admin dashboard.
| Scope | Who can save it |
|---|---|
| One organisation | An administrator or owner of that organisation |
SYSTEM — all organisations | The Asenion team |
Identifiers must match the policy exactly. controlIdentifier, dependentControlIdentifier and controlBundleIdentifier are the identifiers from the policy configuration, and answerOptionIdentifiers are the identifiers on the parent control’s answer options — see Policy Configuration. An identifier that does not match anything is not reported as an error; the condition simply never takes effect.
Common patterns
Show a follow-up only when a specific answer is chosen
One input, isInverse: false, one option listed. The classic “if yes, tell us more”.
Hide a question when something does not apply
One input, isInverse: true. The control is visible by default and disappears when the triggering answer is selected. Useful with a not-applicable option.
Require two things to be true
Two inputs on the same dependency, each naming a different parent control. Both must pass.
Show a control when either of two answers is chosen
Not expressible in one input, because listed options are combined with AND. Restructure the parent so the two cases share a single answer option, or split the follow-up into two controls.
Quick reference
| Aspect | Detail |
|---|---|
| Scope | Within one control bundle. Cross-bundle dependencies are ignored |
| Where | System Admin dashboard → User Journey |
| Applies to | One policy, narrowed by version, role and organisation |
| Several options in one input | Combined with AND — all must be selected |
| Several inputs on one dependency | Combined with AND — all must pass |
| Hidden parent | Everything depending on it is hidden too |
| Anything missing or unmatched | Fails open — the control is shown |
Related pages
- Conditional Form Logic — the concept, and what a respondent sees
- Policy Configuration — where control and answer option identifiers come from
- Rules Configuration — deciding which policies are attached, rather than which questions are shown
- Overview — how Assessment fits with Authoring, Testing and Runtime Governance