PostForm

Form submissions in your inbox, without a backend.

Point any HTML form at PostForm. We store the submission, filter the spam, and email it to you. No server to run, no JavaScript to write, 300 submissions every 30 days free.

No credit card · No trial clock · A hard cap, not a countdown

The PostForm dashboard: a sidebar of forms and workspace pages, quota for the period, total submissions, spam blocked, a 30 day submission history chart, and a list of forms.

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.

index.html
<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.com

New submission via Contact form.

nameJordan Fisher
emailjordan@example.com
messageDo 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.

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. 1

    Create a form

    Sign up and you get an access key and a destination address straight away.

  2. 2

    Paste the snippet

    Set your form action to our endpoint and drop the key in a hidden input.

  3. 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.

The submission log: today's count, delivery rate, average delivery time and spam blocked across the top, then Inbox, Needs attention, Spam, Failed, Test and All views, a list of submissions on the left, and the selected one expanded on the right showing name, email, message and a delivered badge.

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.

The integrations page: connected count, delivered today, success rate and retry queue across the top, three connected integrations (Slack, a webhook and Google Sheets), then the catalogue grouped into Notifications and Developer.
Route a submission to Slack, a webhook, or a spreadsheet. Delivery is retried and logged.

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 form

No 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.