Start a FlowX process from an external HTTP POST, or resume a running process instance and inject the POST payload into it. Secured with API keys, event-driven, no polling.
A webhook is an HTTP endpoint that an external system calls to notify FlowX when an event happens. Instead of FlowX polling for updates, the third-party system sends an HTTP POST the moment something occurs β and FlowX starts a process in response. Common uses include receiving events from payment processors, CRMs, ERPs, or CI/CD pipelines.
Incoming Webhooks allow external systems to trigger FlowX processes by sending HTTP POST requests to a generated URL. Each webhook gets a unique, cryptographically secure API key for authentication β no IMAP setup, no polling, just a direct HTTP call.Use webhooks when you need to:
Receive events from third-party platforms (payment processors, CRMs, ERPs) that support outbound webhooks
Trigger processes from CI/CD pipelines or internal tools via simple HTTP calls
Replace polling-based integrations with event-driven process starts
API key authentication
Each webhook gets a unique, secure API key included in the URL
JSON payload forwarding
Webhook body and HTTP headers are forwarded to the process instance as variables
Manage Triggers UI
Activate, deactivate, and manage webhook URLs from Runtime Settings
Zero configuration
No server settings needed β create the data source, connect to a process, activate
A webhook does one of two things, depending on the Webhook Behavior you choose when you create the data source.
Start a process
Resume a waiting process
Each POST creates a new process instance.
1
Create an Incoming Webhook data source
In Integration Designer, create a new data source and select Incoming Webhook. Provide a name and optional description, and leave Webhook Behavior on Start a Process/Workflow. No connection settings are required.
2
Connect to a Message Start Event
In your process definition, add a Message Start Event node. Set the Trigger Type to Incoming Webhook and select your webhook data source.
3
Commit and activate
Commit the version, then go to Runtime β Manage Triggers. The webhook appears as Deactivated. Click the action menu and select Activate.
4
Get the webhook URL
From the triggerβs action menu, select Get URL. Copy the generated URL (includes the API key as a query parameter) and configure it in your external system.
5
External system sends POST request
When the external system POSTs JSON to the webhook URL, the webhook-gateway service validates the API key, publishes the event to Kafka, and the process engine starts a new process instance.
Each POST resumes an already-running instance and hands it the payload. Use this to push data into a process in flight β for example, sending updated credit data into a loan application that is parked waiting on an external system.
1
Create an Incoming Webhook data source
In Integration Designer, create a new data source and select Incoming Webhook. Set Webhook Behavior to Resume a Waiting Process, then set Webhook Correlation Key to the path in the incoming payload that identifies the instance to resume (for example, application.applicationId).
2
Connect to a Message Catch Intermediate Event
In your process definition, add a Webhook Trigger message catch event where the process should pause. Select the webhook as its Data Source, then set Process Correlation Key to the matching process variable and Process Key to where the incoming data should land.
3
Commit and activate
Commit the version, then activate the webhook in Runtime β Manage Triggers, exactly as for a start webhook.
4
Get the webhook URL
From the triggerβs action menu, select Get URL and configure that URL in your external system.
5
External system sends POST request
When the external system POSTs JSON, webhook-gateway validates the API key, reads the correlation value at the Webhook Correlation Key path, and publishes a message event. The process engine matches it against instances waiting on that catch event and resumes the one whose Process Correlation Key holds the same value, storing the incoming data at the Process Key.
If no waiting instance matches the correlation value, or the correlation path does not resolve in the payload, the request is rejected and nothing is resumed. See Error handling.
Go to Integrations β Data Sources in your project.
2
Add a new data source
Click + and select Incoming Webhook as the data source type.
3
Configure basic information
Field
Required
Description
Name
Yes
A unique name for the webhook (3β50 characters, letters, numbers, [] () . _ -)
Description
No
Purpose or context for this webhook
Webhook Behavior
Yes
Whether each POST starts a new process or resumes a waiting one. See Webhook Behavior.
Webhook Correlation Key
Only for Resume a Waiting Process
Dotted path into the incoming payload whose value identifies which waiting process instance to resume. See Webhook Correlation Key path syntax.
4
Create
Click Create. The webhook data source is ready to be connected to a process.
Incoming Webhooks accept POST requests with JSON payloads (max 1 MB). No connection settings, credentials, or polling configuration is needed.
When deleting a webhook data source, deactivate it first and remove the URL from any third-party systems that use it. Deleting the webhook in FlowX does not notify external systems β they will continue sending requests that return errors.
On the webhook data sourceβs Settings tab, Webhook Behavior offers two options:
Option
What it does
Attach the webhook to
Start a Process/Workflow
Creates a new process or workflow instance on each POST, with the webhook payload as its input.
A Message Start Event node
Resume a Waiting Process
Resumes a process instance already waiting on a catch event, using a correlation key.
A Message Catch Intermediate Event node
Selecting Resume a Waiting Process enables Webhook Correlation Key in the Process Connection panel and marks it required. It is the dotted path into the incoming payload whose value identifies the instance to resume, and it is defined once on the data source rather than per node. Under Start a Process/Workflow the field is greyed out, and saving a value there is rejected.
Webhook Behavior is immutable after the first save. Once the webhook data source has been saved, the setting is locked in the Designer and the API rejects a change to it. To switch a webhook between starting and resuming, create a new webhook data source.
Use a webhook on an intermediate catch event to resume a process instance that is waiting for an external signal β for example, a callback from a third-party document scanner, a downstream system confirming an enqueued job, or a manual operator action delivered over HTTP.
1
Add a Webhook Trigger intermediate catch event
From the node palette, drag a Webhook Trigger message catch event onto the canvas at the point where the process should pause.
2
Select the webhook data source
In the node configuration panel, set the Data Source dropdown to the webhook that drives this catch event. The Webhook Correlation Key field appears as read-only and shows the correlation key defined on the webhook itself β included here so you can see how incoming requests are matched.
3
Set the Process Correlation Key
Set Process Correlation Key to a business or process variable from the data model (for example, applicationId, orderId). At runtime this value is matched against the incoming payload to identify which waiting process instance to resume.
4
Set the Process Key
Set Process Key to the data-model path where the incoming webhook data should be stored when the catch fires. The value stored there is the same { dateTime, payload, headers } envelope described in Webhook payload, not the bare POST body β read the request body from payload underneath it.
5
Save the node
Click Save to persist the configuration.
The same webhook data source can drive multiple intermediate catch events as long as the Process Correlation Key disambiguates which instance to resume. Without a valid correlation match, the inbound request is rejected.
The Webhook Correlation Key points into the incoming webhook payload. It uses dotted-path notation and supports array indices in square brackets, so deeply nested provider payloads can be addressed directly.
Path pattern
Resolves to
application.applicationId
payload.application.applicationId
entry[0].changes[0].value.messages[0].text.body
The first inbound text-message body in a Meta WhatsApp webhook payload
data.orders[2].id
The id of the third element of the orders array
Array index syntax (field[N]) is supported in correlation keys, so the canonical Meta WhatsApp resume path works as-is. Paths like entry[0]... resolve directly and no longer need to be flattened in the producer before posting.
If the path does not resolve in an incoming request (missing field, index out of bounds, null leaf), the request is rejected and the waiting process instance is not resumed.
The webhook must be connected to a node that can carry a webhook trigger β a Message Start Event or a Message Catch Intermediate Event
The version must be committed
Navigate to Runtime β Manage Triggers to view and control webhooks:
Column
Description
State
Active or Deactivated
Trigger Type
Webhook
Event Name
The webhook data source name
Location
Project and branch information
Use the action menu (three-dot icon) to:
Activate β Start accepting webhook requests
Deactivate β Stop accepting requests. The API key and URL are preserved, so you can reactivate later without reconfiguring external systems.
Get URL β View and copy the webhook URL with API key
A single webhook can trigger multiple processes β add the same webhook data source to Message Start Event nodes in different process definitions. Each incoming request starts all connected processes.
When a webhook is created in the Integration Designer, the Settings tab now exposes:
Provider β the dropdown offers three options. Like Webhook Behavior, the provider is a one-time selection: once saved it becomes immutable, and you create a new webhook to switch.
Dropdown label
API value
Signature validation
Generic (API Key Only)
GENERIC
None
Slack
SLACK
X-Slack-Signature HMAC-SHA256
Meta (WhatsApp, Messenger, Instagram, Threads)
META
X-Hub-Signature-256 HMAC-SHA256
Provider secret β the signing secret(s) obtained from the provider. Stored encrypted; can be rotated independently of the API key. The field is labelled per provider and only appears once a provider that needs it is selected: Signing Secret for Slack, Verify token plus App secret for Meta. Generic (API Key Only) has no secret field.
For SaaS-hosted secrets you can also reference a config parameter using the ${configParam.name} placeholder syntax β placeholders are resolved at registration time the same way LLM provider secrets are.
The default. No signature validation is performed; authentication relies on the FlowX flowxApiKey and HTTPS. Use GENERIC for systems that do not sign their webhooks, or where signature validation is handled inside the process via a business-rule action on the raw headers.
Performs Slackβs standard signature check on every incoming request:
Header
Purpose
X-Slack-Signature
HMAC-SHA256 signature of the version, timestamp, and raw body, prefixed with v0=.
X-Slack-Request-Timestamp
Unix timestamp; rejected if more than 5 minutes out of skew.
Requests that fail signature verification, that miss either header, or that arrive without a configured signing secret are rejected with 401 Unauthorized.Slackβs URL-verification handshake is handled automatically β a url_verification POST with a challenge field receives the challenge value back as JSON, before the request is forwarded to the process. No process configuration is required for the handshake.Selecting Slack adds a required Signing Secret field to the Settings tab. Find the value in your Slack app under Basic Information β App Credentials β Signing Secret. You can paste it directly or reference a config parameter.
Covers WhatsApp, Messenger, Instagram, and Threads. Meta-platform integrations share a common subscription model and signature scheme; the META adapter handles both.Meta webhooks require two secrets, configured as masked inputs in the Settings panel:
Field
Purpose
Where to find it
Verify token
Used during the GET URL-verification handshake.
Any random string you choose. Paste the same value in Meta β Webhooks β Verify token.
App secret
Verifies the X-Hub-Signature-256 HMAC on every POST.
Meta Developer Dashboard β your App β Settings β Basic β App Secret.
Both values are stored together as a JSON-packed pair in the existing webhook secret field, encrypted at rest. Both are required; saving without either returns WEBHOOK_META_SECRETS_REQUIRED 400.
GET URL verification. Meta sends a GET request with hub.mode=subscribe, hub.verify_token, and hub.challenge query parameters when you save the webhook in the Meta App configuration. The gateway:
Confirms hub.mode=subscribe.
Confirms hub.challenge is present.
Compares the received hub.verify_token to the configured Verify token using a constant-time check.
Echoes the hub.challenge value back as plain text on success.
A mismatch or missing parameter returns 403 Forbidden β Meta does not finalise the subscription.POST signature verification. Every POST is signed by Meta with an X-Hub-Signature-256 header (sha256=<hex>). The gateway recomputes the HMAC-SHA256 of the raw body with the configured App secret and rejects mismatches with 401 Unauthorized.
If a request hits the URL for one provider but the webhook registration is configured with a different provider, the gateway returns 400 Bad Request. Always use the URL shown in the Get URL modal β it carries the correct provider segment for the registration.
Ingestion time at FlowX β when webhook-gateway received the request. If the provider includes its own event timestamp in the payload, use that for the original event time.
payload
object or string
The POST request body (parsed as JSON if valid, raw string otherwise)
headers
object
All HTTP headers from the incoming request. Each header maps to an array of values β access the first value with webhookMessage.headers.Content-Type[0] in process variables
headers includes values added by the FlowX ingress in addition to what the caller sent β typically X-Forwarded-For, X-Real-IP, X-Request-ID, X-Forwarded-Host, X-Forwarded-Proto. These are useful for logging and tracing but should not be confused with provider-supplied headers.
The maximum payload size is 1 MB. Requests exceeding this limit are rejected.
Each webhook registration gets a unique 32-byte, base64-URL-encoded API key
The key is passed as the flowxApiKey query parameter in the webhook URL
Validation uses constant-time comparison to prevent timing attacks
Invalid or missing keys return 401 Unauthorized
Inactive webhooks return 404 Not Found
FlowX validates provider signatures only for providers with a built-in adapter. For the GENERIC provider β and for any third-party signature scheme without a dedicated adapter (Stripe-Signature, GitHubβs X-Hub-Signature-256 outside the Meta family, etc.) β signature headers are forwarded to the process in webhookMessage.headers but no validation is performed. Authentication for GENERIC registrations relies on the FlowX API key and HTTPS. The raw request body is not preserved after JSON parsing, which makes in-process HMAC verification impractical β for unsupported providers, design integrations assuming API key + HTTPS is the only authentication layer, or request a built-in adapter.