Forms on Netlify-hosted sites, straight to Google Sheets
Keep hosting on Netlify, point the form at an external endpoint - every submission lands as a row in Google Sheets or Excel, independent of where the site is deployed.
Netlify has a built-in forms product, and for plenty of sites it is a perfectly good choice. This page is for the other case: your site is hosted on Netlify and you want the form's destination to be a spreadsheet you own - a Google Sheet or an Excel Online table - reached through an endpoint that is independent of the host. SheetLink Forms gives every form a permanent endpoint at https://sheetlinkforms.com/f/{token} that accepts urlencoded, JSON, or multipart POSTs (bodies up to 256KB) and files each accepted submission as a row.
Delivery is direct: an asynchronous worker writes to the Google Sheets API or Microsoft Graph with retries at 5 minutes, 30 minutes, and 2 hours, and a delivery log records every attempt. Input names matching your column headers map automatically (case and punctuation insensitive). The full pipeline is described on how it works.
The product is free during beta and invite-gated - join the waitlist - and there are no per-submission fees, ever.
The best path for Netlify-hosted sites
The integration is a plain form action: set the form's action to your endpoint and you are done. You do not add the data-netlify attribute - that attribute is what asks Netlify's build to register the form for its own product, and here the post goes elsewhere. This works the same on a static Astro or Hugo build, an SSR framework deployment, or anything else Netlify serves. If you prefer a server hop, a Netlify Function can relay the post, but nothing requires it.
Three reasons people choose the external endpoint: the destination is the spreadsheet itself, where the data gets worked, rather than a submissions list to export from; sl.js captures ad attribution (utm_* plus gclid, fbclid, and other click IDs) next to every row; and the form is portable - move hosts and it keeps working unchanged. For a fuller feature-by-feature look, see SheetLink Forms vs Netlify Forms.
1. Connect a sheet and get your endpoint
Connect Google Sheets with one-click OAuth (the drive.file scope means the product only sees sheets you pick or create - never the rest of your Drive) or connect Excel Online and pick a table. You get a permanent endpoint of the form https://sheetlinkforms.com/f/{token}. On an empty sheet the header row is seeded for you; rows then append under it.
2. Point the form at your endpoint
Use the snippet above anywhere in your site's markup or templates. Leave out data-netlify and any Netlify-forms hidden inputs - they belong to the built-in product, and this form is posting elsewhere. Name inputs after your sheet's column headers so mapping is automatic; explicit per-field mapping is available in the dashboard.
3. Choose redirect or inline success
By default a successful HTML post follows a 303 redirect to a hosted thank-you page or a custom URL on your site. Add the sl.js embed and the same form submits by AJAX with inline success text instead - plus automatic honeypot injection, a timing signal, and ad attribution capture persisted in localStorage across pages.
4. Or relay through a Netlify Function
If you want server-side validation or enrichment before the row is filed, the commented function in the snippet forwards JSON to the endpoint and relays the {"ok":true,"id":"..."} response. It is optional - the form action alone is a complete integration - but it gives SSR apps on Netlify a single place to shape the payload.
5. Set origins and spam strictness
Add your netlify.app address and custom domain to the per-form origin allowlist so only your pages may submit. Spam screening runs at the endpoint: honeypot, per-form and per-IP rate limits, content heuristics with a strictness dial, optional Cloudflare Turnstile. Suspicious submissions are quarantined for one-click review, never silently dropped.
6. Test and read the delivery log
FAQ
Should I use this instead of Netlify Forms?
It depends on where you want the data. Netlify Forms is well integrated with the platform and collects submissions in the Netlify dashboard. An external endpoint fits when the working system is a spreadsheet, when you want ad attribution captured with each row, or when you want the form decoupled from the host. Both are legitimate architectures; the comparison page walks through the differences in detail.
Will Netlify's build try to process this form?
No. Netlify registers forms that carry the data-netlify attribute (or a matching hidden input). A form without it is just markup, and its action posts wherever it points - in this case, your SheetLink endpoint.
What happens if I move off Netlify later?
Nothing, and that is the point. The endpoint, the destination sheet, the field mapping, the spam settings, and the delivery history all live outside the host. Deploy the same markup to Vercel, Cloudflare Pages, or a VPS and submissions keep landing in the same sheet without a single change.
Does this work with SSR frameworks deployed to Netlify?
Yes. The integration is one HTTP POST, so it works from a static HTML page, an Astro or Hugo build, a Next.js or SvelteKit app running on Netlify's runtime, or a Netlify Function acting as a relay. Send Accept: application/json from server code to get the JSON response instead of the 303 redirect.
Are there per-submission charges?
No. SheetLink Forms has no per-submission or per-task fees, ever. During beta the product is free and invite-gated; the planned post-beta pricing is a free tier of roughly 50 submissions a month and an unmetered paid plan around $15-19 a month.
Also on: Vercel-hosted sites · Cloudflare Pages · Astro