PortForm vs Netlify Forms
What is the difference between PortForm and Netlify Forms?
Netlify Forms is a feature of the Netlify platform: its build system parses your HTML at deploy time and turns forms marked with data-netlify into handled forms. PortForm is a standalone endpoint that any site can post to, wherever it is hosted. The choice mostly turns on whether your site already builds on Netlify.
New to the category? Read what a form backend is and how a form endpoint works. Last verified: , against Netlify Forms's own pages listed under sources.
Netlify Forms and PortForm at a glance
| Topic | Netlify Forms | PortForm |
|---|---|---|
| How forms are set up | Built-in form detection lets the build system parse your HTML at deploy time. A form needs data-netlify="true" (or a netlify attribute). “You don’t need to include extra JavaScript on your site.” (Netlify docs: Forms setup) | No build step: point any form at the endpoint with an access key, on any host. |
| Where submissions go | Stored “in our user database” and viewed in the site’s Forms tab. Verified submissions can be downloaded as CSV, and the Netlify API can read or delete them. (Netlify docs: Form submissions) | 30 days of submission history on every plan; export CSV or JSON on every plan. |
| Cost | On credit-based plans, forms are free and unlimited with no metering. On legacy plans, verified submissions and file storage are metered per site; the tier prices are Not verified from the vendor’s current public documentation. (Netlify docs: Forms usage and billing) | 300 submissions per 30 days, unlimited forms, no card; $9/month ($91 billed yearly), 10,000 submissions |
| Retry and failure handling | Not verified from the vendor's current public documentation. | Stored first. The notification email is attempted once, best-effort; a submission with no recorded attempt after 10 minutes gets one late recovery attempt, and failed sends can be retried manually from the dashboard. Integrations are retried automatically, up to 5 attempts over about two and a half hours |
What Netlify Forms does well
- No separate service: forms live in the same platform as the site, its deploys and its admin panel. (Netlify docs: Forms setup)
- Akismet spam filtering on every submission, with separate Verified and Spam lists you can re-classify, plus a honeypot attribute and reCAPTCHA 2. (Netlify docs: Spam filters)
- Notifications by email, Slack (via the Netlify app for Slack) and outgoing webhooks; Zapier and n8n are mentioned. (Netlify docs: Form notifications)
- Automatic sanitization of submitted HTML, such as script tags. (Netlify docs: Form submissions)
- Submissions and forms manageable through the Netlify API. (Netlify docs: Form submissions)
Where PortForm differs
PortForm stores each submission first, then attempts the email, then runs integrations. See delivery retries for exactly what is and is not retried.
- Where the form is defined. Netlify detects forms when your site is built and deployed; PortForm needs no build step, so a form can be added to a page on any host, including a CMS or a site you cannot rebuild.
- Hosting dependence. Netlify’s form detection happens in its build system. Whether Netlify Forms can be used on a site hosted elsewhere is Not verified from the vendor’s current public documentation.
- Data requests. Netlify’s docs recommend exporting and deleting submissions regularly if a form collects personal data. PortForm deletes submissions after 30 days on every plan.
- Delivery order. PortForm documents store, then email (best-effort, sent from PortForm’s own domain), then integrations with retries. Netlify sends email from formresponses@netlify.com; its retry behavior is Not verified from the vendor’s current public documentation.
Pricing and limits
PortForm’s current prices are on the pricing page and its limits in the docs. Competitor prices are as listed on the dates above and change; check Netlify Forms’s own pricing before deciding.
| Topic | Netlify Forms | PortForm |
|---|---|---|
| Credit-based Netlify plans | Forms are free and unlimited, with no metering. (Netlify docs: Forms usage and billing) | 300 submissions per 30 days, unlimited forms, no card |
| Legacy Netlify plans | Verified submissions and file-upload storage are metered per site; usage steps up to the next level automatically. Free submission count and tier prices: Not verified from the vendor’s current public documentation. (Netlify docs: Forms usage and billing) | $9/month ($91 billed yearly), 10,000 submissions |
Features
| Topic | Netlify Forms | PortForm |
|---|---|---|
| Spam protection | Akismet by default; optional honeypot; reCAPTCHA 2 (Netlify-provided or your own keys). (Netlify docs: Spam filters) | Honeypot on every plan; hCaptcha on Free; reCAPTCHA and Turnstile on Pro and Agency |
| File uploads | 8 MB maximum request size, 30-second timeout, one file per field. (Netlify docs: Forms setup) | Pro: up to 3 files per submission, 5 MB each |
| Notifications | Email from formresponses@netlify.com; Slack; webhooks. Reply-To is set from an input named email. (Netlify docs: Form notifications) | Email with Reply-To set from the email field; Pro and Agency: Slack, Discord, Telegram, Google Sheets, Notion, Airtable, HubSpot and webhooks (Zapier, Make and n8n connect through webhooks) |
| AJAX | Body must be URL-encoded, not JSON. (Netlify docs: Forms setup) | A plain HTML form post with a hidden access_key field works with no JavaScript; JSON, multipart and fetch also work |
| Export | CSV download of verified submissions; Netlify API. (Netlify docs: Form submissions) | CSV and JSON export. |
When Netlify Forms may make more sense
- If your site already builds and deploys on Netlify and you want forms inside the same dashboard. (Netlify docs: Forms setup)
- If you want Akismet-based spam filtering with a reviewable Spam list. (Netlify docs: Spam filters)
- If credit-based Netlify plans make forms free for you. (Netlify docs: Forms usage and billing)
Migrating from Netlify Forms to PortForm
Migration means changing a form’s action and key, not moving data automatically. Ready-made forms are in templates, for example Basic HTML contact form and Ajax contact form.
- Create a PortForm form, copy the access key, and change the form’s action to PortForm’s endpoint. Remove the data-netlify attribute.
- Netlify’s honeypot attribute maps to PortForm’s botcheck field.
- Netlify uses an input named email for Reply-To; PortForm does the same.
- Netlify’s AJAX submissions must be URL-encoded; PortForm accepts URL-encoded, multipart and JSON.
- Export CSV from Netlify’s Forms tab before deleting a form: deleting a form deletes its submissions and future posts return 404.
For how a static site posts a form to an external endpoint, see a form backend for static sites.
Which should I use?
There is no single answer. It depends on which requirement matters most to you.
- If your priority is your site is already on Netlify and you want one dashboard, the relevant difference is: Netlify Forms is built into that platform. (Netlify docs: Forms setup)
- If your priority is the page is not built on Netlify, or you cannot rebuild it, the relevant difference is: PortForm needs no build step and accepts posts from any host.
- If your priority is you want Akismet-style filtering with a reviewable spam list, the relevant difference is: Netlify documents it. (Netlify docs: Spam filters)
Questions about Netlify Forms and PortForm
- What is the difference between PortForm and Netlify Forms?
- Netlify Forms is part of the Netlify platform and detects forms at deploy time. PortForm is a standalone form endpoint that any site can post to.
- Does Netlify Forms store submissions?
- Yes. Netlify says submissions are stored in its user database and viewable in the site’s Forms tab.
- Do I need JavaScript for Netlify Forms?
- No. Netlify’s docs say you do not need to include extra JavaScript.
- Can I use Netlify Forms outside Netlify?
- Not verified from the vendor's current public documentation.
Sources
Every Netlify Forms statement above was read from these first-party pages on . Anything not found there is marked as not verified.