Skip to content
FFormhook
Back to blog

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.json manifest - 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 free

No credit card · read the docs

Keep reading