Skip to content
Pillar guide

Getting started: build and embed your first form

Updated 2026-06-22Reviewed by Florian Wartner

What a form backend actually does

Before you build anything, it helps to know what you are building on. A form backend is a hosted service that receives form submissions for you. Instead of writing server code to accept a POST, validate it, filter spam, store it, and email you, you point your form at a URL and the backend does all of that. Your site only needs to render the form.

The single thing it gives you is a form endpoint: a unique URL that turns any HTTP POST into a stored, notified submission. That endpoint is framework-agnostic by design - a plain HTML page, a React component, an Astro island, or a server action can all POST to the same URL and get identical behaviour. This is exactly why a form backend is the standard pattern for static sites and Jamstack builds, where there is no server of your own to receive the request.

For this guide you need nothing installed and no credit card. Everything below works on the Free plan, which includes one form, real-time notifications, and the default spam layers. The forms product page covers the full feature set, but you do not need it yet - the four steps that follow get you from nothing to a working form.

Step 1: Create your account and first form

Start by creating a free account - no credit card required. Once you are signed in, the dashboard opens on your personal workspace.

Click New form. You will see a template chooser with two paths:

  • Empty form - a backend-only endpoint. You keep your own HTML and just POST to the URL. This is the right choice if you already have a form on your site.
  • A template (Contact, Newsletter, and others) - a hosted form with sensible defaults that you can design visually in the form builder. Choose this if you want a ready-made form page without writing markup.

Give the form a name (this is what shows up in your inbox and email subject lines), optionally add one or more notification emails (one address per line - each gets a copy of every clean submission), and optionally set allowed origins to restrict which domains may submit. Leave origins empty to accept submissions from anywhere while you are testing. Hit Save. The create-your-first-form doc walks through the same screen with screenshots.

Step 2: Get your endpoint

Saving the form generates its unique endpoint - a URL of the form https://formspring.io/f/r2EdO-orF-3S. Anything that POSTs to that URL becomes a submission.

You can prove it works in one command before touching any markup:

bash
curl -X POST https://formspring.io/f/r2EdO-orF-3S \
  -H "Content-Type: application/json" \
  -d '{"name":"Ada","email":"ada@example.com","message":"Hello!"}'

Refresh your inbox in the dashboard and the submission is there. Two things are already true at this point without any configuration: CORS is handled per-form (so browser submissions from your allowed origins just work), and the honeypot plus rate-limit spam layers are active. You have a working form backend before you have written a single line of front-end code.

Step 3: Embed the form

Now wire the endpoint into your site. The contract is always the same - POST to the endpoint URL - so pick the snippet that matches your stack.

Plain HTML is the most robust option and works with JavaScript disabled. Set the form's action to your endpoint:

html
<form action="https://formspring.io/f/r2EdO-orF-3S" method="POST">
  <input name="name" required>
  <input type="email" name="email" required>
  <textarea name="message" required></textarea>
  <button>Send</button>
</form>

React, Next.js, Vue, and other frameworks usually want to stay on the page: intercept the submit, send FormData with fetch, and render the JSON response inline. There is no API route of your own to build - that is the whole point of a form backend. The use-case pages for Next.js, React, and Vue have copy-paste components.

Static-site generators (Astro, Hugo, Eleventy, Gatsby) are the natural fit - the form ships as zero-JavaScript HTML. See the static-site contact form pattern.

If you would rather not write markup at all, the embed options include a hosted form page and a script embed. Whichever route you pick, keep the field name attributes stable once the form is live - they are the keys your notifications, exports, and webhooks are built on.

Step 4: Receive and route submissions

Every clean submission does three things automatically: it appears in your inbox in real time, it triggers a notification email to each address you configured, and it is stored so you can search and export it later.

The notification email matters more than it looks. Speed of response is the highest-leverage variable in handling enquiries, so the notification includes the full submission inline - you can read and reply from your phone without logging in anywhere. You can send notifications to multiple recipients and route different forms to different people, so sales and support reach the right team from day one. The receive-your-first-submission doc covers wiring it to a real front end, and the dashboard tour shows where everything lives.

When email is not enough - you want to create a CRM contact, post to a channel, or kick off a workflow - that is what webhooks and integrations are for. They are a paid feature and out of scope for a first form, but the send-submissions-to-your-CRM guide picks up exactly there when you are ready.

Spam protection you get for free

Form spam arrives the moment a form is public, so two defences are on by default on every form, including Free.

The first is a honeypot field - an invisible field a human never sees but automated bots reliably fill in. Any submission that fills it is silently rejected. It costs your real visitors nothing because they never encounter it, and it catches the majority of drive-by bot traffic on its own. The honeypot doc explains the mechanism.

The second is rate limiting, which throttles repeated submissions from the same source so a script cannot hammer your endpoint. The rate-limits doc covers the thresholds.

That baseline is enough for most first forms. As traffic grows you can layer on custom rules, reputation-based spam filtering, AI moderation, or - only where a real attack justifies the conversion cost - a CAPTCHA. The stop-form-spam guide covers the full layered approach. The spam-protection overview is the doc index.

What to do next

You now have a live form: an endpoint, an embed, real-time notifications, and default spam protection. From here the natural next steps depend on what you are building.

The fastest way to learn the product is to ship a real form on a real page. Start free, create a form, and paste the endpoint into your site - the rest of the library is here when you need it.

Common questions

Frequently asked

Do I need to write any server-side code to receive form submissions?
No. A form backend gives you an endpoint URL to drop into your form's action attribute (or POST to with fetch). The backend receives the submission, validates it, filters spam, stores it, and notifies you - with no server-side code on your site. This is the standard pattern for static sites and frameworks like Next.js and Astro.
Is building a first form really free?
Yes. The Free plan includes one form, real-time notifications, and the default honeypot and rate-limit spam layers, with no credit card required. Paid plans add things like webhooks, AI features, file uploads, and higher submission limits, but none of that is needed to build and embed a working form.
How do I test my form before putting it on my site?
POST to your endpoint with a single curl command (or any HTTP client) and refresh your inbox - the submission appears in real time. Because the endpoint is just a URL, you can verify the whole backend works before writing any front-end markup.
Will the same form work in React, Astro, and plain HTML?
Yes. The endpoint is framework-agnostic - the only contract is an HTTP POST. Plain HTML sets the form action to the URL; React or Vue intercept submit and send FormData with fetch; static-site generators ship the form as zero-JavaScript HTML. All three hit the same endpoint and get identical behaviour.
Where do submissions go after someone submits the form?
Every clean submission lands in your dashboard inbox in real time, triggers a notification email to each address you configured, and is stored so you can search and export it. When you need more than email - a CRM contact, a Slack message, a workflow - webhooks and integrations take over on paid plans.

Give your next important form a real home.

Start free with one form. Add ownership, private files, and clear history before responses pile up in inboxes.

·· no card · 50 submissions / mo · no countdown