Partial form submissions, for the forms you build yourself
OllieLeads saves the contact details of people who leave your form halfway, on any form you or your coding agent built. You keep your markup; Ollie keeps the lead.
On this page
How it works
Most form backends only hear about a lead when the visitor presses Send. Everyone who gives up before that is gone without a trace, even when they had already typed their email. OllieLeads opens a session when the visitor starts, saves the contact fields as each one is filled in, and completes the lead when the form is sent.
- The visitor starts typing. Nothing leaves the browser for keystrokes. When they leave a contact field, such as email, Ollie saves that value.
- They send the form. Every field arrives once, and the lead is Submitted.
- Or they leave. After 30 quiet minutes the lead becomes Left early, and you hear about it:
Left early at step 3 of 5: mara@keller.ch (Alpenglow Web).
Left early leads land in the same inbox as everything else, go to the same Slack or Discord channel, and fire the
same signed webhooks (lead.left_early), so your follow-up runs on one list instead of two.
What is saved, and when
| Field | Saved before submit | Why |
|---|---|---|
| Name, email, phone | Yes, when the visitor leaves the field | Enough to reply, and nothing more |
| Fields you opt in, per form | Yes, with the notice on your form | For the answer that matters, such as a budget |
| Free text, such as a message | No, only on submit | People draft and delete; half a message is not consent to send it |
| Anything, with consent turned on | Only after the visitor agrees | For visitors in the EU, UK and Switzerland |
| Passwords, card numbers, IBANs | Never, not even on submit | They have no place in a lead |
The same rule is enforced twice: by the script in the browser, and again by the capture endpoint, which drops any field that is not a contact field or one you opted in before the form is sent.
Turn it on
Add the script once per page and the attribute to your form. Your form keeps its own action, validation and thank-you page.
<!-- Once per page, before </body> --> <script src="https://ollieleads.com/sdk/v1.js" data-key="ol_test_connect" defer></script> <!-- On the form you already have: add one attribute --> <form data-ollie-form="frm_8kq2" action="/thanks" method="post"> <input name="name" autocomplete="name"> <input name="email" type="email" autocomplete="email"> <textarea name="message"></textarea> <button>Send</button> </form>
Use the test key ol_test_connect while you build: test leads are tagged [TEST] and never count. Remove data-key when the site goes live. An npm package for bundlers ships in the pilot; the script tag works
today with React, Next.js, Astro, SvelteKit and sites built in Lovable.
When your own code sends the form
If a submit handler or your server already sends each lead to OllieLeads, add data-ollie-submit="handler" to the form. The script then only saves early, your code keeps sending the
lead after its own checks, and the visitor stays one lead. Send the hidden fields _sid and _ssec along with the others; when you build the body yourself, add ...window.ollie?.sessionFields('frm_8kq2').
Multi-step forms
Wizards lose the most people, and they are where knowing the last step matters. When you control the steps yourself, drive the session directly. Every call resolves to true or false and never throws.
const ollie = window.ollie; // from the script tag const s = ollie.session('frm_8kq2'); // After step 1: only contact fields leave the browser await s.save({ name, email }, { step: 1, of: 3 }); // The visitor moves on await s.step(2, 3); // On the last step: every field, once await s.complete(allFields);
The notice for visitors
Saving what someone typed before they send it should never be a surprise. Put a short notice next to the form, in words your visitors understand. This one matches what OllieLeads saves by default:
<p class="form-notice"> We save your name and contact details as you type, so we can get back to you even if you don't finish. Anything else is sent only when you press Send. <a href="/privacy">Privacy</a> </p>
Rules differ by country and state, and some are strict about capturing input before submit. The privacy section of our form abandonment guide explains the main risks and how to reduce them. Check with a lawyer for your situation.
Visitors in the EU, UK and Switzerland
European regulators treat collecting what someone typed before they send it like a cookie: it needs their consent first. Turn on consent, and nothing leaves the browser before submit until the visitor agrees. The form itself works exactly as before, and pressing Send always sends it.
<!-- Nothing is saved before submit until the visitor agrees --> <script src="https://ollieleads.com/sdk/v1.js" data-consent="required" defer></script>
Then let visitors agree in one of two places.
In your cookie banner
If your site already has a consent banner, add saving form details as a purpose of its own, in plain words, for example: Keep the details I type into a form, so you can reply if I don’t send it. When the visitor accepts it, tell the script:
// In your consent banner, when the visitor accepts this purpose // (before or after the OllieLeads script has loaded): window.ollieConsent = true; // And when they withdraw it: window.ollieConsent = false;
- Its own purpose, named plainly, not folded into “functional” or “analytics”.
- Off until the visitor says yes, and saying no is as easy as saying yes.
- Easy to withdraw later, which sets
window.ollieConsent = false.
If your banner only appears in some regions, have it report yes for this purpose elsewhere, or early saving stays off for everyone else too.
Or with a checkbox on the form
No banner, or only one form that matters? Put an unticked checkbox in the form. Early saving starts when it is ticked and stops if it is unticked.
<form data-ollie-form="frm_8kq2" action="/thanks" method="post"> <input name="email" type="email" autocomplete="email"> <label> <input type="checkbox" data-ollie-consent> Keep my details if I don't finish, so you can get back to me </label> <button>Send</button> </form>
What it costs
Partial capture is on every plan. A lead counts once, whether it was submitted or left early, and spam and test leads never count. Free is 500 leads in total with no credit card; Pro is $29 a month with 1,000 leads a month included. See pricing.
Questions people ask
What is a partial form submission?
A partial form submission is what a visitor typed into a form before leaving without sending it. Saving the contact fields of that partial submission, such as name and email, lets a business follow up with someone who was interested but did not finish.
Does OllieLeads work with forms I built myself?
OllieLeads works with any form you or your coding agent built, in plain HTML or any framework. It is a form backend, not a form builder: your markup and design stay exactly as they are, and partial capture is added with one script tag and one attribute.
Is saving form data before someone submits legal?
Saving form data before submit is lawful in many places when it is limited, disclosed and used to reply, but some laws are strict, notably in California and the EU. European regulators treat collecting what someone typed before they send it as needing consent, so for visitors in the EU, UK and Switzerland, turn on consent: nothing is saved early until they agree, in your cookie banner or with a checkbox on the form. Our form abandonment guide covers the details; it is not legal advice. Read the privacy section.
Does a visitor who saves early and then submits count twice?
A visitor whose contact details were saved early and who then sends the form is one lead, shown as Submitted. Someone who leaves and comes back another day makes a second lead, but both sit under the same contact, so you see one person with two visits. A lead counts once on your plan whether it was submitted or left early.
Does partial capture slow down my form?
The OllieLeads script is under 5 KB gzipped, loads with defer and never blocks the form. If OllieLeads is unreachable, the form submits exactly as it did before; the script fails open and never throws to the page.