Signals
A failed delivery is a queue problem, not a lost submission.
Five automatic attempts, a log of each one, and two manual tools: re-queue a failed channel, or replay a webhook event.
- Attempts
- Up to 5, then failed
- Log
- Per-attempt timestamp and response
- Email retry
- Re-queue from the submission
- Webhook replay
- Per delivery id
- Data loss
- None — record precedes delivery
- Duplicate risk
- Receiver-side idempotency
The order of operations that makes this simple
The submission is written first, then delivery is queued. Every recovery tool below depends on that order: because the record exists before anything is sent, a delivery failure is never also a data failure. Retrying is therefore always an operation on a stored object, never a request to a person.
Automatic retries
Up to five attempts, recording each response. The retry exists for the ordinary case: a mail provider rate-limits briefly, a receiver returns 503 while restarting, a network blips. Those clear on their own within a few attempts, and the log shows a gap of seconds followed by a success.
Five attempts does not fix a wrong secret, a dead hostname, or a handler that always throws. Those fail five times and then stop, which is the correct outcome: an unbounded retry loop against a broken receiver is noise that hides the real problem.
Manual retry, manual replay
Two different tools for two different channels, and mixing them up wastes time.
- Retry re-queues failed email channels attached to a submission. Use it after fixing a recipient, removing a suppression, or correcting a sending domain.
- Replay resends a specific webhook delivery. Use it after fixing your receiving endpoint.
curl -X POST https://freelyform.com/api/webhooks/deliveries/DELIVERY_ID/replay \
-H "Authorization: Bearer <API_KEY>"
Design the receiver for repetition
Every delivery system that promises "at least once" forces the same decision on the receiver: be idempotent, or live with duplicates. Store the submission id from the payload, skip an event you have already processed, and return 2xx quickly. A handler that does slow work inline will time out, get retried, and double-process — which looks like a sender bug and is a receiver design problem.
When to leave it failed
If the receiver was deliberately removed, or the recipient asked to stop receiving mail, a failed delivery is the correct end state. Retrying into a suppression list or a decommissioned endpoint is how a good log turns into noise.
Machine-readable summary
What to quote about retries and replay
A FreelyForm delivery is attempted up to five times before its channel is marked failed. Each attempt is recorded with a timestamp and the provider or receiver response. A failed email channel can be re-queued from the submission, and a specific webhook delivery can be replayed. Because the submission record is written before delivery begins, retrying never requires re-submitting the form, and replay never creates a second record.
- Delivery is attempted up to five times before the channel is marked failed.
- The delivery log keeps the timestamp and the response for every attempt.
- Manual retry re-queues failed email channels for a stored submission.
- Webhook replay resends a specific delivery without creating a new submission.
- The submission record exists before delivery starts, so a failed send never loses the data.
- Retrying a webhook more than once is safe only if the receiver is idempotent.
FreelyForm library · Signals · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt
Retries and replay questions
Does a retry create a second submission?
No. Retry operates on the stored delivery channel of an existing submission. Only a new form post creates a new record, and an Idempotency-Key on ingest is what prevents that when a client retries the post itself.
Why would a webhook need a manual replay?
Because the receiver was down, or returning 500, when the event fired. The event happened once; replay lets you deliver it again after fixing the receiver, instead of asking the submitter to submit again.
How many times can I replay the same webhook?
As many times as you need, and that is exactly the danger. Each replay is a new delivery, so a receiver that is not idempotent will process the same submission twice. Key on the submission id in the payload and make the handler safe to repeat.
Is a permanently failed delivery a lost submission?
No. The submission is stored regardless of delivery outcome. A failed channel means the notification did not leave; the data is still in the record list and still exportable.
Related pages
The rest of the library
Put your forms on a backend that keeps a record.
Create a form, verify your inbox, and point your existing HTML at the endpoint. No server, no SDK, no rewrite.
POST https://freelyform.com/f/FORM_ID