DemandFlow Support Centre

INTSTEP: Integration Step

ReferenceEntity Reference16/04/2026Updated 16/04/2026
A step in an integration flow pipeline. Each step has a type (fetch, validate, condition, map, externalPost, externalPatch, email, setVariable) with type-specific configuration fields shown via visibility conditions.

INTSTEP: Integration Step

A step in an integration flow pipeline. Each step has a type (fetch, validate, condition, map, externalPost, externalPatch, email, setVariable) with type-specific configuration fields shown via visibility conditions.

Default definition. This article describes the default INTSTEP definition shipped with DemandFlow. Administrators can add, remove, rename, or re-type fields, change which ones are required, and alter the layout from the Definitions screen in Settings. Your tenant's current schema may differ from what is shown here. To read the current definition at any time, GET the DEFINITION object whose id matches INTSTEP.

Entity properties

PropertyValue
Entity codeINTSTEP
Display nameIntegration Step
PluralIntegration Steps
Level11210

Use cases

Child entity of INTFLOW. Steps are stored as an embedded array on the INTFLOW object's 'steps' property. The intsteparray row type displays them in a grid and opens this definition in a popout editor on click.

Fields

Step

FieldTypeRequiredNotes
nametextYesUnique name for this step. Used by condition steps to reference branch targets.
typeenumYesValid ids: fetch (Fetch external data), validate (Validate fields), condition (Conditional branch), map (Map fields), externalPost (POST to external API), externalPatch (PATCH external API), dfCreate (Create DemandFlow object), dfPatch (Patch DemandFlow object), dfDelete (Delete DemandFlow object), dfLookup (Look up DemandFlow object), email (Send notification), slack (Post to Slack), setVariable (Set variable), lookup (Lookup table), lookupOrCreate (Lookup or create), fileUpload (File upload), date (Date extract), forEach (For each (loop start)), forEachEnd (End of for each), log (DemandFlow log), stop (Stop execution).
enabledbooleanEnabled.
breakpointbooleanWhen set, manual test runs halt after this step so you can inspect the state. Ignored in production webhook calls.

Fetch Configuration

FieldTypeRequiredNotes
fetchConnectionenumWhich integration connection to use for this request Valid ids: integration (Primary connection), integration2 (Secondary connection).
fetchUrlTemplatetextURL path appended to the connection base URL. Supports template variables e.g. /api/data/v9.2/ag_suppliers({{trigger.id}})
fetchHeaderstext (multi-line)Optional JSON object of extra headers to include in the request
fetchResultVartextVariable name to store the response data, e.g. 'supplier'. Access later as {{supplier.fieldName}}

Validate Configuration

FieldTypeRequiredNotes
validateFieldstext (multi-line)JSON array of dot-notation field paths that must have values, e.g. ["supplier.ag_streetaddress1", "supplier.ag_city"]
validateFailActionenumValid ids: stop (Stop execution), email (Send email and stop), continue (Continue anyway).
validateFailEmailtextSubject line for failure notification. Supports {{failedField}} template variable.

Condition Configuration

FieldTypeRequiredNotes
conditionFieldtextDot-notation path to the field, e.g. supplier.cr1e6_qbid
conditionOperatorenumValid ids: hasValue (Has a value (not null/empty)), isEmpty (Is empty (null/empty)), equals (Equals), notEquals (Does not equal), greaterThan (Greater than), lessThan (Less than), contains (Contains), startsWith (Starts with).
conditionValuetextValue to compare against. Supports template variables.
onTrueStepstepSelectStep to jump to when condition is true. Leave blank to continue to next step. Select 'STOP' to end execution.
onFalseStepstepSelectStep to jump to when condition is false. Leave blank to continue to next step. Select 'STOP' to end execution.

Map Configuration

FieldTypeRequiredNotes
mapConfigtext (multi-line)JSON object defining the output structure. Use {{variable.field}} for template values. Nested objects supported.
mapResultVartextVariable name for the mapped output, e.g. 'qbVendor'

API Request Configuration

FieldTypeRequiredNotes
apiConnectionenumWhich integration connection to use for this request Valid ids: integration (Primary connection), integration2 (Secondary connection).
apiUrlTemplatetextURL path appended to the connection base URL. Supports template variables.
apiBodyVartextVariable name containing the request body (from a previous map step), e.g. 'qbVendor'
apiBodyTemplatetext (multi-line)Alternative to body variable: inline JSON template with {{var.field}} placeholders. Used if body variable is empty.
apiHeaderstext (multi-line)Optional JSON object of extra headers
apiResultVartextVariable name to store the API response

Email Configuration

FieldTypeRequiredNotes
emailTotextRecipient email address(es). Use {{flow.notifyEmails}} for the flow's notification list.
emailSubjecttextEmail subject line. Supports {{variable.field}} template variables.
emailBodytext (multi-line)Email body. Supports {{variable.field}} template variables.

Slack Configuration

FieldTypeRequiredNotes
slackWebhookUrltextYesSlack incoming webhook URL (https://hooks.slack.com/services/...). The URL is channel-scoped and acts as the credential. treat as secret.
slackChanneltextOverride channel, e.g. #alerts or @username. Best-effort. most modern Slack apps lock webhooks to the install channel and will ignore this.
slackTitletextBold title shown above the message. Supports {{variable.field}} template variables.
slackColortextHex colour for the attachment sidebar, e.g. #EF4444 for critical, #10B981 for success. Also accepts 'good', 'warning', 'danger'.
slackMessageTemplatetext (multi-line)Used when the webhook URL is a classic Incoming Webhook (/services/...). Supports {{variable.field}} template variables and Slack mrkdwn: *bold*, _italic_, `code`, <url|text>. Ignored for Workflow Builder triggers.
slackWorkflowInputstext (multi-line)Used when the webhook URL is a Slack Workflow Builder trigger (/triggers/...). Keys must match the workflow's declared variable names exactly. Values support {{variable.field}} template substitution. Ignored for Incoming Webhooks.

Set Variable Configuration

FieldTypeRequiredNotes
varNametextName for the variable, e.g. 'newQbId'
varExpressiontextTemplate expression to evaluate, e.g. {{qbResult.Vendor.Id}}

For Each Configuration

FieldTypeRequiredNotes
forEachArraytextPath to the array, e.g. trigger.0.eventNotifications or qbResult.QueryResponse.Bill. Empty or missing arrays skip the loop body.
forEachItemVartextEach iteration sets this variable to the current array element, accessible via {{varName}} in downstream steps.
forEachIndexVartextIf set, this variable is populated with the zero-based index of the current iteration.

End of For Each

FieldTypeRequiredNotes
forEachEndNotetextNote.

Date Extract Configuration

FieldTypeRequiredNotes
dateInputtextA template expression that resolves to a date string, e.g. {{pi.ag_supplierinvoicedate}} or {{trigger.date}}. Must be parseable by JavaScript Date().
dateOutputPrefixtextPrefix for the output variables. E.g. prefix 'inv' produces invYear, invMonth, invDay, invISO, invFirstOfMonth, invLastOfMonth, invTimestamp.

Log Configuration

FieldTypeRequiredNotes
logMessagetext (multi-line)Templated message written to CloudWatch and the test runner. Supports {{var}} substitution.
logLevelenumValid ids: info (Info), warn (Warning), error (Error).
logOutcomeenumOutcome stamped on the LOG record. Drives the Outcome column in the SIEM view. Valid ids: unknown (Unknown), success (Success), failure (Failure).
logVarNametextName of a single context variable to attach to the log entry's raw payload (e.g. 'customer', 'qbResult'). Leave blank to attach nothing.
logDumpVarsbooleanAlso dumps the entire variable state alongside the message. Useful for debugging. verbose.

Lookup Configuration

FieldTypeRequiredNotes
lookupFieldtextDot-notation path to the field value, e.g. supplier.ag_paymentterms
lookupTabletext (multi-line)JSON object mapping input values to output values. Case-insensitive matching.
lookupDefaulttextValue to use if no match found. Supports template variables.
lookupFailActionenumValid ids: continue (Continue with default), stop (Stop execution).
lookupResultVartextVariable name for the lookup result

Create DemandFlow object

FieldTypeRequiredNotes
dfEntitytextYesUPPERCASE entity code. The record's level is resolved from the definition automatically.
dfComboKeytextMust end with |ENT:. the new record's ID is appended by the POST Lambda. Supports template variables. Defaults to 'SUB:{{subscriptionId}}|ENT:' if empty.
dfFieldstext (multi-line)YesJSON object of fields to set on the new record. Supports template variables for string values.
dfResultVartextVariable name to store the created record's ID in, for use by later steps.
dfResponseVartextOptional variable name to store the full created record (including ref, timestamps).

Patch DemandFlow object

FieldTypeRequiredNotes
dfEntitytextYesUPPERCASE entity code of the record you're patching.
dfObjectIdtextYesThe record's UUID. Usually a template variable. from the trigger, an earlier lookup, or a dfCreate result.
dfFieldstext (multi-line)YesJSON object containing only the fields to update. Unlisted fields are left untouched. Supports template variables.

Delete DemandFlow object

FieldTypeRequiredNotes
dfEntitytextYesUPPERCASE entity code of the record to delete.
dfObjectIdtextYesThe record's UUID. Usually a template variable from the trigger or an earlier step. Delete is permanent. consider a soft-delete status patch instead for records with history.

DemandFlow Lookup Configuration

FieldTypeRequiredNotes
dfLookupEntitytextYesUPPERCASE entity code of the record to find.
dfLookupFieldtextYesName of the field on the record to compare against.
dfLookupValuetextYesValue to compare against. Supports template variables.
dfLookupComboKeyPrefixtextRestrict the search to records under this comboKey prefix. Defaults to the subscription scope.
dfLookupResultVartextVariable name to store the matched record's ID. Empty string if not found.
dfLookupResponseVartextOptional variable to store the full matched record. Empty object if not found.
dfLookupFailActionenumValid ids: continue (Continue (vars are empty)), stop (Stop execution).

Lookup or Create Configuration

FieldTypeRequiredNotes
locConnectionenumValid ids: integration (Primary connection), integration2 (Secondary connection).
locQueryUrltextURL to query for existing record. Supports template variables.
locQueryResultPathtextDot-notation path to the ID in the query response, e.g. QueryResponse.Class.0.Id
locCreateUrltextURL to POST to if record not found
locCreateBodytext (multi-line)JSON body to POST when creating. Supports template variables.
locCreateResultPathtextDot-notation path to the ID in the create response, e.g. Class.Id
locResultVartextVariable name for the record ID (found or created)
locCreateResponseVartextOptional variable for the full create response object
locHeaderstext (multi-line)Extra headers merged on top of the connection's defaults. Applied to BOTH the query and the create call. Supports template variables.

File Upload Configuration

FieldTypeRequiredNotes
fileDownloadConnectionenumValid ids: integration (Primary connection), integration2 (Secondary connection).
fileDownloadUrltextURL path to download the file from. Supports template variables.
fileUploadConnectionenumValid ids: integration (Primary connection), integration2 (Secondary connection).
fileUploadUrltextURL path to upload the file to
fileFileNametextName for the uploaded file. Supports template variables.
fileContentTypetextMIME type of the file
fileEntityReftext (multi-line)Optional JSON linking the file to an entity, e.g. {"type":"Invoice","id":"{{qbInvoiceId}}"}
fileUploadHeaderstext (multi-line)Extra headers merged on top of the upload connection's defaults for the upload POST call. Supports template variables.
fileResultVartextVariable name for the upload response

Relationships

  • No declared relationships in the default definition.

Creating a Integration Step via the API

POST /v1/objects
Authorization: Bearer <your-pat>
Content-Type: application/json

{
  "entity":   "INTSTEP",
  "level":    11210,
  "comboKey": "SUB:<your-sub-id>|ENT:",
  "name": "Example",
  "type": "fetch",
  "slackWebhookUrl": "...",
  "dfEntity": "..."
}

Listing Integration Steps

# All records in your tenant
GET /v1/entities/INTSTEP/SUB:<your-sub-id>

See also

intstepintegrationstepstepsintegrationsteps

Was this article helpful?

← Back to Knowledge Base