Skip to main content
Version: Latest (4.6.0)

Flow

Flow(config, triggerInstance, body)

Creates a Flow record (sys_hub_flow) that defines a series of actions to execute when triggered.

Parameters

config

FlowDefinition<Record<string, FlowValueType>>

Flow configuration — name, description, priority, variables, and protection settings.

Properties:

  • $id (required): string | number | ExplicitKey<string>

  • name (required): string

  • description (optional): string

  • flowPriority (optional): 'LOW' | 'MEDIUM' | 'HIGH'

  • flowVariables (optional): Record<string, FlowValueType>

  • protection (optional): '' | 'read'

  • runAs (optional): 'user' | 'system'

  • runWithRoles (optional): (string | Role)[]

triggerInstance

undefined | ReturnType<TriggerInstance>

The trigger that starts this flow, created by calling wfa.trigger.

body (optional)

(params: FlowBodyParams<ReturnType<TriggerInstance>, OutputsWithDotwalk<Record<string, FlowValueType>>>) => void

The flow body function. Receives params containing trigger (the trigger outputs) and flowVariables (any flow-level variables declared in config).

Function Parameters:

  • params: FlowBodyParams<F, OutputsWithDotwalk<V>>
    • flowVariables: Record<string, FlowValueType>

    • trigger: I

Examples

Record Trigger Flow

Fires an event when an incident is created, demonstrating trigger.record.created, wfa.action, and wfa.dataPill.

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

export const testFireEvent = Flow(
{
$id: Now.ID['test_fire_event_flow'],
name: 'Test Fire Event',
description: 'Tests the fireEvent core action',
},
wfa.trigger(
trigger.record.created,
{ $id: Now.ID['test_fire_event_trigger'] },
{
table: 'incident',
condition: 'active=true',
run_flow_in: 'background',
}
),
(params) => {
wfa.action(
action.core.fireEvent,
{ $id: Now.ID['test_fire_event_action'] },
{
event_name: 'custom.incident.created',
table: 'incident',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
parm1: 'Test parameter 1',
parm2: 'Test parameter 2',
}
)

wfa.action(
action.core.log,
{ $id: Now.ID['test_fire_event_log'] },
{
log_level: 'info',
log_message: 'no output',
}
)
}
)

Scheduled Trigger Flow

Sends an approval notification when a change request is approved, using trigger.record.updated and wfa.dataPill to reference trigger outputs.

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

export const changeRequestApprovalNotificationFlow = Flow(
{
$id: Now.ID['change_request_approval_notification_flow'],
name: 'Change Request Approval Notification Flow',
description: 'Sends notification to requester when change request is approved',
},
wfa.trigger(
trigger.record.updated,
{ $id: Now.ID['change_request_approved_trigger'] },
{
table: 'change_request',
condition: 'approval=approved',
run_flow_in: 'background',
trigger_strategy: 'unique_changes',
}
),
(params) => {
const requester = wfa.action(
action.core.lookUpRecord,
{ $id: Now.ID['lookup_requester_details'] },
{
table: 'sys_user',
conditions: `sys_id=${wfa.dataPill(params.trigger.current.requested_by, 'reference')}`,
sort_type: 'sort_asc',
if_multiple_records_are_found_action: 'use_first_record',
}
)

wfa.action(
action.core.sendEmail,
{ $id: Now.ID['send_approval_notification_email'] },
{
table_name: 'change_request',
ah_subject: `Change Request ${wfa.dataPill(params.trigger.current.number, 'string')} - Approved`,
ah_body: 'Your change request has been approved.',
record: wfa.dataPill(params.trigger.current.sys_id, 'reference'),
ah_to: wfa.dataPill(requester.Record.email, 'string'),
}
)
}
)

Service Catalog Trigger Flow

Demonstrates trigger.application.serviceCatalog with flow variables, getCatalogVariables, and conditional logic.

import { Flow, wfa, action, trigger } from '@servicenow/sdk/automation'
import { CatalogItem, EmailVariable, SingleLineTextVariable, StringColumn } from '@servicenow/sdk/core'

const myCatalogItem = CatalogItem({
$id: Now.ID['my_catalog_item'],
flow: Now.ref('sys_hub_flow', 'my_catalog_flow'),
name: 'My Catalog Item',
shortDescription: 'Example catalog item',
variables: {
email: EmailVariable({ question: 'Email', order: 100 }),
notes: SingleLineTextVariable({ question: 'Notes', order: 200 }),
},
})

Flow(
{
$id: Now.ID['my_catalog_flow'],
name: 'Service Catalog Flow',
flowVariables: {
approverUser: StringColumn({ label: 'Approver', mandatory: true }),
},
},
wfa.trigger(
trigger.application.serviceCatalog,
{ $id: Now.ID['my_catalog_trigger'] },
{ run_flow_in: 'background' }
),
(params) => {
const catVars = wfa.action(
action.core.getCatalogVariables,
{ $id: Now.ID['get_cat_vars'] },
{
requested_item: `${wfa.dataPill(params.trigger.request_item, 'reference')}`,
template_catalog_item: `${myCatalogItem}`,
catalog_variables: [myCatalogItem.variables.email, myCatalogItem.variables.notes],
}
)

wfa.action(
action.core.log,
{ $id: Now.ID['log_cat_vars'] },
{
log_level: 'info',
log_message: `Email: ${wfa.dataPill(catVars.email, 'email')}`,
}
)
}
)

For comprehensive flow patterns including approval workflows, iterative processing, SLA escalation, inbound email handling, and complex flow logic, see the wfa-flow-guide and wfa-flow-actions-guide topics. TemplateValue() and Duration() are global helpers documented in the data-helpers-guide topic.