Skip to main content

Overview

An inbound workflow webhook lets external systems (your backend, Zapier, Make, custom scripts) POST data into OrbitForms and run a specific workflow — without using the public form embed.
Inbound webhooks are always tied to a Form trigger. You must select a form on the workflow trigger first; the webhook accepts data in the exact same structure as that form’s fields.
The form defines the payload contract. The accepted fields, their types, and which ones are required come directly from the selected form’s current fields. If you add, rename, or remove fields on the form, the webhook’s expected payload changes immediately — update your sending system to match, or requests will start failing with 422 errors.

What happens when data arrives

  1. OrbitForms validates the HMAC signature and payload structure
  2. A form submission is created (visible in your submissions list)
  3. Only that workflow runs — other form integrations (outbound webhooks, Slack, Zapier, etc.) are not triggered

Setup: from form to first request

An inbound webhook always belongs to a workflow whose trigger is a form. The form defines the payload contract, the workflow defines what happens when data arrives. Setting one up is a three-part flow: build a form → wire up the workflow → send matching data.

Step 1 — Create the form

Before you can enable an inbound webhook, you need a form whose fields describe the data you’ll send:
  1. Go to Forms and create a new form
  2. Add a field for every piece of data your external system will send — e.g. an email field, a first-name field, a company field
  3. Note each field’s name (not its label) — the webhook payload is keyed by field name, and names must match exactly
  4. Mark fields required if your sender must always include them
The form is only used as a data contract — it does not need to be published, shared, or embedded anywhere. But the endpoint refuses to enable a webhook on a form with no data fields, so add at least one field first.

Step 2 — Create the workflow and enable the webhook

  1. Go to Workflows and create a new workflow
  2. Add a Form Submission trigger and select the form you just created
  3. In the trigger panel, toggle on Inbound Webhook
  4. Copy the Webhook URL and Signing Secret — the secret is shown once, so store it like a password
  5. Add the actions the workflow should run when data arrives (create a contact, send an email, push to your CRM, etc.)
  6. Activate the workflow — the endpoint rejects requests with 409 while the workflow is still a draft
The trigger panel displays the exact JSON structure required, keyed by each field’s name (not label).

Step 3 — Send data that matches the form

Build a JSON object whose keys are the form’s field names. If your form looks like this: …then a valid payload looks like this:
Send it with the signature headers described below, and the workflow runs once per request.
Field names must match exactly. first_name and firstName are different fields. If you rename, add, or remove a field on the form, the expected payload changes immediately — update your sending system to match, or requests will start failing with 422 errors telling you exactly which fields are wrong.

Endpoint

Each workflow gets a unique {token} when you enable the inbound webhook.

Required headers

Payload structure

Send a flat JSON object where each key is a form field name:

Field types

Strict validation
  • Only field names from the selected form — plus any custom fields declared on the trigger — are allowed
  • Required fields must be present and non-empty
  • System keys starting with _ are rejected
  • Unknown fields return a 422 error with details

Custom fields

You can send data that isn’t part of the form — a lead score, a qualification flag, an external ID — by declaring custom fields on the trigger:
  1. Open the workflow trigger panel with the inbound webhook enabled
  2. Under Custom fields, add a field name (e.g. qualified) and choose its type — Text (string) or List (string[])
  3. Save the workflow
Declared custom fields are accepted in the payload alongside the form’s fields:
Custom field values behave exactly like form field values downstream: they’re stored on the submission, can be used in Filter conditions (e.g. qualified equals yes), and are available to later workflow steps and field mappings.
  • Custom fields are always optional — a payload that omits them is still valid
  • Names must start with a letter and contain only letters, numbers, and underscores (max 64 characters, up to 20 custom fields)
  • A custom field cannot reuse a form field’s name — the form’s definition wins
  • Undeclared fields are still rejected with 422, so typos fail loudly instead of silently dropping data
  • Like form-field edits, custom-field changes take effect as soon as the workflow is saved (the editor auto-saves) — they do not wait for a publish, so update your sender before removing or renaming a field the sender still uses

Signing requests

Compute the signature over the exact raw JSON body (before parsing):
The signing algorithm matches outbound webhook verification. Use the same HMAC-SHA256 approach with your inbound webhook secret.

cURL example

Replace {token}, {secret}, and field values with your workflow’s values:

Responses

Success (200)

Error codes

Example validation error:

Rotating the signing secret

In the workflow trigger panel, use Rotate secret to generate a new signing secret. Update your external system immediately — requests signed with the old secret will fail.

Disabling the webhook

Toggle off Inbound Webhook in the trigger panel, or delete the workflow. The URL becomes invalid immediately.

Outbound Webhooks

Receive events when forms are submitted (Orbit → your server)

Webhook Security

HMAC signature verification details

Workflows Guide

Build and manage automation workflows

Form Fields

Understand field names and types