FreelyForm

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.
Replay a webhook delivery
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.

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