Forms to Excel Online
Every submission lands as a row in an Excel table you pick in your Microsoft 365 workbook - written directly through Microsoft Graph, with the table's own columns defining the shape of the data.
Rows into a real Excel table, not an export
Plenty of tools claim Excel support and mean "download a CSV." SheetLink Forms means something stricter: an asynchronous worker writes each accepted submission directly into an Excel table in your Microsoft 365 workbook, through the Microsoft Graph API - no Zapier, no middleman, no per-submission fees, no export step that goes stale the moment it finishes.
The distinction between a table and a plain range matters in Excel. A table is a named, structured object: it has defined columns, it grows as rows are added, and everything bound to it - structured references, PivotTables, Power Query loads - follows along automatically. That structure is exactly what a stream of form submissions needs. The overall pipeline from endpoint to delivered row is laid out on the how it works page.
Setup: create the workbook, format the header as a table
The Excel Online destination writes into a table you pick, so the table has to exist first. The setup is a few minutes in Excel:
- Create a workbook in your Microsoft 365 account (OneDrive or SharePoint, wherever your team works).
- Type a header row - one cell per field you expect: Name, Email, Message, and any attribution columns you want.
- Select the header row and format it as a table (Insert -> Table, or Home -> Format as Table), confirming "My table has headers."
- In SheetLink Forms, connect Microsoft 365 and pick that workbook and table as the form's destination.
From then on, submissions to your endpoint at https://sheetlinkforms.com/f/{token} append as new table rows. The table expands row by row, and anything referencing the table sees the new data without touching a range address.
The table's columns define the shape
With Excel Online, the table is the contract: its columns define the row shape. Whatever columns the table declares are the cells a submission can fill, in the order the table declares them. This is a feature, not a limitation - it means you decide the schema in Excel, with Excel's own tools, and the form conforms to it.
Want a column the form does not send, for a salesperson's notes or a status dropdown? Add it to the table; it stays empty on incoming rows and your team fills it in. Want to reorder columns? Reorder them in the table. The form does not impose its structure on your workbook - your workbook imposes its structure on the form. If you change your mind about the schema later, adjust the table and the mapping, and new rows follow the new shape.
Auto-mapping by column name
Incoming field names that match the table's column headers map automatically, case and punctuation insensitive - email, Email, and E-mail all land in an "Email" column. Name your form inputs the way you named your table columns and most forms need no mapping configuration at all.
Where names differ, explicit per-field mapping pins any incoming field to any table column, so an old form posting fname can still fill a "First Name" column. And if you use the sl.js embed, attribution values - utm_source through utm_content, plus gclid, wbraid, gbraid, fbclid, and msclkid - are captured from the URL and persisted across pages; add matching columns to the table and each row carries its marketing origin into Excel.
A submission, end to end
A plain HTML form is enough to feed the table:
<form action="https://sheetlinkforms.com/f/YOUR_TOKEN" method="POST">
<input name="Name">
<input name="Email" type="email">
<input name="Company">
<input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px">
<button>Send</button>
</form>The hidden _slhp input is the honeypot - the one signal that marks spam outright. Everything else suspicious (rate limits, content heuristics, timing signals) goes to quarantine for one-click review, and approving delivers the row; nothing is silently dropped. Backends can POST JSON to the same endpoint instead. Either way, cell values are guarded against formula injection - leading =, +, -, and @ are escaped - which matters in a workbook where a planted formula could otherwise execute against your data. Request formats live in the docs.
Direct Microsoft Graph delivery, with a paper trail
Delivery is asynchronous and direct: the worker calls Microsoft Graph and appends the row to your table. No third-party automation platform sits in the middle metering tasks, adding latency, or introducing its own failure modes. If a write fails - a token needs refreshing, Microsoft has a moment - the worker retries at 5 minutes, 30 minutes, and 2 hours, and the dashboard's delivery log records the outcome per submission.
The practical effect: a submission is always in exactly one of three states - delivered as a row, retrying on a schedule, or quarantined awaiting your review. There is no fourth state where it evaporated between the form and the workbook.
When teams pick Excel over Sheets
If your organization lives in Microsoft 365, the answer is usually already decided: the leads workbook sits in SharePoint next to everything else, access follows the permissions your IT team already manages, and nobody wants a lone Google account bolted onto the side of the stack.
Beyond org gravity, Excel earns the pick on its own when the downstream work is Excel-shaped: PivotTables and structured references built on the submissions table, Power Query pulling the table into reporting models, or analysts who simply do their real work in Excel and want form data to arrive where they already are. Because rows land in a table, all of those consume new submissions automatically.
If your team runs on Google Workspace instead, the same pipeline - same endpoint, same screening, same retries - delivers to Google Sheets with a one-click drive.file connection. The destination is a detail; the ledger behavior is identical.
Getting started
Create the workbook, format the header row as a table, connect Microsoft 365, pick the table, and point your form's action (or your backend's POST) at your endpoint. From the first submission onward, rows append and the table grows.
SheetLink Forms is free during beta, with an invite required - join the waitlist from the homepage. There are no per-submission or per-task fees, ever; the planned post-beta pricing is a free tier of roughly 50 submissions per month and an unmetered paid plan around $15-19/mo. To see the delivery pipeline in action first, the live demo shows a real form writing rows in real time, and how it works covers the path from POST to row in detail.
Platform-specific setup guides: Webflow, Framer, plain HTML, Squarespace, Wix, Next.js, React, Shopify, Netlify, and Carrd.
FAQ
Why does Excel Online delivery require a table instead of a plain range?
A table is a structured, named object in Excel: its columns define the row shape, it grows cleanly as rows append, and PivotTables, structured references, and Power Query loads bound to it pick up new rows automatically. Appending to a bare range offers none of that. Format your header row as a table once (Insert -> Table) and pick it as the destination.
Do I create the workbook, or does SheetLink Forms create it for me?
You create it. Make a workbook in your Microsoft 365 account, add a header row with the columns you want, format it as a table, then pick that table when connecting the destination. The table's columns define what each submission row looks like, so the schema stays under your control in Excel.
What if my form sends a field that has no matching table column?
Auto-mapping matches field names to column headers case and punctuation insensitively, and explicit per-field mapping covers names that differ. The table's columns define the row shape, so to capture a new field, add a column for it to the table (or map the field to an existing column). Table columns with no matching field simply stay empty on incoming rows.
Does delivery go through Zapier or another automation platform?
No. The delivery worker writes rows directly through the Microsoft Graph API, with automatic retries at 5 minutes, 30 minutes, and 2 hours and a per-submission delivery log in the dashboard. There is no middleman metering tasks and no per-submission fees on our side either.
Can I capture ad attribution in the Excel table?
Yes. Add the sl.js embed to your site and it captures utm_source through utm_content plus gclid, wbraid, gbraid, fbclid, and msclkid from the URL, persisting them across pages until submission. Add matching columns to your table and each row arrives with its marketing origin. The Google Sheets destination supports the same columns.