SheetLink Forms beta

Shopify forms to Google Sheets

A custom form in your theme posts straight to a spreadsheet - contact requests, wholesale inquiries, and quote forms as rows, not notification emails.

A Shopify store collects more than orders: contact requests, wholesale inquiries, custom quote forms, stockist applications. Out of the box those end up as notification emails, which is where working a lead list goes to die. SheetLink Forms turns each of those forms into rows - every submission lands in Google Sheets or an Excel Online table, appended under your header row, with delivery handled by an asynchronous worker talking directly to the Google Sheets API or Microsoft Graph. No Zapier, no per-submission fees.

One thing to be plain about up front: Shopify's native contact form ({% form 'contact' %}) posts to Shopify's own handler, so it cannot simply be pointed elsewhere. Sending submissions to SheetLink Forms means adding a custom form to your theme - a small theme edit, a copy-paste job in a Custom Liquid block or a section file, not app development. The snippet below is the entire thing.

SheetLink Forms is free during beta and invite-gated - join the waitlist - and there is a live demo feeding a public sheet if you want to see rows land first.

The best path for Shopify

The best path on Shopify is a custom HTML form added through a theme edit, with its action pointed at your endpoint (https://sheetlinkforms.com/f/{token}). The endpoint accepts the standard urlencoded post and 303-redirects to a thank-you page or a custom URL - your storefront needs no JavaScript for this to work.

Optionally, load the sl.js embed in theme.liquid before </body>. It binds any form whose action points at /f/, upgrades it to an AJAX submit with inline success text (no navigation away from the product page), auto-injects the honeypot, and - the part store owners running ads care about - captures utm_* plus gclid, wbraid, gbraid, fbclid, and msclkid from the landing URL and persists them in localStorage, so the click that produced an inquiry is still attached when the visitor submits three pages later.

<!-- Add via a "Custom Liquid" section block, or a snippet in Online Store -> Themes -> Edit code --> <form action="https://sheetlinkforms.com/f/slf_yourtoken" method="POST"> <input type="text" name="Name" required> <input type="email" name="Email" required> <textarea name="Message"></textarea> <!-- Honeypot: keep exactly as-is --> <input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px"> <button type="submit">Send</button> </form> <!-- Optional: in theme.liquid before </body>, for AJAX submit + ad attribution --> <script src="https://sheetlinkforms.com/sl.js" data-token="slf_yourtoken"></script>

1. Connect a sheet and get your endpoint

Connect Google Sheets with one-click OAuth. The drive.file scope means SheetLink Forms only sees sheets you pick in the Google picker or create in the product - never the rest of your Drive. Excel-first shop? Connect Excel Online and pick a table instead; its columns define the row shape. Either way you get a permanent endpoint at https://sheetlinkforms.com/f/{token}.

2. Add a Custom Liquid block to the page

In the theme editor, add a Custom Liquid section (or block) to your contact or inquiry page and paste the form from the snippet. If you prefer working in code, Online Store -> Themes -> Edit code and drop the same markup into a section or snippet file. Name the inputs after your sheet's column headers - matching is case and punctuation insensitive, and explicit per-field mapping is available in the dashboard if names differ.

3. Keep the honeypot input

The off-screen _slhp input is your first spam layer: shoppers never see it, and anything that fills it is marked spam outright. Every other suspicious signal - per-form and per-IP rate limits, content heuristics with a strictness dial, the timing signal, optional Cloudflare Turnstile - sends the submission to quarantine for one-click review instead, so a real wholesale inquiry is never silently dropped. Details in the docs.

4. Optionally load sl.js store-wide

Add the script tag to theme.liquid just before </body>. Because it binds any form whose action points at /f/, your custom form gets AJAX submission with inline success text - the visitor stays on the page - and ad attribution is captured and persisted across the whole browsing session. Skip it and the plain 303-redirect flow still works.

5. Test and check the delivery log

Submit a test from your storefront. On an empty sheet the header row is seeded automatically; rows then append under it, aligned to your columns, with a formula-injection guard escaping leading =, +, -, and @. The dashboard's delivery log shows every attempt, and retries at 5 minutes, 30 minutes, and 2 hours cover API hiccups - the full pipeline is on how it works.

FAQ

Can I forward Shopify's built-in contact form instead of replacing it?

Not directly - the native {% form 'contact' %} posts to Shopify's own handler, and SheetLink Forms receives only what posts to its endpoint. The honest path is the small theme edit above: swap the native form's markup for the custom form (or run both on different pages). It is a paste into a Custom Liquid block, not an app build.

Does this touch checkout, orders, or customer accounts?

No. This is a plain HTML form on your storefront posting to an external endpoint. Checkout, order processing, and customer accounts are completely untouched - SheetLink Forms never connects to your Shopify admin at all.

I run Google and Meta ads - can I see which click produced each inquiry?

Yes, and this is rare in the category. With sl.js loaded, gclid, wbraid, gbraid, fbclid, and msclkid plus utm_source/medium/campaign/term/content are captured from the landing URL and persisted in localStorage, so they arrive as columns alongside the inquiry even when the visitor browsed several pages first.

What does the shopper see after submitting?

Without sl.js: a 303 redirect to a hosted thank-you page or any custom URL you configure - your own store page works well. With sl.js: no navigation at all, just inline success text where the form was.

What does it cost alongside my Shopify plan?

SheetLink Forms is free during beta (invite required - join the waitlist) and charges no per-submission fees, ever. Planned post-beta pricing, labeled as planned: a free tier around 50 submissions/month and a paid plan around $15-19/mo, unmetered. Nothing is installed from the Shopify App Store, so there is no app subscription either.

Also on: Squarespace · Wix · Plain HTML

Request an invite See the live demo