SheetLink Forms beta

Newsletter signups you own

The list is a sheet you can open, filter, and export anywhere. No platform lock-in, no per-subscriber pricing creeping up with your success.

The workflow

Most newsletter advice starts with picking an email platform, which quietly decides where your subscriber list lives, what exporting it costs in friction, and what you pay as it grows. There is a more boring order of operations: collect signups into a spreadsheet you own, and let the sending tool be a downstream, replaceable choice.

The signup form posts to a permanent endpoint; every address is screened and appended as a row in your sheet. When you send - weekly, monthly, whenever - you export the new rows and import them into whatever sends your email this year. If you switch tools next year, the list does not migrate, because it never lived in the tool. Delivery to the sheet is direct, with retries and a delivery log, per how it works.

Suggested columns

A list sheet worth owning:

  1. Email - the list itself.
  2. Name - optional; skip it unless you personalize.
  3. utm_source and utm_medium - attribution columns filled automatically by the sl.js embed when signups arrive from tagged links. Six months in, a pivot on utm_source is a truthful history of which channels actually built your audience.
  4. Submitted At - growth over time is one chart away.
  5. Imported On - a working column marking which rows have been pushed to your sending tool; empty cells are the next batch.

The form markup

One field, the honeypot, inline success via the embed:

<form action="https://sheetlinkforms.com/f/your_token" method="POST" data-sheetlink
      data-success-message="Subscribed. See you in the next issue.">
  <input name="email" type="email" placeholder="you@example.com" required>
  <input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px">
  <button type="submit">Subscribe</button>
</form>
<script src="https://sheetlinkforms.com/sl.js" data-token="your_token"></script>

This block works pasted into a static site footer, a blog sidebar, or a client-side rendered page - the embed binds late-rendered forms via MutationObserver. Without JavaScript the form still posts and redirects to a thank-you page. The 256 KB body cap and response formats are in the docs.

Working the sheet

List hygiene, spreadsheet edition:

  1. Dedupe with a helper column. =COUNTIF(A:A, A2) > 1 flags repeats; keep the earliest row.
  2. Import in batches. Filter to empty Imported On, export those rows as CSV, import to your sending tool, write the date. The sheet stays the source of truth; the tool holds a copy.
  3. Honor unsubscribes upstream. When someone unsubscribes in your sending tool, delete or mark the row here too, so a future re-import cannot resurrect them.
  4. Chart growth from Submitted At. A COUNTIF per month gives you a subscriber growth chart in two minutes, built from data no platform can hold hostage.
  5. Read the utm_source pivot before spending on growth. The channel that built the first thousand rows is usually the channel worth doubling.

Spam considerations

A single-field email form is the easiest thing on the internet for a bot to stuff, and the damage is subtle: fake addresses inflate your subscriber count, then wreck your deliverability when your sending tool mails them and bounces. Clean capture is a deliverability strategy.

The honeypot removes the crude bots. The sl.js timing signal flags submissions filled faster than a human can type. The disposable-email-domain heuristic catches throwaway addresses before they reach the list. Per-IP rate limits stop scripted floods, and anything merely suspicious goes to quarantine for one-click review - not dropped, because occasionally a real subscriber has a strange address. Sweep the quarantine before each import batch. If your signup form ends up somewhere hostile, Cloudflare Turnstile is a per-form toggle away; the wider playbook is the spam protection guide.

FAQ

Does SheetLink Forms send the newsletter?

No. It captures and keeps the list; sending belongs to whatever email tool you choose - and the point of this setup is that you can change that choice without a list migration, because the sheet is the list.

What about double opt-in?

SheetLink records the signup; confirmation emails are not something it sends. Most sending tools can run their own confirmation flow on import, which achieves double opt-in at the point where email actually starts flowing.

Which email platforms does this work with?

Any tool that imports CSV - which is all of them. The sheet-first pattern is deliberately tool-agnostic: filter the new rows, export, import, mark Imported On.

Will fake signups pollute the list?

Far less than with an unprotected form: honeypot, timing signal, disposable-domain heuristic, and rate limits all run before a row lands, and borderline cases wait in quarantine for your review instead of slipping through or vanishing.

Related: A waitlist that runs itself · Feedback and NPS into a living sheet · Lead capture for ad landing pages

Request an invite See the live demo