retry and idempotency
n8n webhook retry and idempotency example
A practical example of how to structure form submissions so retries do not duplicate tickets, users, approvals, or provisioning work in n8n.
Direct answer
An n8n webhook that receives form submissions should treat retries as normal. Use a submission ID or idempotency key, store the processed key, and skip duplicate fulfillment when the same key arrives again.
Example idempotency fields
{
"submissionId": "sub_01JZ8P9Q4S0R8W7K6M5N4B3A2C",
"idempotencyKey": "formnode:sub_01JZ8P9Q4S0R8W7K6M5N4B3A2C",
"attempt": 2,
"deliveredAt": "2026-05-15T16:22:41Z",
"fields": {
"request_type": { "value": "new_user" },
"target_user": { "value": "jordan.lee@example.com" }
}
}Notes
- Check whether the idempotency key has already been processed before creating tickets, users, approvals, or license changes.
- Store the downstream ticket ID or provisioning result with the key so duplicate deliveries can return the previous result.
- Use retry-safe workflow branches around external API calls that may time out after succeeding.
- Make failure visible in both the form layer and n8n, not only in one tool.
Common questions
Why do n8n form webhooks need idempotency?
Because retries can happen after timeouts or temporary failures. Idempotency prevents a retry from creating duplicate tickets, users, approvals, or provisioning actions.
What is a good idempotency key for FormNode to n8n submissions?
Use the FormNode submission ID or a key derived from it. It should be stable for the same submission and unique across different submissions.