Form Submitted
trigger.formstack_event
TriggerBusiness appsconnection requiredruns in-engine
Registers a webhook on the tenant's Formstack form at publish and starts one run per submission, verified against the HMAC secret Mantle registered.
Start a run when a Formstack form receives a new submission.
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Formstack
- Secret shape
- the Formstack personal access token (fs_pat_…)
- Resolved by
- config.connection_id, else the tenant's single formstack connection
- Note
- The token needs access to the form's webhooks — a token that can read submissions may still fail to publish. Publishing also needs MANTLE_APP_PUBLIC_BASE_URL set to a URL Formstack can reach.
Configuration
2 fields, 1 required. A dotted path is a nested object and name[] an array of objects — the editor renders the same tree.
| Field | Type | Required | Default | Constraints | Example |
|---|---|---|---|---|---|
form_id The numeric id of the form to listen to — the digits in the form's Formstack URL. A Formstack webhook fires on every submission of one form; there are no event types to choose from. | string | Yes | — | matches ^\d+$ | 2721234 |
field_keys How the delivery names each answer: by the field's label (field_names), its numeric id (field_ids), an API-safe label, or the internal label. Pick field_ids when the labels get edited, because a renamed field silently changes every key otherwise. | string | No | field_names | one of "field_names", "field_ids", "api_friendly_field_names", "internal_labels", "internal_labels_api_friendly" | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"field_keys": "field_names",
"form_id": "2721234"
}Output
One shape.
formstack submission
The submitted entry. `fields` keys are the form's own field names, so the shape is open below the declared fields.
Extra keys beyond the ones listed can appear.
| Field | Type | Example |
|---|---|---|
form_id The Formstack form the entry was submitted on, as sent in the delivery's FormID. Useful when several published workflows share a downstream step. | string | 2721234 |
submission_id Formstack's UniqueID for the entry, and this trigger's idempotency key: a redelivery carries the same id and joins the run it already started instead of starting a second one. Pass it to formstack.get_submission to read the entry back with its field metadata. | string | 1234567890 |
fields The submitted values, with the envelope keys (FormID, UniqueID) removed. The key names are whatever 'How fields are named' asked for, which is why this object's own keys are not declared. | object | {"Email":"ada@example.com","Message":"Please send the brochure.","Name":"Ada Lovelace"} |
payload The delivery exactly as Formstack sent it, for anything the fields above do not lift out. | object | — |
{
"fields": {
"Email": "ada@example.com",
"Message": "Please send the brochure.",
"Name": "Ada Lovelace"
},
"form_id": "2721234",
"payload": {
"Email": "ada@example.com",
"FormID": "2721234",
"Message": "Please send the brochure.",
"Name": "Ada Lovelace",
"UniqueID": "1234567890"
},
"submission_id": "1234567890"
}Notes
- Publishing creates the webhook on the form; unpublishing, disabling or archiving deletes it, so a form never keeps delivering to a dead workflow.
- One run per submission, idempotent on Formstack's UniqueID — a redelivery cannot start a second run.
- The webhook is registered with contentType=json; Formstack's own default (urlencoded) would arrive as a body Mantle cannot parse.
- A Formstack webhook has no event types: every submission of the form starts a run. Use a filter node if only some submissions should continue.
See Form Submitted run in a workflow.
In a technical demo we add the Formstack connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.