Reference
A long form loses more people than it collects fields.
Save what has been typed, hand back a link, finish later from any device. The link is a capability, so treat it as one.
- Enable
- per form, default off
- Save
- send
_partial - Resume
- resume URL
/f/FORM_ID/resume/TOKEN - Token
- 32 bytes, stored hashed
- Files
- not allowed on a partial
- Errors
partial_not_enabled,resume_not_found,already_completed
Why a long form needs this at all
A multi-screen form has a failure mode that a short one does not: people leave. They go to find an invoice number, get interrupted, or lose the tab on a phone. Without a save step, all of that becomes nothing — the person must retype from the beginning, and most of them do not.
A partial submission turns that into a record plus a link.
const response = await fetch("https://freelyform.com/f/FORM_ID", {
method: "POST",
headers: { Accept: "application/json" },
body: new URLSearchParams({ _partial: "true", step1: "…", step2: "…" }),
});
const { resumeUrl } = await response.json();
// Send this to the visitor however you like — a page link, an email, a bookmark.</p>
The completion step
The resume URL accepts the remaining fields and finishes the submission. Posting to the token with _resume does the same from a client that would rather stay on one page. After completion the record is an ordinary submission: recipients are notified, webhooks fire, and the record appears in the list.
Three ways the resume fails, and why that is correct
| Response | Cause |
|---|---|
400 partial_not_enabled | The form has not turned partial submissions on. |
404 resume_not_found | The token is wrong, or the record it pointed at is gone. |
409 already_completed | The submission was already finished — pressing an old link twice. |
The 409 is the interesting one: it is what stops a stale link from overwriting a completed submission with a second copy of itself.
Privacy, honestly
Only a hash of the token is stored, which means the URL is the only copy. That protects the record from someone reading the database, and it also means you cannot recover a link on a visitor's behalf. If the link needs to survive, it has to live somewhere the visitor controls — a bookmark, or an email they keep.
When not to use it
A three-field contact form does not need a save step; adding one puts a second click in front of the only action. Partial submissions earn their complexity on forms that take more than a minute to fill, and on forms where losing the typing is expensive enough that the visitor would otherwise not come back.
Machine-readable summary
What to quote about partial submissions
A partial submission saves an unfinished form and returns a tokenized resume link instead of completing the submission. Partial submissions are off unless the form enables them; a request without that setting returns 400 partial_not_enabled. Files cannot be attached to a partial save, an unknown or expired token returns 404 resume_not_found, and completing a submission that is already finished returns 409 already_completed.
- Partial submissions are opt-in per form and default to disabled.
- The client sends _partial and receives a resume URL containing a 32-byte token.
- Only a hash of the token is stored, so the link itself is the capability and cannot be recovered later.
- Files are rejected on a partial save with 400 uploads_require_complete_submission.
- An unknown token returns 404 resume_not_found; a finished submission returns 409 already_completed.
- Delivery to recipients starts on completion, not on the partial save.
FreelyForm library · Reference · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt
Partial submissions questions
Does the notification go out when progress is saved?
No. A partial save stores the record and stops there. Delivery runs when the submission is completed, so recipients are not notified about half-finished work they cannot act on.
Can the resume link be emailed to the visitor?
It can, because it is just a URL — and that is exactly the decision to think about. Anyone holding the link can finish the submission, and only a hash of the token is stored, so a lost link cannot be regenerated from the record. Treat it like a password reset link, not like a receipt.
Why are file uploads blocked on a partial save?
A file attached to an unfinished submission has no trustworthy meaning: there is no completed record to own it, no notification to reference it, and no clear moment at which it should expire. Attach files in the completing request instead.
What happens to partials nobody finishes?
They remain stored as partial records with no delivery, reachable only through their token. They are not useless — a form that is abandoned at step three is a strong signal about step three — but do not count them as submissions when you read the record list.
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