SheetLink Forms beta

Forms on Netlify-hosted sites, straight to Excel

Keep hosting on Netlify, point the form at an external endpoint - every submission lands as a row in an Excel table on OneDrive, 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 a different case: your site is hosted on Netlify, but the place submissions need to end up is an Excel workbook - the one your team, your client, or your ops process already lives in. 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 inserts each accepted submission as a row in an Excel table on OneDrive, via Microsoft Graph - live rows in the workbook itself, not a submissions list you export from. Google Sheets is available as a destination on exactly the same terms.

Delivery is handled by an asynchronous worker with retries at 5 minutes, 30 minutes, and 2 hours, and a delivery log records every attempt. Input names matching your table's column names map automatically (case and punctuation insensitive). Worth knowing: no other hosted form backend - Formspree, Basin, Formcarry - offers a native Excel Online destination; the standard workaround is Zapier or Power Automate metering each submission as a task. 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 workbook itself, where the data gets worked (and where Power BI can pick it up), rather than a dashboard 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.

<!-- On any Netlify-hosted site. Note: no data-netlify attribute - the form posts to the external endpoint instead. --> <form action="https://sheetlinkforms.com/f/slf_yourtoken" method="POST"> <input name="Name" placeholder="Name"> <input name="Email" type="email" placeholder="Email"> <textarea name="Message" placeholder="Message"></textarea> <!-- Honeypot: keep it in the form, leave it empty --> <input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px"> <button type="submit">Send</button> </form> <!-- Optional: AJAX submit + ad attribution capture --> <script src="https://sheetlinkforms.com/sl.js" data-token="slf_yourtoken"></script> /* Optional relay instead: netlify/functions/contact.mjs export default async (req) => { const fields = await req.json(); const res = await fetch("https://sheetlinkforms.com/f/slf_yourtoken", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ...fields, _slhp: "" }), }); return Response.json(await res.json(), { status: res.status }); }; */

1. Connect Excel Online and get your endpoint

Connect a Microsoft account via OAuth in the dashboard - Microsoft 365 or a personal Microsoft account with OneDrive - and pick the workbook and table submissions should land in. The table's columns define the row shape: SheetLink Forms syncs column names from the table, so create it with its columns before you point the form at the endpoint (there is no header seeding on Excel, unlike the Google Sheets destination). You get a permanent endpoint of the form https://sheetlinkforms.com/f/{token}.

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 table's columns 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 open the workbook

Send a test submission, then open the workbook in Excel on the web or the desktop app - the row was inserted into the live OneDrive file, so it is simply there. The delivery log shows every attempt, and the docs list the error responses: 404 unknown token, 410 paused form, 403 origin not allowed, 413 payload too large, 429 rate limited, 400 unreadable body.

FAQ

Should I use this instead of Netlify Forms?

It depends on where you want the data to live. Netlify Forms is well integrated with the platform and collects submissions in the Netlify dashboard. An external endpoint fits when the working system is an Excel workbook, 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.

Netlify Forms can export a CSV - how is this different?

An export is a snapshot you have to fetch, import, and reconcile; this is a Microsoft Graph table-row insert into the workbook itself. Rows appear in Excel on the web and the desktop app as they are delivered, formulas and pivot tables over the table pick them up, and Power BI can connect to the workbook for dashboards that stay current without anyone touching an export button.

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.

Does the Excel table need to exist before I go live?

Yes. Rows land in a table object inside the workbook, and the table's columns define the row shape - column names are synced from the table rather than seeded by the product (that seeding behavior belongs to the Google Sheets destination). Create the table with its columns in Excel, pick it in the dashboard, and field-to-column matching handles the rest, with explicit mapping available for mismatched names.

What happens if I move off Netlify later?

Nothing, and that is the point. The endpoint, the destination workbook, 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 Excel table without a single change.

Are there per-submission charges?

No. SheetLink Forms has no per-submission or per-task fees, ever - unlike the Zapier or Power Automate routes to Excel, which meter every submission. 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: Netlify-hosted sites · Next.js · Plain HTML · Webflow

Request an invite See the live demo