SheetLink Forms beta

Forms for side projects and hackathons

Free during beta, no backend to deploy, and a JSON response your frontend can await. Ship the form and get back to the part you actually wanted to build.

The workflow

Side projects die of scope, and forms are classic scope: you wanted to gauge interest in the thing, and suddenly you are provisioning a database, writing a POST handler, and sketching an admin page - to collect email addresses.

The endpoint-and-sheet version deletes all of it. Your page posts to https://sheetlinkforms.com/f/your_token; submissions are screened and appended as rows; the spreadsheet is the admin page you were about to build, with sorting and filtering already implemented by Google. Nothing to deploy, nothing to keep patched, nothing that falls over in month three when you have moved on to the next project.

Cost fits the genre: free during the beta - grab an invite from the waitlist - with no per-submission fees, ever. A project that suddenly gets traction does not suddenly get a bill.

The fastest possible setup

Four steps, one sitting:

  1. Create a form in the dashboard and connect Google Sheets - one-click OAuth, and the drive.file scope means SheetLink can only see sheets you pick or create, never the rest of your Drive.
  2. Create an empty sheet as the destination. The header row is seeded for you when the first submission arrives.
  3. Paste the markup below with your token.
  4. Submit once and watch the row land. There is a live demo doing exactly this into a public sheet if you want proof before signing up.
<form action="https://sheetlinkforms.com/f/your_token" method="POST">
  <input name="email" type="email" placeholder="Email" required>
  <input name="idea" placeholder="What would you use it for?">
  <input name="_slhp" tabindex="-1" autocomplete="off" style="position:absolute;left:-9999px">
  <button type="submit">I'm interested</button>
</form>

Keep the hidden _slhp honeypot input - it is the zero-effort spam layer, invisible to humans and fatal to crude bots.

Or POST JSON from code

Hackathon builds often have no form at all - just a frontend that needs somewhere to put data before the demo. The endpoint speaks JSON:

await fetch("https://sheetlinkforms.com/f/your_token", {
  method: "POST",
  headers: { "Content-Type": "application/json" },
  body: JSON.stringify({ email, idea })
});
// => { "ok": true, "id": "..." }

That is a persistence layer for a weekend project in six lines: no database, no ORM, no migration, and the judges can watch rows appear in the sheet on the projector. Urlencoded and multipart posts work too (file parts are currently dropped), bodies cap at 256 KB, and error responses use honest status codes - all specified in the docs.

Columns that name themselves

Sheet setup for a side project is deliberately close to zero:

  1. Send fields; get columns. On an empty sheet, the header row is seeded from your first submission's field names. email and idea become Email and Idea columns.
  2. Rename freely later. Matching is case- and punctuation-insensitive, and explicit per-field mapping exists for the day your quick hack grows opinions about column names.
  3. Add working columns as the project earns them. A Replied column the day you start answering people; a utm_source column (via the sl.js embed) the day you post the project in more than one place and wonder which one worked.

The sheet grows with the project instead of demanding design up front - which is the correct amount of ceremony for something that might be abandoned by Tuesday or might be your next product.

Spam considerations

A project with forty visitors does not need a spam strategy, and conveniently the defaults are one: honeypot for the bots that find every form eventually, per-form and per-IP rate limits for the floods, content heuristics at normal strictness for the rest. You will probably never open the quarantine - but if your Show HN goes well and the bots follow the traffic, flagged submissions are sitting there for one-click review rather than silently gone, and Cloudflare Turnstile is a toggle if it gets serious.

That asymmetry is the point for side projects: zero configuration on the days nobody visits, and nothing embarrassing lost on the one day everybody does.

FAQ

What does it cost?

Nothing during the beta - request an invite from the waitlist. There are no per-submission fees now and none planned, ever. The post-beta plan (labeled as planned, not promised) is a free tier around 50 submissions a month and an unmetered paid tier around $15-19 a month.

Is it fast enough to set up mid-hackathon?

Yes - create a form, connect a sheet, paste six lines of fetch or one form tag. The header row seeds itself from your field names, so there is no schema step. Most of the setup time is deciding what to ask.

What are the limits I might hit?

Request bodies cap at 256 KB, file parts in multipart posts are currently dropped, and per-form and per-IP rate limits return 429 when tripped. For a form collecting emails and short answers, none of these are close.

What happens to my form when the beta ends?

Endpoints are permanent, and the planned free tier (around 50 submissions a month) is sized so a typical side project stays free. Pricing changes will be announced; per-submission fees are ruled out permanently.

Related: A contact form that lands in a sheet · A waitlist that runs itself · Feedback and NPS into a living sheet

Request an invite See the live demo