Workflow Node Types Reference
WittyForm workflows use a node-based system to automate actions after form submissions. Each workflow starts with a Trigger node and chains one or more action nodes. This reference documents all 8 node types with their configuration schemas and behavior.
1. Trigger
The Trigger node is the entry point of every workflow. It runs when a new form response is submitted.
Configuration
{
"type": "trigger",
"label": "On submission"
}The workflow fires once per submission. To run actions only for certain submissions (for example, only when a budget field is above a threshold), add a Condition node after the trigger and branch on its result.
2. Send Email
Sends an email when the workflow reaches this node. Supports template variables in the subject, body, reply-to address, and sender name.
fromName is the display name recipients see next to the address. Leave it out and the workspace sender name is used, falling back to WittyForm. Because it can interpolate an answer, the value is stripped of characters that would break the header (line breaks, angle brackets, quotes, commas, semicolons) and truncated to 78 characters.
Configuration
{
"type": "send_email",
"to": "{{respondent.email}}",
"subject": "New submission: {{form.title}}",
"body": "New response
Name: {{field_name}}
Email: {{field_email}}",
"replyTo": "[email protected]",
"fromName": "{{field_name}}"
}Template Variables
Use double-brace syntax to insert dynamic values into the subject and body. Variables are resolved from the saved response, so response IDs and timestamps are authoritative.
{{respondent.email}}: The first email field answer, when present{{form.id}}: The form's ID{{form.title}}: The form's title{{field_id}}or{{Field label}}: The value of a specific response field{{response.id}}: The unique saved response ID{{response.submitted_at}}: Saved submission timestamp in ISO UTC{{response.submitted_date}}: Saved submission date in UTC{{response.submitted_time}}: Saved submission time in UTC
3. Webhook
Sends an HTTP request to an external URL with the form response data. Use this to push data to any third-party system.
Configuration
{
"type": "webhook",
"url": "https://api.example.com/form-submissions",
"method": "POST", // "POST" | "PUT" | "PATCH" | "GET"
"headers": {
"X-Custom-Header": "source=wittyform"
},
"payloadTemplate": null // null = send the standard JSON payload
}Payload Template
Leave payloadTemplate empty to send the standard JSON payload. To send a custom JSON string, include template variables directly in the string:
"payloadTemplate": "{"event":"form_submitted","form_id":"{{form.id}}","customer_email":"{{field_email}}"}"Delivery
Workflow webhooks use a fixed server timeout and are recorded in Workflow Logs. If a request fails, the workflow result records the node error so you can inspect it later.
4. Notification
Sends an in-app notification to one or more workspace members. Notifications appear in the bell icon in the WittyForm dashboard.
Configuration
{
"type": "notification",
"title": "New form submission",
"message": "{{field_name}} submitted {{form.title}}"
}Where It Appears
The notification shows up under the bell icon in the WittyForm dashboard for the workspace. Both the title and message support double-brace template variables so you can include response data.
5. Slack
Posts a message to Slack using an incoming webhook URL. Create the webhook in your Slack workspace, then paste its URL into the node.
Configuration
{
"type": "slack",
"webhookUrl": "https://hooks.slack.com/services/T000/B000/XXXX",
"channel": "#form-submissions", // Optional: channel name or ID
"message": "New submission from {{field_name}} ({{field_email}})"
}Message Format
The message is plain text with Slack markdown and supports double-brace template variables so you can include response data. The optional channel overrides the webhook's default channel where your Slack configuration allows it.
6. Condition
A Condition node evaluates a rule and branches the workflow into two paths: True (condition met) and False (condition not met).
Configuration
{
"type": "condition",
"conditions": [
{
"fieldId": "field_budget",
"operator": "greater_than",
"value": 10000
},
{
"fieldId": "field_company_size",
"operator": "greater_than",
"value": 50
}
],
"match": "all" // "all" | "any"
}Operators
| Operator | Works With | Description |
|---|---|---|
equals | All types | Exact match. |
not_equals | All types | Does not match the specified value. |
contains | Strings | Value contains the specified substring. |
not_contains | Strings | Value does not contain the specified substring. |
greater_than | Numbers | Value is greater than the specified number. |
less_than | Numbers | Value is less than the specified number. |
is_empty | All types | Field was left blank or not answered. |
is_not_empty | All types | Field has a value. |
Value Comparisons
The value field in a condition rule supports literal strings and numbers. Template variables are not evaluated inside condition values.
7. Redirect
The Redirect node overrides the default thank-you page and sends the respondent to a custom URL after the server confirms the saved submission.
Configuration
{
"type": "redirect",
"url": "https://yoursite.com/thank-you?response_id={{response.id}}"
}URL Template
The URL supports the same saved-response template variables listed above. Common patterns:
https://yoursite.com/thank-you?id={{response.id}}: Pass the response ID to your own systemhttps://yoursite.com/audit?submitted={{response.submitted_at}}: Pass the authoritative submission timestamphttps://calendly.com/team/meeting?name={{field_name}}&email={{field_email}}: Pre-fill a Calendly booking with form data
Conditional Redirects
Combine a Redirect node with a Condition node to send different respondents to different URLs based on their answers.
8. Update Lead Score
Modifies the lead score of the CRM contact associated with the form respondent. Requires that the form has CRM integration enabled (auto-create contacts or field mapping).
Configuration
{
"type": "update_lead_score",
"operation": "add", // "add" | "subtract" | "set"
"points": 20, // Number of points to apply
"label": "Submitted demo request"
}Operations
| Operation | Behavior | Example |
|---|---|---|
add | Add points to the current score. | Current score: 45, points: 20, new score: 65. |
subtract | Subtract points from the current score. | Current score: 45, points: 10, new score: 35. |
set | Set the score to an exact value, ignoring the current score. | Current score: 45, points: 100, new score: 100. |
Score Rules
pointsis a fixed number. The resulting score is always clamped to the range 0 to 100 automatically, so a contact never drops below 0 or rises above 100 no matter how many forms they submit.- The optional
labeldescribes the adjustment so you can recognize it later. - Each score update is logged in the contact's activity timeline with the source form and the resulting score.
Note: If the form response does not match an existing CRM contact (no matching email) and auto-create contacts is disabled, the Update Lead Score node is skipped silently. Check your Workflow Logs for "skipped" entries if scores are not updating as expected.