Form Toolkit
Email and flow builder
Every submission can trigger two different emails:
- an internal notification (via mail route)
- a confirmation to the customer (via Flow Builder action)
Internal notification — mail routes
Mail routes live in the form editor under Email. A route describes a single delivery recipient.
Fields of a route
| Field | Meaning |
|---|---|
| Route name | Internal label |
| Active | Enable / disable the route |
| Mail template | Optional; otherwise the default "Form Toolkit – New Submission" template is used |
| Recipient | Primary recipient (required) |
| CC | Optional, comma-separated (Premium) |
| BCC | Optional, comma-separated (Premium) |
| Reply-To field | Optional; form field of type email whose value is used as the Reply-To address |
| Conditions | AND-combined filters, e.g. "send only when Dropdown = Service" (Premium) |
Conditional routing (Premium)
In the Premium plan you can attach any number of routes to a form and assign conditions per route. Example:
- Route 1: "Service" →
support@, condition Dropdown =Service - Route 2: "Sales" →
sales@, condition Dropdown =Sales - Route 3: "Other" →
info@, no condition
Evaluation runs per submission — a matching route fires its mail, a non-matching one stays silent.
Reply-To to the customer address
To make sure replies to a notification mail land directly with the sender, you can pick a Reply-To field per mail route. The dropdown lists every form field of type email from the current form.
On submission the address entered by the customer is set as the Reply-To header — the From address stays the shop address. A click on "Reply" in the recipient's mail client is addressed to the customer directly.
This is intentional: sending with the customer's own domain as From would be flagged as spoofing by the recipient's SPF/DKIM/DMARC checks and most likely end up in spam. Reply-To is the accepted standard among major mail providers for contact and inquiry forms.
If the selected field does not carry a valid email address at submission, the mail is sent without a Reply-To header.
Customer confirmation mail
In the form's General tab toggle Send confirmation mail to customer.
Pick:
- the mail template (type "Form Toolkit – Customer Confirmation") — Shopware imports it during plugin activation
- the form field that carries the customer address (usually the email field)
Delivery runs as a Flow Builder action — reusable inside your own flows.
Flow Builder integration
When the plugin is activated a new event Form was submitted is registered in the Flow Builder. You can build your own flows on top of it — e.g.:
- trigger a Slack notification
- tag the customer
- notify an external API
Bundled Flow Builder action
| Action | Effect |
|---|---|
| Send customer confirmation (PremsForm) | Sends the configured confirmation mail to the customer address from the submission |
The installer also creates a default flow that triggers this action on the "Form was submitted" event. You can disable that flow or add your own.
Multilingual mails
Mail templates are translatable like every other Shopware mail template. The submission's language is used to pick the matching translation — customers get the confirmation in their language.
Mail template variables
The mail templates expose, among others:
form— the form entity (name, fields, …)entry— the submission (data, status, language, sales channel)entry.data— list of every submitted field withlabel,valueandfieldTypeentry.getValueByIdentifier('...')— direct access to the value of a single field
Use them to build, for example, a full submission table inside the mail.
Direct access to a single field value
The helper entry.getValueByIdentifier('...') returns the value of one field without iterating entry.data. It expects the Technical name of the field as its argument.
You'll find the technical name in the form editor under Fields → selected element → Technical name. It is the identifier for the field's values in submissions and in mail templates.
The return value is the field value as a string — or null if the field was left empty or is not part of the submission.
Examples for the subject of a mail template:
New inquiry from {{ entry.getValueByIdentifier('firstName') ?? 'Guest' }} {{ entry.getValueByIdentifier('lastName') ?? '' }}
Inquiry about {{ entry.getValueByIdentifier('productName') ?? form.name }}
And inside the HTML body of a customer confirmation mail:
<p>Hello {{ entry.getValueByIdentifier('firstName') ?? 'there' }},</p><p>we have received your inquiry and will get back to you shortly.</p>