Blog
Own your form data: exporting every submission you've ever collected
· 4 min read
Handing form submissions to a third-party service means trusting them with data you might one day need back in full - not a screenshot, not a partial CSV, all of it, including the file someone attached to a job application eighteen months ago. That hesitation is reasonable. A form backend that only lets you read your own data through its own UI is a backend you're renting, not one you're using.
Formhook's answer is a one-click full-account export: every form, every submission, every uploaded file, packaged into a single ZIP archive you download and keep. Here's exactly what's in it and why the format is deliberate.
What's actually in the archive
From the account page, triggering an export streams down a ZIP file named formhook-export-YYYY-MM-DD.zip. Inside are two things:
- An
export.jsonmanifest - a structured document containing your account details, every form you own, and every submission across those forms, each submission carrying its full field data plus metadata like when it arrived and which form it belongs to. - The original uploaded files - every attachment anyone has ever sent through your forms, stored under their own path and referenced by the matching submission entry in the manifest, byte-for-byte identical to what was uploaded.
Nothing is summarized, sampled, or left behind. The export streams the archive as it's built, so it scales the same way whether you have a hundred submissions or a hundred thousand - you're not waiting on a report job that might time out.
Why JSON, not a spreadsheet
It would be easy to assume a "real" export means a CSV you can open in a spreadsheet, and plenty of form tools default to exactly that. For form data specifically, it's the wrong default. Two things break a flat CSV:
- Different forms have different fields. Your contact form might collect name, email, and message; your job application form collects a résumé upload and three custom questions. Force both into one flat table and you either get a sparse mess of empty columns or you lose fields that don't fit the schema you picked first.
- Submissions can carry file attachments. A CSV cell can hold a filename at best - it can't hold the file. You'd need a separate, manually-maintained mapping between spreadsheet rows and a folder of files, and that mapping is exactly the kind of thing that drifts out of sync.
JSON has no such ceiling. Each submission keeps its own shape, nested structure stays nested, and a files array on each submission points straight at the attachment's path inside the same archive. Nothing needs to be flattened or guessed at to be preserved with full fidelity.
If you actually want a spreadsheet
None of that means you're stuck if a spreadsheet is what you need for a specific task - filtering last quarter's leads in Excel, say. export.json is plain, documented, structured JSON, not a proprietary blob you need Formhook's UI to decode. A short script, or any off-the-shelf JSON-to-CSV converter, turns the submissions array into a spreadsheet in a couple of lines, picking whichever fields you actually want as columns. The point of the export isn't to avoid CSV forever - it's to keep the underlying data in a format that hasn't already thrown anything away, so you get to decide what to do with it rather than Formhook deciding for you upfront.
How to trigger it
Export lives on the account page in the dashboard: one button, one authenticated request, one ZIP download. There's no support ticket to file and no waiting on someone to run a query on your behalf - it's the same action available to every account, on every tier.
Data portability isn't a nice-to-have
If you collect form submissions from people in the EU, this also isn't just a convenience feature - GDPR's data portability right means the people who submitted your forms can ask for their data in a structured, commonly-used, machine-readable format, and you need to be able to produce it. export.json is exactly that format, for your own account or as the underlying data source when you need to answer a portability request. See our GDPR-compliant contact form guide for the fuller picture of what compliance requires beyond export.
A form backend should never be a place your data goes to get stuck. Read more in the docs, or compare what's included at each tier on pricing - export is available on every plan, including Free.
Ship a working form in one line
EU-hosted, submissions kept forever, push notifications on every tier.
Start freeNo credit card · read the docs
Keep reading
- GDPR-compliant contact forms: a practical checklistWhat GDPR actually requires from a contact form: lawful basis, data residency, retention, and privacy policy wording. A practical checklist for developers.
- What is a form backend? (And when you need one)A form backend receives, stores, and forwards your website's form submissions so you don't run a server. Here's how they work and when you need one.
- Migrating from Formspree to Formhook: the ten-minute guideSwitching form backends is a one-line change. The full Formspree to Formhook migration: export, endpoint swap, spam settings, and testing - in ten minutes.