SheetLink Forms beta

SheetLink Forms vs Netlify Forms

Netlify Forms is form handling built into a hosting platform; SheetLink Forms is a form endpoint independent of where your site lives. If you host on Netlify, the former is nearly free effort - the question is where you want the submissions to end up.

SheetLink Forms

SheetLink Forms is a hosted form endpoint that works from any site on any host: point a form action or fetch call at sheetlinkforms.com/f/your-token and accepted submissions become rows in a Google Sheet you pick or an Excel Online table. Delivery is direct to the Google Sheets API or Microsoft Graph - no connector in the middle - with retries at 5, 30, and 120 minutes, a delivery log, and formula-injection escaping. Screening quarantines suspicious submissions for one-click review; the optional sl.js embed adds AJAX submits, works in SPAs via MutationObserver, and attaches UTMs and ad click IDs to every row. Webflow and Framer get dedicated webhook endpoints. Free during beta (invite required), and no per-submission fees, ever. Start at how it works.

Netlify Forms

Netlify Forms is the form handling built into Netlify's hosting platform. Add a data-netlify="true" attribute to a form and Netlify detects it at build time, injects the plumbing, and collects submissions into the Netlify UI and API - no separate service, no JavaScript required, per their setup docs. It supports file uploads (up to 8 MB per request), spam filtering via Akismet plus honeypot fields and reCAPTCHA, and submission notifications by email or outgoing webhook. On Netlify's current credit-based plans, forms are free and unlimited, with per-site metering applying to legacy plans, per their usage and billing docs. If your site deploys on Netlify, it is the lowest-friction option that exists.

Side by side

SheetLink FormsNetlify Forms
Works on any hostYes - the endpoint is independent of hosting. The same form markup works on Netlify, Vercel, Cloudflare Pages, GitHub Pages, Webflow, Framer, or a VPS, and keeps working if you migrate hosts.Netlify Forms is a feature of Netlify hosting: detection happens when Netlify builds your site, so it applies to sites deployed on Netlify.
Spreadsheet deliveryThe primary destination: rows append under your header row in a Google Sheet (limited drive.file scope) or an Excel Online table, with automatic column mapping. The spreadsheet is the system of record, not an export.Submissions are stored in the Netlify UI and available via API and outgoing notification webhooks, per their docs; getting rows into a spreadsheet is wiring you build on top.
Spam handlingHoneypot, per-form/per-IP rate limits, origin allowlist, content heuristics with a strictness dial, timing signal, optional Turnstile - and quarantine with one-click review as the default outcome, so a false positive costs seconds, not a lead.Akismet-backed filtering plus honeypot fields and reCAPTCHA 2 integration, per their docs - a solid, low-configuration setup.
Ad attribution and click IDsAutomatic with the embed: utm_* plus gclid, wbraid, gbraid, fbclid, msclkid, persisted across pages and written into each row alongside the submission.Not part of the forms feature; you would add hidden fields populated by your own script before submission.
Pricing modelFree during beta (invite required); no per-submission fees, ever. Planned post-beta: free tier ~50 submissions/month, paid ~$15-19/month unmetered.On current credit-based Netlify plans, forms are free and unlimited; legacy plans meter submissions and upload storage per site, per their usage and billing docs. Hard to argue with free and unlimited.
File uploadsNot supported yet - multipart posts are accepted but file parts are dropped. Upload forms should stay on Netlify Forms.Netlify Forms wins here. File inputs work with up to 8 MB per request (one file per field), stored and downloadable from the Netlify UI, per their docs.
Platform webhooksDedicated inbound endpoints for Webflow and Framer - platforms Netlify Forms cannot serve, since their sites are not built by Netlify. One webhook covers every form on the site.Outgoing notification webhooks can POST each submission to a URL you choose - useful glue for downstream systems.
Email notificationsNone currently - the sheet and the dashboard quarantine queue are the surfaces. If you want an email per submission, Netlify Forms has it and we do not.Netlify Forms wins here. Email notifications per submission are built in and configured in a few clicks.
SPA and framework supportThe embed binds forms at runtime and watches for late-rendered ones via MutationObserver, so React/Vue/SPA forms work without hidden static mirrors; plain fetch to the endpoint also works from any framework.JavaScript-rendered forms need a hidden static HTML form (or matching SSR markup) so build-time detection can find the fields, plus a form-name hidden input, per their docs. Documented and workable, but a known gotcha.

Choose Netlify Forms when...

If your site deploys on Netlify and you want submissions with the least possible setup, use Netlify Forms - one attribute, no external service, free and unlimited on current plans, with uploads, Akismet filtering, and email notifications included. For a contact form on a Netlify-hosted site where the Netlify dashboard is a fine home for submissions, adding a third-party endpoint is complexity you do not need.

Choose SheetLink Forms when...

Choose SheetLink Forms when the destination or the host does not fit Netlify Forms: you want rows in a Google Sheet or Excel table rather than a hosting dashboard, your site lives (or might one day live) somewhere other than Netlify, you run Webflow or Framer sites, or you need ad click IDs attached to each lead. The endpoint outlives your hosting choices, and spam review is a quarantine queue rather than a filter you trust blindly. See how it works or the live demo.

FAQ

Can I migrate from Netlify Forms to SheetLink Forms?

Yes, and it is usually a one-line change. Point your form at your SheetLink endpoint:

<form action="https://sheetlinkforms.com/f/your-token" method="POST">
  <input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px">
</form>

Keep your existing inputs exactly as they are. Field names that match your sheet's column headers map automatically - the matching is case and punctuation insensitive, so "Email", "email", and "E-mail" all land in the same column - and explicit per-field mapping is available for anything that does not line up. If you submit with fetch or XHR, change the URL in your request the same way. Full request and response details are in the developer docs. You can drop the data-netlify attribute and the form-name hidden input - SheetLink identifies the form by its endpoint token instead.

Can I use both at once?

Not on the same form element in a straightforward way - a form has one action, and Netlify intercepts posts to your own site while SheetLink needs the post sent to your endpoint. If you want both destinations, post to SheetLink and let the sheet be shared, or use Netlify's outgoing notification webhooks to fan out from Netlify instead. Most teams pick one destination and keep the pipeline simple.

Netlify Forms is free and unlimited now - why pay for anything else?

If you host on Netlify and the Netlify UI is where you want submissions, you probably should not pay for anything else - that is an honest answer, and their usage and billing docs confirm forms are free and unlimited on credit-based plans. SheetLink Forms earns its place when you need what a host-bound inbox does not do: direct rows into Sheets or Excel with automatic column mapping, ad attribution on every row, quarantine-based spam review, and independence from any one host. During beta, SheetLink is free too.

My site is on Webflow or Framer, not Netlify. What are my options?

Netlify Forms only handles sites Netlify builds and serves, so it is not an option there. SheetLink Forms has dedicated webhook endpoints for both platforms: in Webflow, add a site-wide webhook on the "Form submission" trigger pointing at sheetlinkforms.com/w/webflow/your-token (one webhook covers every form, and the form name is recorded per row); in Framer, set the Form component's submission destination to your /w/framer/ URL. Setup details are in the developer docs.

Comparison facts reference Netlify Forms's public documentation and pricing pages and were checked at publish time; tell us if something is out of date.

Request an invite How SheetLink Forms works