How to add a contact form to a static site
A static site cannot receive a POST request on its own. Here is the shortest working path: one action attribute, one redirect, one honeypot field.
Read the articleBlog
Every article is written against the real endpoint documented in the docs. No invented benchmarks, no vendor smackdowns.
A static site cannot receive a POST request on its own. Here is the shortest working path: one action attribute, one redirect, one honeypot field.
Read the articleCost, control and maintenance compared between a hosted form backend and your own API route — including the cases where building it yourself is the right call.
ReadWhy emailing CSV exports and sharing logins both fail, and how per-form read-only access with revocable invitations works in practice.
ReadCAPTCHAs ask every visitor to prove they are human. A honeypot asks only the bots. Here is where each one works, and why the strongest setup uses several cheap layers.
ReadA public form endpoint is unauthenticated by design. Here is what genuinely protects it — and which popular measures are theatre.
ReadSending a CSV every Friday is not a client portal. Here is the access model that works: one permission per form, read-only by default, revocable in one click.
ReadLayered spam defence for public forms: honeypots, rate limits, origin allow-lists, idempotency and content checks — and when a CAPTCHA is actually worth the friction.
ReadDuplicates come from three places: a double click, a retried request after a timeout, and a refreshed thank-you page. Each needs a different fix.
ReadA complete React form with controlled inputs, client validation, a real POST request and accessible error handling — no form library required.
ReadMost form schemas start as a column per field and end as a migration every time marketing changes a question. Here is the shape that avoids that, and the fields to never store.
ReadThree working patterns for Next.js App Router forms: a server action, a client fetch, and a plain HTML form. Plus where the data should live.
ReadNative form submission is faster, works without JavaScript, and is easier to make accessible. fetch() gives you inline validation and no page reload. Here is how to decide.
ReadPoint an existing HTML form at a hosted endpoint, choose the right response format, and read the submissions in a dashboard. No server required.
ReadA form backend receives, validates, stores and delivers the data behind an HTML form. Here is what it replaces, what it does not do, and how to choose one.
Read