A form with no backend is just a shape on a page. Here is what is missing, the three realistic ways to supply it, and one of them walked through end to end.
Short answer: an HTML contact form needs somewhere to send to, and a plain <form> with no action has nowhere. The quickest fix is a hosted form service — Formspree, Web3Forms and Getform all do this, all have free tiers, and all work by giving you a URL you paste into the form's action attribute. The more controllable fix is your own serverless function calling an email API such as Resend. Either way, send yourself a real test message before you call it done.
This is one of the most common things to go wrong with a small business website, and one of the least obvious. The page looks finished. The form has a name box, an email box, a message box and a Send button. Someone fills it in, presses Send — and nothing happens, or the page reloads with the boxes empty, and it looks like it worked. Enquiries have been vanishing for weeks before anyone notices.
Nothing is broken. There is simply no backend behind the form yet, and this guide is about supplying one.
HTML can draw a form. It cannot receive one. The markup describes the fields and the button; what happens when the button is pressed is decided by the form's action attribute — the address the browser sends the filled-in fields to.
With no action, the browser sends the fields back to the page they came from. That page is a static file, so it has no way to read them, and it just reloads. The visitor sees a blank form and reasonably assumes it went somewhere.
This is worth checking on any site you did not wire up yourself, whether it was built by a freelancer, from a template, or by an AI tool. Open the page source, find the <form> tag, and look for an action. If it is missing, or it points at #, the form does not send.
These are in order of effort. All three genuinely work; which is right depends on how much you want to own.
Formspree, Web3Forms and Getform all do the same job: you sign up, they give you an endpoint URL, you paste it into your form's action, and submissions arrive in your inbox and in a dashboard. No server, no code beyond that one attribute.
Hosts like Vercel and Netlify let you deploy a small piece of server code alongside a static site — a single file that receives the form's submission and does something with it. The usual something is calling an email API such as Resend to send the contents to the business owner. (That is what this site itself uses, which is why we are naming it rather than a service we have never touched.)
Netlify is worth a specific mention here: if the site is hosted there, adding a single data-netlify="true" attribute to the form gets you a working backend with no function to write at all. It is the shortest path of the three if you are already on that host.
Zapier and Make can both accept a form submission at a webhook URL and then do several things with it — email it, add a row to a spreadsheet, create a task, message a phone.
The hosted-service route, because it is the one anybody can finish today. The other two follow the same shape: get an endpoint, point the form at it, test it, then stop the spam.
https://formspree.io/f/abc123 or an access key to put in a hidden field. Copy it.<form> tag in your HTML and give it that URL and a method:
<form action="https://formspree.io/f/abc123" method="POST">
name. This is the step people miss, and it fails quietly. A field with no name attribute is not sent at all, so the email arrives with that field simply absent — which usually means the one you actually needed, the message.
<input type="email" name="email" required>
Send yourself a real message through the live form, filling in every field the way a customer would, and then check that:
name attribute above);Then check it again a month later. Free tiers expire, verification links go stale, and the failure mode of a contact form is silence, which looks identical to nobody getting in touch.
A public form on a public page gets found by bots quickly. Two things stop most of it without making the form harder for real people:
Whatever you use, do not put the destination email address in the page as plain text next to the form — that is scraped far more reliably than the form itself is abused.
If you would rather not do any of this: on any paid Scoutline plan, the full multi-page sites it builds arrive with the contact form already wired to a hosted backend — nothing to sign up for, no attribute to paste, no verification step. Enquiries are emailed to the business owner under their own business name, and they get a private link of their own to read them as they come in.
That is one path, and it only applies to sites built here. Everything above is the complete answer for a site that was not, and it is meant to be followed as it stands.
If the site was generated by an AI tool, the form is very often the one part that was never finished — the markup is written, the backend is not, and nothing in the output says so. It is not a fault in the design; it is that there was nowhere for a generator to send to. If you have just had a site built and are working through what is left before it goes live, from a folder of code to a live website covers the hosting and domain half of the same job.
Because an HTML form on its own has nowhere to send to. The markup draws the boxes and the button, but unless the form's action attribute points at something that receives the submission — a hosted form service, a serverless function, a script on your host — pressing Send either reloads the page or does nothing visible at all. Nothing is broken; there is simply no backend behind it yet.
A hosted form service such as Formspree, Web3Forms or Getform. You sign up, they give you a URL, you paste that URL into your form's action attribute, and submissions arrive in your email. It takes a few minutes, needs no server and no code, and every one of them has a free tier for low volumes. Check their current pricing pages for the monthly submission limits, which change.
Not for the hosted-service route — that is copy and paste into one line of your HTML. You would want a developer if you are writing your own serverless function and wiring an email API to it, or if the form has to write into a database, take payments, or fit into an existing system.