Connect an Elementor form
Draft. Nothing is live yet: the address below works on a local build only, and the contract has been tested with a body written from Elementor's documented shape, not yet run against Elementor Pro.
Elementor’s Form widget can send each submission to a webhook, so no plugin is needed for this path.
Elementor does not retry a failed webhook. If our answer is not 200, the visitor sees Elementor’s own error and the lead is not saved; nothing is promised to try again. For a site that must never lose a lead, use the ContactForms WordPress plugin instead, which keeps its own queue (the plugin is not available yet).
1. Add the Webhook action
Open the form, go to Actions After Submit and add Webhook. Paste your form’s address. It ends with a secret that only you have: in the dashboard open the form, go to Install and press “Create the secret address”. The address is shown once; if you lose it, create a new one and the old one stops working. An address without the secret is refused (401) and nothing is stored, unless you switch the old address on in the same place.
https://contactforms.dev/in/elementor/<your form key>/<your secret>
2. Turn on Advanced Data
Each field is stored under its Custom ID, not its label, so renaming a label does not change the stored key. The request looks like this (placeholders in angle brackets):
form[id]=<form id>&form[name]=<form name>
fields[email][id]=email&fields[email][type]=email&fields[email][title]=Email
fields[email][value]=<email address>
fields[message][id]=message&fields[message][value]=<message text>
If Advanced Data is off, the request has no fields[] and we answer 422 validation_failed. Illustrative excerpt: every error body also has a message and a docs_url:
{
"success": false,
"error": "validation_failed",
"fix": "Turn on Advanced Data in the Webhook panel of the Elementor form...",
"docs_url": "<link to the docs page for this error>"
}
3. What we answer
POST /in/elementor/f_8Kq2xLm9/Xk3pQ8vLm2Nd7RtYh4Bw9ZcFa6SjUe1Gi0ToAxEzV5y
Content-Type: application/x-www-form-urlencoded
form[id]=4f1c2a0&form[name]=Contact&fields[email][id]=email&fields[email][type]=email&fields[email][title]=Email&fields[email][value]=owner%40example.com&fields[message][id]=message&fields[message][type]=textarea&fields[message][title]=Message&fields[message][value]=Hello
-> 200: success true and the reference of the stored lead; the lead holds email and message under their Custom IDs
- HTTP 200, and only after the lead is stored. Elementor treats any other status as a failure.
- Failures use the standard error body, for example
store_failed(500),form_not_found(404),origin_not_allowed(403) orrate_limited(429, withRetry-After). Nothing is stored for a refused post. - The post goes through the same checks as any other form post: limits, the spam shield, your plan’s lead allowance and a repeated post of the same lead. A lead the spam shield holds is still stored, and Elementor is told 200.
- If you listed allowed domains for the site, a post with no Origin (which is how WordPress sends it) is accepted unless you turned off server posts for the form.
- A shorter alias,
https://in.contactforms.dev/elementor/<your form key>, is planned and not available yet.