Workflows
Workflows are post-submission actions that fire after a form entry has been validated and stored. They let you send emails, post to chat platforms, call webhooks, and more — all without writing custom code.
Overview
Every form can have one or more workflows attached. After a visitor submits a form and the submission passes all validation rules, FormForge saves the entry and then runs each enabled workflow in the background. The visitor receives their success response immediately — workflows never delay the page response.
If a workflow fails at runtime, the submission itself is not rolled back. Other workflows on the same form continue to run independently.
Workflows run in the order they appear in the backoffice. However, because they execute in the background, you should not rely on one workflow completing before another starts.
Email Notification
The email notification workflow sends an email to one or more recipients whenever a form is submitted. This is the most common workflow — typically used to alert your team that a new enquiry has arrived.
Settings
| Field | Description |
|---|---|
| To | Comma-separated list of recipient email addresses |
| CC | Comma-separated CC addresses (optional) |
| BCC | Comma-separated BCC addresses (optional) |
| Subject | Email subject line — supports tokens |
| From Name | Display name of the sender (optional) |
| From Email | Sender address — must be authorized in your SMTP config (optional) |
| Reply-To Field | Select an email field on the form — the submitted email address is used as the Reply-To header (optional) |
| Body Template | Custom HTML body — supports tokens. If left empty, an auto-generated HTML table with all field labels and values is used (optional) |
| Email Template | Select an email template to wrap the body content (optional) |
When no body template is specified, FormForge generates a clean HTML table listing every field label and its submitted value. File upload fields include the original filename and file size.
Autoresponder
The autoresponder workflow sends a confirmation email to the person who submitted the form. Unlike the email notification (which goes to your team), this goes to the visitor — making it ideal for order confirmations, thank-you messages, and follow-up instructions.
Settings
| Field | Description |
|---|---|
| To Field | Select an email field on the form — the submitted value becomes the recipient address |
| Subject | Email subject line — supports tokens |
| From Name | Display name of the sender (optional) |
| From Email | Sender address (optional) |
| Body Template | Custom HTML body — supports tokens (optional) |
| Email Template | Select an email template to wrap the body (optional) |
The autoresponder is silently skipped if the selected email field is empty or does not contain a valid email address. This is by design — for example, when the email field is optional and the visitor leaves it blank.
Webhooks
The webhook workflow sends the submission data as a JSON payload to any external URL after a form is submitted. Use this to integrate with CRMs, marketing platforms, databases, or any service that accepts incoming HTTP requests.
Settings
| Field | Description |
|---|---|
| URL | The HTTPS endpoint to send data to |
| Secret Header Name | Name of a custom header to include for authentication (e.g. X-Webhook-Secret) (optional) |
| Secret Header Value | Value of the secret header (optional) |
Payload Format
The webhook sends a POST request with Content-Type: application/json and the following body:
{
"formId": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"formAlias": "contact-form",
"submissionId": "f9e8d7c6-b5a4-3210-fedc-ba0987654321",
"submittedUtc": "2026-04-14T08:30:00.000Z",
"values": {
"name": "Jane Smith",
"email": "[email protected]",
"message": "I'd like to learn more about your enterprise plan.",
"priority": "high"
}
}Only HTTPS URLs are allowed — plain HTTP is rejected. Webhook URLs pointing to private or internal IP addresses are also blocked. Use a secret header to verify that incoming requests originate from FormForge.
Slack
The Slack workflow posts a rich notification to a Slack channel using an incoming webhook URL. The message includes the form name, submission timestamp, and all submitted field values in a clean, structured format.
Settings
| Field | Description |
|---|---|
| Webhook URL | Slack incoming webhook URL (starts with https://hooks.slack.com/) |
| Channel | Optional channel override (e.g. #sales-leads). If omitted, the message goes to the channel configured in the Slack webhook. |
Microsoft Teams
The Teams workflow posts a notification to a Microsoft Teams channel via an incoming webhook connector. The message includes the form name, submission timestamp, and all submitted field values.
Settings
| Field | Description |
|---|---|
| Webhook URL | Teams incoming webhook URL |
Discord
The Discord workflow posts a rich embed message to a Discord channel via a webhook URL. The message includes the form name, submission timestamp, and all submitted field values.
Settings
| Field | Description |
|---|---|
| Webhook URL | Discord webhook URL |
| Username | Optional bot display name override. If omitted, the webhook uses its default name. |
Discord has a 1024-character limit on embed field values. If a submitted value exceeds this limit, it is truncated. This typically only affects large textarea fields.
Conditions
Any workflow can include a condition that determines whether it should run. The condition evaluates against the submitted field values — if it does not match, the workflow is skipped entirely.
To add a condition, select a field, choose an operator, and (for most operators) enter a value to compare against.
Supported Operators
| Operator | Description |
|---|---|
equals | Field value exactly matches the condition value (case-insensitive) |
notequals | Field value does not match the condition value |
contains | Field value contains the condition value as a substring |
isempty | Field value is null, empty, or whitespace-only (no comparison value needed) |
isnotempty | Field value is present and non-empty (no comparison value needed) |
These are the same operators available for field conditional visibility rules, ensuring a consistent experience across FormForge.
Example
You could configure a Slack workflow with the condition: field priority, operator equals, value urgent. This way the Slack notification only fires when a visitor selects “urgent” as their priority.
Similarly, you could set a webhook condition to isnotempty on a companyName field, so the webhook only fires when the visitor has provided a company name.
Email Templates
Email templates are reusable HTML wrappers that provide consistent branding across all email workflows. Instead of duplicating header and footer markup in every workflow, you create a template once and reference it from any email notification or autoresponder.
A template is a standard HTML document with a {body} placeholder where the email content will be injected.
Every email template must contain exactly one {body} placeholder. At send time, FormForge replaces this placeholder with the workflow-generated content (either the auto-generated field table or your custom body template). Templates without a {body} placeholder will fail validation.
Example Template
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<style>
body { font-family: Arial, sans-serif; margin: 0; padding: 0; background: #f4f4f4; }
.wrapper { max-width: 600px; margin: 0 auto; background: #ffffff; }
.header { background: #1a1a2e; color: #ffffff; padding: 24px 32px; }
.header h1 { margin: 0; font-size: 20px; font-weight: 600; }
.content { padding: 32px; }
.footer { background: #f9f9f9; padding: 16px 32px; font-size: 12px; color: #888888; text-align: center; }
</style>
</head>
<body>
<div class="wrapper">
<div class="header">
<h1>Acme Corp</h1>
</div>
<div class="content">
{body}
</div>
<div class="footer">
© 2026 Acme Corp. All rights reserved.
</div>
</div>
</body>
</html>Managing Templates
Email templates can be created and managed in the FormForge section of the backoffice, which includes a dedicated template editor with live preview. Templates are also included in FormForge’s export/import system — when you export a form that references a template, the template is bundled automatically.
Token Reference
Tokens are dynamic placeholders that get replaced with real values when the email is sent. You can use them in email subjects, body templates, and email template HTML.
Available Tokens
| Token | Replaced With |
|---|---|
{form.name} | The display name of the form |
{form.alias} | The form’s unique alias |
{submittedUtc} | Timestamp of the submission (e.g. 2026-04-14T08:30:00.000Z) |
{fieldAlias} | The submitted value of any field. For example, {name} resolves to the value of the field with alias name. |
Where Tokens Work
| Location | Example |
|---|---|
| Email subject (notification & autoresponder) | New lead from {name} — {form.name} |
| Email body template | <p>Hi {name}, thanks for reaching out.</p> |
| Email template HTML | Tokens in the outer template wrapper are also resolved |
Tokens are case-sensitive — {Name} and {name} are different. If a token does not match any field or built-in value, it is left as-is in the output. If a matched field value is empty, the token is replaced with an empty string.