New Submission
trigger.jotform_submission
TriggerBusiness appsconnection requiredruns in-engine
Polls the form's submissions on an interval; one run per new submission.
Start a run for every new submission on a Jotform form (polled).
Connection
- Required
- Yes — the node will not save without one
- Auth type
- API key
- Providers
- Jotform
- Secret shape
- the API key, or {"api_key": "…"}
- Config it needs
- region, base_url
- Resolved by
- config.connection_id, else node.connection_id
Configuration
4 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 form to watch — the digits at the end of the form's public URL. | string | Yes | — | — | 240123456789012 |
poll_interval_sec How often to check the form for new submissions, in seconds. | number | No | 60 | 30–86400 | — |
page_size How many submissions to read per poll. Raise it for a busy form so a burst between two polls still fits in one page. | number | No | 100 | 1–1000 | — |
only_unread Start a run only for submissions Jotform still marks unread, so a submission somebody has already opened in Jotform is skipped. | boolean | No | false | — | — |
Example configuration
Every value below is the contract’s own example or default — nothing invented.
{
"form_id": "240123456789012",
"only_unread": false,
"page_size": 100,
"poll_interval_sec": 60
}Output
One shape.
submission
| Field | Type | Example |
|---|---|---|
submission_id The id of the submission that started this run. | string | — |
form_id The id of the form that was submitted. | string | — |
created_at When the submission arrived, as YYYY-MM-DD HH:MM:SS. | string | — |
updated_at When the submission was last edited, as YYYY-MM-DD HH:MM:SS. | string | — |
status Jotform's submission status: ACTIVE or OVERQUOTA. | string | — |
new '1' while the submission is still unread, '0' once it has been read. | string | — |
ip The IP address the submission came from. | string | — |
answers Jotform's answers map, keyed by question id, each with text, type and answer. | object | — |
fields The same answers flattened to one object keyed by each question's name (else a slug of its label), so the next node can read {{ $json.fields.email }} without a qid. | object | — |
submission The whole submission row as Jotform returned it. | object | — |
{
"answers": {},
"created_at": "",
"fields": {},
"form_id": "",
"ip": "",
"new": "",
"status": "",
"submission": {},
"submission_id": "",
"updated_at": ""
}Notes
- Existing submissions are never replayed: the first poll after publish only sets the cursor.
- Runs are idempotent per submission id, so a re-poll cannot start a second run.
- This polls the API — it does not register a Jotform webhook. Jotform posts multipart/form-data and signs nothing, which Mantle's webhook ingress cannot verify or parse.
- Every poll spends one API call from the account's daily quota; the quota left is reported as 'limit_left' by the jotform.* action nodes.
See New Submission run in a workflow.
In a technical demo we add the Jotform connection, drop the node on the canvas and let Workflow Health pre-flight it before the first real run.