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.
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
| Property | Value |
|---|---|
| Entity code | INTSTEP |
| Display name | Integration Step |
| Plural | Integration Steps |
| Level | 11210 |
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
| Field | Type | Required | Notes |
|---|---|---|---|
name | text | Yes | Unique name for this step. Used by condition steps to reference branch targets. |
type | enum | Yes | Valid 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). |
enabled | boolean | Enabled. | |
breakpoint | boolean | When set, manual test runs halt after this step so you can inspect the state. Ignored in production webhook calls. |
Fetch Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
fetchConnection | enum | Which integration connection to use for this request Valid ids: integration (Primary connection), integration2 (Secondary connection). | |
fetchUrlTemplate | text | URL path appended to the connection base URL. Supports template variables e.g. /api/data/v9.2/ag_suppliers({{trigger.id}}) | |
fetchHeaders | text (multi-line) | Optional JSON object of extra headers to include in the request | |
fetchResultVar | text | Variable name to store the response data, e.g. 'supplier'. Access later as {{supplier.fieldName}} |
Validate Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
validateFields | text (multi-line) | JSON array of dot-notation field paths that must have values, e.g. ["supplier.ag_streetaddress1", "supplier.ag_city"] | |
validateFailAction | enum | Valid ids: stop (Stop execution), email (Send email and stop), continue (Continue anyway). | |
validateFailEmail | text | Subject line for failure notification. Supports {{failedField}} template variable. |
Condition Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
conditionField | text | Dot-notation path to the field, e.g. supplier.cr1e6_qbid | |
conditionOperator | enum | Valid 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). | |
conditionValue | text | Value to compare against. Supports template variables. | |
onTrueStep | stepSelect | Step to jump to when condition is true. Leave blank to continue to next step. Select 'STOP' to end execution. | |
onFalseStep | stepSelect | Step to jump to when condition is false. Leave blank to continue to next step. Select 'STOP' to end execution. |
Map Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
mapConfig | text (multi-line) | JSON object defining the output structure. Use {{variable.field}} for template values. Nested objects supported. | |
mapResultVar | text | Variable name for the mapped output, e.g. 'qbVendor' |
API Request Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
apiConnection | enum | Which integration connection to use for this request Valid ids: integration (Primary connection), integration2 (Secondary connection). | |
apiUrlTemplate | text | URL path appended to the connection base URL. Supports template variables. | |
apiBodyVar | text | Variable name containing the request body (from a previous map step), e.g. 'qbVendor' | |
apiBodyTemplate | text (multi-line) | Alternative to body variable: inline JSON template with {{var.field}} placeholders. Used if body variable is empty. | |
apiHeaders | text (multi-line) | Optional JSON object of extra headers | |
apiResultVar | text | Variable name to store the API response |
Email Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
emailTo | text | Recipient email address(es). Use {{flow.notifyEmails}} for the flow's notification list. | |
emailSubject | text | Email subject line. Supports {{variable.field}} template variables. | |
emailBody | text (multi-line) | Email body. Supports {{variable.field}} template variables. |
Slack Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
slackWebhookUrl | text | Yes | Slack incoming webhook URL (https://hooks.slack.com/services/...). The URL is channel-scoped and acts as the credential. treat as secret. |
slackChannel | text | Override channel, e.g. #alerts or @username. Best-effort. most modern Slack apps lock webhooks to the install channel and will ignore this. | |
slackTitle | text | Bold title shown above the message. Supports {{variable.field}} template variables. | |
slackColor | text | Hex colour for the attachment sidebar, e.g. #EF4444 for critical, #10B981 for success. Also accepts 'good', 'warning', 'danger'. | |
slackMessageTemplate | text (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. | |
slackWorkflowInputs | text (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
| Field | Type | Required | Notes |
|---|---|---|---|
varName | text | Name for the variable, e.g. 'newQbId' | |
varExpression | text | Template expression to evaluate, e.g. {{qbResult.Vendor.Id}} |
For Each Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
forEachArray | text | Path to the array, e.g. trigger.0.eventNotifications or qbResult.QueryResponse.Bill. Empty or missing arrays skip the loop body. | |
forEachItemVar | text | Each iteration sets this variable to the current array element, accessible via {{varName}} in downstream steps. | |
forEachIndexVar | text | If set, this variable is populated with the zero-based index of the current iteration. |
End of For Each
| Field | Type | Required | Notes |
|---|---|---|---|
forEachEndNote | text | Note. |
Date Extract Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
dateInput | text | A template expression that resolves to a date string, e.g. {{pi.ag_supplierinvoicedate}} or {{trigger.date}}. Must be parseable by JavaScript Date(). | |
dateOutputPrefix | text | Prefix for the output variables. E.g. prefix 'inv' produces invYear, invMonth, invDay, invISO, invFirstOfMonth, invLastOfMonth, invTimestamp. |
Log Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
logMessage | text (multi-line) | Templated message written to CloudWatch and the test runner. Supports {{var}} substitution. | |
logLevel | enum | Valid ids: info (Info), warn (Warning), error (Error). | |
logOutcome | enum | Outcome stamped on the LOG record. Drives the Outcome column in the SIEM view. Valid ids: unknown (Unknown), success (Success), failure (Failure). | |
logVarName | text | Name of a single context variable to attach to the log entry's raw payload (e.g. 'customer', 'qbResult'). Leave blank to attach nothing. | |
logDumpVars | boolean | Also dumps the entire variable state alongside the message. Useful for debugging. verbose. |
Lookup Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
lookupField | text | Dot-notation path to the field value, e.g. supplier.ag_paymentterms | |
lookupTable | text (multi-line) | JSON object mapping input values to output values. Case-insensitive matching. | |
lookupDefault | text | Value to use if no match found. Supports template variables. | |
lookupFailAction | enum | Valid ids: continue (Continue with default), stop (Stop execution). | |
lookupResultVar | text | Variable name for the lookup result |
Create DemandFlow object
| Field | Type | Required | Notes |
|---|---|---|---|
dfEntity | text | Yes | UPPERCASE entity code. The record's level is resolved from the definition automatically. |
dfComboKey | text | Must end with |ENT:. the new record's ID is appended by the POST Lambda. Supports template variables. Defaults to 'SUB:{{subscriptionId}}|ENT:' if empty. | |
dfFields | text (multi-line) | Yes | JSON object of fields to set on the new record. Supports template variables for string values. |
dfResultVar | text | Variable name to store the created record's ID in, for use by later steps. | |
dfResponseVar | text | Optional variable name to store the full created record (including ref, timestamps). |
Patch DemandFlow object
| Field | Type | Required | Notes |
|---|---|---|---|
dfEntity | text | Yes | UPPERCASE entity code of the record you're patching. |
dfObjectId | text | Yes | The record's UUID. Usually a template variable. from the trigger, an earlier lookup, or a dfCreate result. |
dfFields | text (multi-line) | Yes | JSON object containing only the fields to update. Unlisted fields are left untouched. Supports template variables. |
Delete DemandFlow object
| Field | Type | Required | Notes |
|---|---|---|---|
dfEntity | text | Yes | UPPERCASE entity code of the record to delete. |
dfObjectId | text | Yes | The 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
| Field | Type | Required | Notes |
|---|---|---|---|
dfLookupEntity | text | Yes | UPPERCASE entity code of the record to find. |
dfLookupField | text | Yes | Name of the field on the record to compare against. |
dfLookupValue | text | Yes | Value to compare against. Supports template variables. |
dfLookupComboKeyPrefix | text | Restrict the search to records under this comboKey prefix. Defaults to the subscription scope. | |
dfLookupResultVar | text | Variable name to store the matched record's ID. Empty string if not found. | |
dfLookupResponseVar | text | Optional variable to store the full matched record. Empty object if not found. | |
dfLookupFailAction | enum | Valid ids: continue (Continue (vars are empty)), stop (Stop execution). |
Lookup or Create Configuration
| Field | Type | Required | Notes |
|---|---|---|---|
locConnection | enum | Valid ids: integration (Primary connection), integration2 (Secondary connection). | |
locQueryUrl | text | URL to query for existing record. Supports template variables. | |
locQueryResultPath | text | Dot-notation path to the ID in the query response, e.g. QueryResponse.Class.0.Id | |
locCreateUrl | text | URL to POST to if record not found | |
locCreateBody | text (multi-line) | JSON body to POST when creating. Supports template variables. | |
locCreateResultPath | text | Dot-notation path to the ID in the create response, e.g. Class.Id | |
locResultVar | text | Variable name for the record ID (found or created) | |
locCreateResponseVar | text | Optional variable for the full create response object | |
locHeaders | text (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
| Field | Type | Required | Notes |
|---|---|---|---|
fileDownloadConnection | enum | Valid ids: integration (Primary connection), integration2 (Secondary connection). | |
fileDownloadUrl | text | URL path to download the file from. Supports template variables. | |
fileUploadConnection | enum | Valid ids: integration (Primary connection), integration2 (Secondary connection). | |
fileUploadUrl | text | URL path to upload the file to | |
fileFileName | text | Name for the uploaded file. Supports template variables. | |
fileContentType | text | MIME type of the file | |
fileEntityRef | text (multi-line) | Optional JSON linking the file to an entity, e.g. {"type":"Invoice","id":"{{qbInvoiceId}}"} | |
fileUploadHeaders | text (multi-line) | Extra headers merged on top of the upload connection's defaults for the upload POST call. Supports template variables. | |
fileResultVar | text | Variable 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>