Run a survey without a survey tool.
Every question is a named field; the whole thing posts as one submission. PortForm stores each response and hands you a CSV to analyse in whatever you already use.
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
Survey platforms lock your responses behind their dashboard and their pricing. For a handful of questions you want the raw answers, in a spreadsheet, that you own.
Build the survey as ordinary form fields, short answers, long answers, multiple choice, even one-question-per-screen. It posts as a single submission, gets stored, and exports to a CSV or a Google Sheet you control.
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>Quick survey</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>Quick survey</h1>
<p class="sub">Three questions, about a minute.</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="role">Role</label>
<input id="role" type="text" name="role" autocomplete="organization-title" required />
</div>
<div class="field">
<label for="found">How did you find us?</label>
<select id="found" name="found" required>
<option value="">Choose…</option>
<option>Search</option>
<option>Social</option>
<option>A friend</option>
<option>Somewhere else</option>
</select>
</div>
<div class="field">
<label for="message">What are you hoping this solves?</label>
<textarea id="message" name="message" required></textarea>
</div>
<button type="submit">Submit answers</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.
Any question type
Text, textarea, select, radio, checkbox: all standard inputs, all stored under the names you give them.
One submission per response
Every field posts together, so a response is one row, not scattered events.
Own your data
ProExport to CSV or sync to Google Sheets and analyse it anywhere, the responses are yours.
Multi-step if you want
One-question-per-screen still posts as a single submission, see the copyable template.
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 survey forms.
- Raw responses in a spreadsheet you own, not a locked dashboard.
- Any mix of question types, no builder to learn.
- One submission per respondent, clean to analyse.
Templates for survey 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.
- Contact formsThe classic name / email / message, delivered to your inbox.
- 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.
- 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.