Skip to main content
Version: 4.7.0

FlowStage

Declares a named stage for tracking Flow execution progress. Stages are defined in the Flow config stages property using FlowStage() and activated in the flow body using wfa.stage().

Signature

FlowStage(config)

Parameters

config

FlowStageConfig

Stage configuration — label, value, optional duration, visibility, and custom state labels.

Properties:

PropertyTypeRequiredDefaultDescription
labelstringYesDisplay name shown in the stage tracker
valuestringYesUnique identifier (must match the property key name)
durationDuration({...})NoZero durationExpected stage duration
alwaysShowbooleanNofalseWhether stage appears in tracker even when not reached
states{ [key]: string }No{}Custom labels for stage states

Available State Keys

pending, inProgress, complete, error, skipped — all optional, each maps to a display label string.

Activating Stages

Use wfa.stage() inside the flow body to mark the beginning of a stage. All subsequent actions belong to that stage until the next wfa.stage() call.

wfa.stage(params.stages.<key>)
ParameterDescription
params.stages.<key>Reference to a stage declared in the flow config stages object. The key must match a declared stage.

Examples

Basic Flow with Stages

import { Flow, FlowStage, wfa, trigger, action } from '@servicenow/sdk/automation'

export const incidentHandler = Flow(
{
$id: Now.ID['incident_flow'],
name: 'Incident Handler',
stages: {
triage: FlowStage({
label: 'Triage',
value: 'triage',
}),
resolution: FlowStage({
label: 'Resolution',
value: 'resolution',
}),
},
},
wfa.trigger(trigger.record.created, { $id: Now.ID['trigger_1'] }, {
table: 'incident',
condition: '',
run_on_extended: 'false',
run_flow_in: 'background',
run_when_user_list: [],
run_when_setting: 'both',
run_when_user_setting: 'any',
}),
(params) => {
wfa.stage(params.stages.triage)

wfa.action(action.core.log, { $id: Now.ID['log_triage'] }, {
log_level: 'info',
log_message: 'Triaging incident',
})

wfa.stage(params.stages.resolution)

wfa.action(action.core.log, { $id: Now.ID['log_resolve'] }, {
log_level: 'info',
log_message: 'Resolving incident',
})
}
)

Full Config — Duration, alwaysShow, and Custom States

import { Flow, FlowStage, wfa, trigger, action } from '@servicenow/sdk/automation'

export const approvalFlow = Flow(
{
$id: Now.ID['approval_flow'],
name: 'Approval Flow',
stages: {
approval: FlowStage({
label: 'Approval',
value: 'approval',
duration: Duration({ days: 1 }),
alwaysShow: true,
states: {
pending: 'Not Yet Requested',
inProgress: 'Waiting for Approval',
complete: 'Approved',
error: 'Rejected',
skipped: 'Approval Skipped',
},
}),
},
},
wfa.trigger(trigger.record.created, { $id: Now.ID['trigger_1'] }, {
table: 'incident',
condition: '',
run_on_extended: 'false',
run_flow_in: 'background',
run_when_user_list: [],
run_when_setting: 'both',
run_when_user_setting: 'any',
}),
(params) => {
wfa.stage(params.stages.approval)

wfa.action(action.core.log, { $id: Now.ID['log_approval'] }, {
log_level: 'info',
log_message: 'Approval stage active',
})
}
)

For comprehensive examples, rules, constraints, and best practices, see the Flow Stages Guide.