A contact form that just emails you.
The most common form on the web, and the one you should never build a server for. PortForm takes the submission, stores it, filters the spam and sends it to whatever inbox you choose.
Your form
Plain HTML on your site
PortForm
Stored · spam filtered · emailed
Your inbox
Every submission, with Reply-To set
Dashboard
Searchable, exportable to CSV
Integrations
Slack, Sheets, CRM, webhooks
A static site can’t send email on its own. The usual answers are a third-party script that leaks your address to spammers, or a serverless function you now have to maintain forever.
A plain HTML contact form posts to PortForm. Set Reply-To from the sender’s email so you can answer straight from your inbox, redirect visitors to your own thank-you page, and keep a searchable copy of every message.
Point this at PortForm and it works.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />
<title>Get in touch</title>
<style>
*, *::before, *::after { box-sizing: border-box; }
body {
margin: 0;
padding: 32px 16px;
font-family: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
background: #f4f4f5;
color: #18181b;
}
.card {
max-width: 460px;
margin: 0 auto;
padding: 28px;
background: #fff;
border: 1px solid #e4e4e7;
border-radius: 12px;
}
h1 { margin: 0 0 6px; font-size: 20px; }
.sub { margin: 0 0 22px; font-size: 14px; color: #71717a; }
.field { margin-bottom: 16px; }
label { display: block; margin-bottom: 6px; font-size: 13px; font-weight: 500; }
input, textarea, select {
width: 100%;
padding: 10px 12px;
font: inherit;
font-size: 14px;
color: #18181b;
background: #fff;
border: 1px solid #d4d4d8;
border-radius: 8px;
}
input:focus, textarea:focus, select:focus {
outline: 2px solid #18181b;
outline-offset: 1px;
border-color: transparent;
}
textarea { min-height: 110px; resize: vertical; }
button {
width: 100%;
padding: 11px 16px;
font: inherit;
font-size: 14px;
font-weight: 500;
color: #fff;
background: #18181b;
border: 0;
border-radius: 8px;
cursor: pointer;
}
button:hover { background: #3f3f46; }
button:active { transform: scale(0.99); }
button[disabled] { opacity: 0.6; cursor: default; }
/* Hidden from people, filled in by bots. Never remove it. */
.hp { display: none; }
</style>
</head>
<body>
<form class="card" action="https://app.portform.co/api/submit" method="POST">
<h1>Get in touch</h1>
<p class="sub">Fill in the form and we'll reply by email.</p>
<input type="hidden" name="access_key" value="YOUR_ACCESS_KEY" />
<input type="checkbox" name="botcheck" class="hp" tabindex="-1" autocomplete="off" />
<div class="field">
<label for="name">Name</label>
<input id="name" type="text" name="name" autocomplete="name" required />
</div>
<div class="field">
<label for="email">Email</label>
<input id="email" type="email" name="email" autocomplete="email" required />
</div>
<div class="field">
<label for="message">Message</label>
<textarea id="message" name="message" required></textarea>
</div>
<button type="submit">Send message</button>
</form>
</body>
</html>Replace YOUR_ACCESS_KEY with the access key from your dashboard. Create one free. The endpoint and the honeypot are already wired in.
The features this use case leans on.
Reply-To wired in
The sender’s email becomes the Reply-To, so hitting reply in your inbox answers them directly.
Custom fields
Any field name you add is forwarded and stored: subject, phone, order number, whatever the enquiry needs.
Your own thank-you page
Add a redirect field and a successful submit lands on a page you control, not a generic one.
Spam filtered
Honeypot on every plan, plus hCaptcha free and Turnstile/reCAPTCHA on Pro.
Integrations that fit this use case.
Integrations are a Pro feature. On any plan, every submission still reaches your inbox and dashboard. See plans.
Why it fits contact forms.
- The single most-copied form on the web, working in a minute.
- Answer from your own inbox: Reply-To is set for you.
- Every message stored and searchable, not just emailed and gone.
Templates for contact forms.
Copy one, swap the access key, and it posts here from any page, including a static site. New to this? See what a form backend and a form endpoint are.
Other use cases
- Waitlist formsCollect early signups before you have a product.
- Newsletter signupCapture subscribers straight into your inbox or a sheet.
- Lead captureRoute new leads to your inbox, Slack, or CRM.
- Feedback formsLet customers tell you what to fix, straight to your inbox.
- Survey formsMulti-question responses collected as one submission.
- Job application formsCollect applications and résumés in one submission.
- Event registrationRSVPs and sign-ups collected straight to your inbox.
- Customer supportA support form that reaches your team fast.
- Demo requestsQualify and route demo requests to sales.