- HTML
- React
- Next.js
- Vue
- Svelte
- Astro
- Hugo
- WordPress
- Framer
- Webflow
In one paragraph
What is PostForm?
PostForm is a form backend: a hosted endpoint that receives submissions from an HTML form, stores them, filters the spam, and emails them to you. You point a form's action attribute at it and add your access key as a hidden input. There is no server to deploy, no database to run and no JavaScript required, so a static site can take contact form submissions without becoming a dynamic one. Every submission is stored before it is emailed, so a failed notification never costs you the message. The free tier covers 300 submissions per rolling 30 days across unlimited forms and unlimited domains, with no credit card and no trial clock. Anything that can make an HTTP request works the same way, React, Vue, Astro, Hugo and WordPress included.
The integration
There is no step two. This is the whole thing.
One action attribute and one hidden input, in a file you already have. Anything that can make an HTTP request works the same way, no SDK, no build step, no API call to write.
<form action="https://postform-wine.vercel.app/api/submit" method="POST">
<input type="hidden" name="access_key" value="your-access-key" />
<input type="text" name="name" required />
<input type="email" name="email" required />
<textarea name="message" required></textarea>
<button type="submit">Send</button>
</form>Seconds later
Someone fills it in, and this lands.
Every field they submitted, in the order you asked for them. Nothing to configure and no DNS records on your side.
New submission from PostForm
reply-to: jordan@example.comNew submission via Contact form.
| name | Jordan Fisher |
| jordan@example.com | |
| message | Do you support file uploads on the Pro plan? |
Sent by PostForm
Reply-to is the sender
Answering the email answers the person who filled it in.
Your field names, your order
The email mirrors the form, no mapping step, no schema.
Sent from our domain
Nothing to verify, no DNS records, no warm-up.
The problem
A form is the easy part.
Receiving one is where the work is. The moment a static site needs a contact form it stops being a static site, and this is the list you have signed up to build, run and keep running.
- What you would build
- With PostForm
- An endpoint to receive the POST
- One action attribute
- An email provider, and the DNS to make it deliver
- Nothing. We send it
- Spam filtering that survives contact with real bots
- One hidden input
- A database, so a failed send is not a lost lead
- Nothing. Stored on arrival
- Somewhere to read it all back
- The dashboard
How it works
One tag on the form you already have.
From signed out to receiving mail, in the order it actually happens.
- 1
Create a form
Sign up and you get an access key and a destination address straight away.
- 2
Paste the snippet
Set your form action to our endpoint and drop the key in a hidden input.
- 3
Read your mail
Submissions arrive by email and stay in the dashboard for as long as you keep them.
Works without JavaScript
A plain <form action="..."> is the whole integration. No fetch, no bundle, no hydration. If your site is static HTML, it already works.
Spam never reaches you
A hidden honeypot field plus per-key rate limiting. Blocked attempts are logged so you can see them, but they are never emailed and never counted against your quota.
Nothing is ever lost
Every submission is written to the database before we try to send it. Email is best effort; storage is not. A bounced address costs you a notification, not a lead.
The record
Email is the notification. The log is the record.
Every submission is stored the moment it arrives, whether or not the email lands. Open one and you see exactly what was posted, which form it came through, whether the honeypot caught it, and whether the provider accepted the send.

Once forms are running
It stops being a form endpoint fairly quickly.
The parts you need once forms are actually running. Which plan each one belongs to is in the pricing table.
Webhooks and automations
POST every submission to your own endpoint, or to Zapier, Make and n8n.
More than one inbox
Link several addresses and route each form to the one that should get it.
Teams and workspaces
Invite people, give them a role, and read the audit log of what they changed.
Delivery you can inspect
Per-form accept rate, delivery rate, spam rate and rate-limit refusals, all as numbers.
Your data, on request
Download keys, submissions, integrations and audit events as one JSON file.
Agent access
Scoped tokens let Claude Code and other MCP clients manage your forms for you.

Templates
Or don't write the form either.
6 complete forms (contact, survey, upload, widgets) with the endpoint and the honeypot already wired in. Preview one, copy it, change the access key.
Pricing
Pricing that starts at nothing.
The free tier is a hard cap, not a trial: 300 submissions every rolling 30 days from your own last reset. Go over and submissions are refused with an error you can read, never billed by surprise, never silently dropped.
Personal
Free
Free forever
A hard cap, not a countdown
Create your formNo credit card required
- Unlimited forms
- 300 submissions per rolling 30 days
- Unlimited domains
- Advanced spam protection
- hCaptcha integration
- Custom redirect page
- All basic features
Pro
Popular choice$9/mo
Billed monthly
Save $30+ with yearly plan
Secure payment by Paddle.
Cancel anytime.
- Everything in Personal
- 10k monthly submissions
- Team collaboration
- File upload / attachments
- reCAPTCHA & Cloudflare Turnstile
- Autoresponders / auto reply
- Restrict to domains
- 3rd party integrations (webhooks)
- Google Sheets, Notion, Slack, etc.
- Multiple email recipients
- Add CC emails & more
Agency & Team
$29/mo
Billed monthly
Save $68+ with yearly plan
Secure payment by Paddle.
Cancel anytime.
- 20k monthly submissions
- Team collaboration
- 20 email addresses included
- Unlimited emails with add-ons
- Manage from a single account
- Dedicated support
Questions
Questions people actually ask
Is my access key a secret?
No, and it is not meant to be. It is a routing id, the same way a mailto: address is. It says where a submission goes, not who is allowed to send one. Anyone can read it in your page source, which is why the protection is per-key rate limiting, spam filtering and quota rather than secrecy. Leaking one is not an incident; if a key is being abused, rotate it in the dashboard.
What happens when I hit 300 submissions?
New submissions are rejected with a clear error until the window rolls over. Nothing is silently dropped, nothing is billed, and everything already stored stays where it is. The dashboard warns you well before you get there, and shows the pace you are on.
Is the window a calendar month?
No. It is a rolling 30 days from your last reset, so there is no first-of-the-month stampede and no short-February edge case.
Do you send the email from my domain?
Notifications come from our sending domain with your submitter as the reply-to, so hitting reply answers the person who filled in the form. No DNS setup on your side.
What about the data of people who fill in my forms?
They are your data subjects, and we are the processor. There is a DPA you can read before you sign up, submissions are deletable from the dashboard, and a full export is one click.
Does it work with React, Vue, Astro, Hugo, WordPress?
Yes. The endpoint takes form encoding, multipart and JSON, so anything that can make an HTTP request can use it. The docs carry a ready-made snippet for each.
Everything else is in the docs.
Your form works in about a minute.
Create an account, copy your access key, paste the snippet. Or look around the demo first. It takes no signup and no email address.
