Skip to main content
20% off 3 months · code LAUNCH20 · until 31 October

Google Forms as a waitlist: how to set it up, and where it stops

23 September 2026 · by Nordva, who make Nordva Launch

On this pageSet it up in ten minutes
  1. Set it up in ten minutes
  2. Where it stops working
  3. Add a confirmation email with Apps Script
  4. When to move to a real waitlist
  5. The same thing in Nordva Launch
  6. Back to the top

Can I use Google Forms as a waitlist for my product, and what are its limits?

Yes. Make a form with an email question, link it to a Sheet and share the link; it costs nothing and takes minutes. What it lacks: a confirmation email you write (Apps Script can send one), the source of each signup, referral links and positions, duplicate protection without Google sign-in, and spam protection. Move to a real waitlist once you post in more than one place.

A Google Form is a reasonable first waitlist. It is free, you already have an account, and it is live the moment you share the link. It stops being enough at a predictable point: when you post in several places and want to know which one worked, or when you want the list to grow itself through referrals. Here is how to set it up properly, what Google’s own help pages say it cannot do, and when to move.

Set it up in ten minutes

  1. Create the form at forms.google.com with one question: email. Either add a short-answer question titled “Email”, or turn on email collection: Settings > Responses > Collect email addresses and pick Responder input. Google’s responses help describes both options; Verified instead collects the address of the Google account they are signed in to, so it only works for people with one.
  2. Add one optional question that helps you later, such as “What do you want it to do for you?” Keep it optional. Every required field is a reason to leave.
  3. Write the confirmation message: Settings > Presentation > Confirmation message > Edit, per Google’s publishing help. Say what happens next and when, in one or two sentences.
  4. Send responses to a Sheet: Responses > Link to Sheets. The Sheet is your list; you will filter it, dedupe it and eventually export it. Choosing where to save responses covers the options.
  5. Turn on notifications if you want an email per signup: Responses > More > Get email notifications for new responses.
  6. Publish and share: Publish, then under General access choose anyone with the link, and copy the responder link. To put it on a page, More > Embed HTML gives you an iframe.

That is a working waitlist. Now the limits.

Where it stops working

The confirmation email is a copy of the answers

The person sees your confirmation message on screen. An email only arrives if the form collects email addresses and you turn on Send responders a copy of their response (When requested or Always). It is a receipt of their answers, not a message you write, and Google adds that “responders may not receive expected response receipts due to spam filters or other counter-abuse measures” (same help page).

A confirmation email you write yourself takes a short Apps Script, below.

Duplicates, unless everyone signs in

People submit twice: once on the phone, once on the laptop, once more because they forgot. Forms can stop this with Limit to 1 response, but Google’s help is explicit about the price: “To access and fill out the form, users must sign in to their Google Account.” On a waitlist, that is a sign-in wall between a stranger and your list. If you leave it off, dedupe the Sheet by hand, and let the script below skip the second email.

No source for each signup

Forms cannot read the page’s address or referrer, and it has no hidden fields. So it cannot tell you whether a signup came from your Reddit post or your newsletter, which is the question a waitlist is best placed to answer before launch.

There are two workarounds, both with the same weakness: the answer is a visible question the person can change.

  • One pre-filled link per channel. Add a short-answer question “Where did you hear about us?”, then More > Pre-fill form, type reddit, Get link. Repeat per channel. Google documents pre-filled links under “Send a form with pre-filled answers”.
  • Build the pre-filled link on your own page. Make one pre-filled link with the placeholder answer SOURCE, then let your page swap in the UTM tag it was opened with:
<iframe id="waitlist" width="100%" height="700" frameborder="0"></iframe>
<script>
  // Your pre-filled link, made with the answer SOURCE in the "Where did you hear about us?" question.
  const PREFILLED = "https://docs.google.com/forms/d/e/YOUR_FORM_ID/viewform?usp=pp_url&entry.123456789=SOURCE";

  const q = new URLSearchParams(location.search);
  const referrer = document.referrer ? new URL(document.referrer).hostname : "";
  const source =
    q.get("utm_source") || q.get("ref") || (referrer && referrer !== location.hostname ? referrer : "direct");

  // embedded=true is what Google's own embed code adds to the link.
  document.getElementById("waitlist").src =
    PREFILLED.replace("SOURCE", encodeURIComponent(source)) + "&embedded=true";
</script>

Copy the entry. number from your own pre-filled link; it differs per question. This works for visitors who land on that page. Anyone who shares the bare form link skips it.

A waitlist that grows itself gives each person a link to share and moves them up when friends join. Forms has no position, no per-person link and no way to show someone their place in line. You could build it with Sheets formulas and Apps Script, at which point you are writing a waitlist tool.

Spam

Anyone with the link can submit, and the settings Google documents for publishing and responses have no captcha or bot filter. A bot can fill the email field with anyone’s address, which matters the day you send a confirmation or a launch email: you would be mailing strangers who never asked. Requiring sign-in makes it harder, at the cost above. A confirmation link that people must click is the usual answer, and Forms does not have one.

Sending the launch email

When you launch, you need to email everyone once, with a way to unsubscribe. From Apps Script, Google’s quotas allow 100 email recipients a day on a consumer Gmail account and 1,500 on Google Workspace. A list of 400 on Gmail takes four days, or a mail tool you import the Sheet into.

Add a confirmation email with Apps Script

This sends a short welcome from your own Google account when someone submits, skips people who already signed up, and stops cleanly at the daily quota. It uses an installable form-submit trigger, whose event carries the FormResponse, and MailApp.sendEmail with a sender name and reply-to address.

In the form, open More (three dots) > Script editor, which creates a script bound to the form. Replace the file’s contents with:

// Code.gs: in the form, More (three dots) > Script editor. Paste, save, run installTrigger once.
const PRODUCT = "Acme";
const REPLY_TO = "you@example.com"; // where replies to the confirmation go

function onWaitlistSubmit(e) {
  const email = respondentEmail(e.response);
  if (!email) return;

  // Someone who submits twice gets one email, not two.
  const submitted = e.response.getTimestamp().getTime();
  const already = FormApp.getActiveForm()
    .getResponses()
    .some((r) => r.getTimestamp().getTime() < submitted && sameEmail(respondentEmail(r), email));
  if (already) return;

  if (MailApp.getRemainingDailyQuota() < 1) {
    console.warn(`Daily email quota used up; no confirmation sent to ${email}`);
    return;
  }

  MailApp.sendEmail(
    email,
    `You're on the ${PRODUCT} waitlist`,
    [
      "Thanks for signing up. You're on the list.",
      "",
      "We will email you once, when your invite is ready. Reply to this email if you want off the list.",
      "",
      `The ${PRODUCT} team`,
    ].join("\n"),
    { name: PRODUCT, replyTo: REPLY_TO },
  );
}

// Works with Settings > Responses > Collect email addresses, or with a question titled "Email".
function respondentEmail(response) {
  const collected = response.getRespondentEmail();
  if (collected) return collected.trim();
  const item = response.getItemResponses().find((r) => /^e-?mail/i.test(r.getItem().getTitle()));
  const answer = item ? String(item.getResponse()).trim() : "";
  return /^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(answer) ? answer : "";
}

function sameEmail(a, b) {
  return Boolean(a) && a.toLowerCase() === b.toLowerCase();
}

// Run once from the editor (select it, press Run) and accept the permissions.
function installTrigger() {
  ScriptApp.newTrigger("onWaitlistSubmit").forForm(FormApp.getActiveForm()).onFormSubmit().create();
}

Select installTrigger in the toolbar and press Run. Google asks you to authorize the script to send email as you; accept. Then submit the form yourself to test.

Three notes from the docs:

  • The email comes from your account. Installable triggers “always run under the account of the person who created them”, so replies land in your inbox. That is usually what you want early on.
  • A trigger per form. Running installTrigger twice creates two triggers and two emails per signup. Check Triggers (the alarm clock icon on the left) and delete extras.
  • Duplicates are checked by reading every response, which is fine for hundreds or a few thousand. Past that, check against the Sheet instead.

This fixes the confirmation. It does not fix the source, referrals or spam, and a bot’s fake address now gets your email. That is the trade.

When to move to a real waitlist

Move when any of these is true:

  • You are posting in more than one place and want to know which one works.
  • You want referral links, so the list grows from people who already joined.
  • You are about to announce and need an unsubscribe link and a sender that is not your personal Gmail.
  • Cleaning the Sheet has become a weekly job.

The move itself is short: Responses > More > Download responses (.csv) (Google’s help), then import the file into whatever you choose. The waitlist tools comparison lays out the options, and if you have a site of your own, adding a waitlist to any framework shows the code.

The same thing in Nordva Launch

Launch’s hosted waitlist page is the no-code replacement: a page at launch.nordva.dev/waitlist/your-project with referral links and positions. Share it with UTM tags on each link and every signup records the post that sent it, without a cookie. Every signup gets a receipt email with an unsubscribe link on every plan; Indie ($19 a month) adds double opt-in (people confirm their address by clicking a link, so a bot’s made-up entry stays unconfirmed) and invites in signup order.

To bring the Google Forms list along, choose Import CSV on the Waitlist page and pick the downloaded file. An Email or Email Address column and the Timestamp column are recognised as they are, and the dialog shows which columns it used; rename a “Where did you hear about us?” column to source to keep that answer too. Import works on every plan and counts toward the plan’s signups. Nobody is emailed by an import, people already on the list are skipped, and the timestamps keep the original order (a day-first date such as 20/09/2026 is not read, so check that column if your account uses that format). The free plan holds 100 signups per project; Indie holds 2,500.

Who should not use Launch for this: if the list is for an event, a class or anything where you need several answers per person and a spreadsheet to work in, stay with Google Forms. Launch’s waitlist collects an email and its source, not a questionnaire.

Start free, no card.

Questions

Can Google Forms send a confirmation email?
Only a copy of the person's answers, and only if the form collects email addresses and you turn on response receipts. For a message you write yourself, add the Apps Script in this guide. A Gmail account can send to 100 recipients a day from Apps Script.
Can I stop people signing up twice?
Limit to 1 response does it, but then every visitor has to sign in to a Google account before they can fill in the form. The alternative is to accept duplicates and remove them in the Sheet, or skip the second confirmation in Apps Script, as the script here does.
Can Google Forms record which post a signup came from?
Not by itself: it has no hidden fields and cannot read the page's UTM tags. You can make one pre-filled link per channel, or build the pre-filled link on your own page from the UTM tags, but the person can see and change the answer.
How do I move a Google Forms list to a waitlist tool later?
Download the responses as a CSV from the Responses tab and import it. In Nordva Launch, choose Import CSV on the Waitlist page: an Email or Email Address column and the Timestamp column are recognised as they are, nobody is emailed by an import, and the timestamps keep the original order.
Related

Try it in your project

npx nordva@latest init

Free plan, no card, no invite.

Start free