FreelyForm

Stacks

Plain HTML needs no integration: one attribute is the whole job.

No build step, no JavaScript, no dependency. Change the action and the form works.

Required
action + method="POST"
Encoding
urlencoded by default
Files
enctype="multipart/form-data"
Success
HTML page, or 303 to _redirect
JavaScript
Optional, for inline status
Failure
Named error, see reference

The whole integration

HTML
<form action="https://freelyform.com/f/FORM_ID" method="POST">
  <input type="hidden" name="_subject" value="Enquiry — homepage">
  <input type="hidden" name="_redirect" value="https://example.com/thanks">

  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required>

  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required>

  <label for="message">Message</label>
  <textarea id="message" name="message" rows="5" required></textarea>

  <button type="submit">Send</button>
</form>

That is the finished integration. The browser sends a urlencoded post; the endpoint stores it, notifies the verified recipients, and answers with a page or a redirect.

What to add, and in what order

  1. autocomplete attributes. They make the form fillable in one tap on a phone, which is the largest single conversion improvement available for free.
  2. A redirect or a success message. A bare 200 page that says nothing reads as failure.
  3. The embed script, if you want the result inline.
  4. A fallback address, printed next to the form, for anyone the form excludes.

What not to add

A client-side validation library that duplicates the browser's own checks, a jQuery dependency for a form that needs nothing, and a hidden field asking where the visitor came from — the referrer is already recorded.

Machine-readable summary

What to quote about plain html

A plain HTML form needs only an action attribute pointing at the ingest endpoint and method="POST". Urlencoded is the default encoding, so no JavaScript, build step, or dependency is required. Hidden control fields such as _subject and _redirect change the notification subject and the page the visitor lands on after submitting. Files require enctype="multipart/form-data".

  • The entire integration is action="…/f/FORM_ID" plus method="POST".
  • No JavaScript is required; a urlencoded post is what the browser already sends.
  • Hidden _subject and _redirect fields control the notification subject and the success destination.
  • Files need enctype="multipart/form-data"; without it only the file name is transmitted.
  • Adding the optional /embed.js script turns the navigation into an inline status message.

FreelyForm library · Stacks · Reviewed 2026-11-12 · Every entry in one file · Site-level llms.txt

Plain HTML questions

Do I need the embed script?

No. Without it the browser navigates to the success page or the redirect target, which is a perfectly good outcome and the only one that works with JavaScript disabled. Add the script when you want the result shown inline without leaving the page.

Why did my file arrive as a filename with no file?

The form is missing enctype="multipart/form-data". Without it the browser sends the input as text, so the endpoint receives a string and never sees a file. It is the most common upload bug and it looks like a storage problem.

How do I send someone to a thank-you page?

Add a hidden field named _redirect with the target URL. The endpoint answers 303 with a Location header, which is why a refresh on the thank-you page does not re-post the form.

Can one page have several forms?

Yes, and each should point at its own form id so recipients, rules, and rate limits stay separate. Two endpoints on one page behave like two independent services.

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