You have 240 people on a waitlist and one real question: which of the two pricing tiers would they pick? You write a nine-question Google Form, email the link, and get 19 replies. Eleven of them skipped the question you cared about.
The fix is not a better form. It is a smaller ask, tied to a contact you already know.
Ask one question per email. Put the signup's email address in the survey link, write it into a hidden email field, and post to a form key with OperatorStack.submitForm. The answer lands on the form submission linked to that contact, so you never ask someone to retype an address you already have.
Why One Question Beats a Survey
A waitlist signup gave you an email address and nothing else. They did not agree to a research interview. Each extra field costs you replies, and the question you cared about is usually the last one they reach.
One question has two other advantages. You can read all the answers in five minutes, and you can send a different question next week to a different slice without the lists overlapping.
Good first questions are narrow and about the past or present, not the future:
- "What do you use today to do this?" (current tool, a positioning anchor)
- "What almost stopped you from signing up?" (objection)
- "Which of these two would you rather pay for?" (a choice, not "would you pay?")
Avoid "Would you use this?" Everyone on your list already said yes by joining.
Build the Form
Create a form in the Forms section and copy its key, for example frm_wl_q1. Because forms are schema-on-write, you do not define fields in advance. The first submission creates them.
Host the survey page anywhere, including your own landing page at /survey:
<form id="survey">
<input type="hidden" name="email" />
<label>What do you use today to track signups?</label>
<textarea name="current_tool" required></textarea>
<button>Send</button>
</form>
<script src="https://operatorstack.dev/os.js" data-project="pk_your_project_key"></script>
<script>
const params = new URLSearchParams(location.search);
const form = document.getElementById("survey");
form.elements.email.value = (params.get("email") || "").trim().toLowerCase();
form.addEventListener("submit", async (e) => {
e.preventDefault();
await OperatorStack.submitForm("frm_wl_q1", {
email: form.elements.email.value,
current_tool: form.elements.current_tool.value,
survey: "q1-current-tool",
});
form.innerHTML = "<p>Thanks. That helps.</p>";
});
</script>
Three details matter here.
The key must be exactly email. Email or your_email saves the answer with no contact behind it. See what maps to the contact and what does not.
Lowercase the address. The match uses the string as sent, so Jane@Acme.com and jane@acme.com become two contacts.
Tag each send with a survey field. When you run question two next week against the same form, the tag tells you which wave an answer came from.
Send the Link Without Asking for Email Again
Your email tool can merge the address into the link. In Mailchimp or Loops the merge tag differs, but the shape is the same:
https://yourapp.com/survey?email={{email}}
The first line of the message should be the question itself, in plain text, with the link right after it. A person who can answer in their head is more likely to click.
Send from a real person's name and address. A reply to the email is also a valid answer, and the replies are often the longest ones. Log them by hand in a notes column next to your CSV export.
If you export the waitlist with your contacts and referral counts, you can merge directly from that CSV into whatever tool sends the mail.
Ask on the Thank-You Screen
The best moment to ask is right after signup. The person is already looking at your page, and the question feels like part of the signup, not a follow-up.
The SDK does not keep the email after a signup, so hold it in your own handler:
const email = signupInput.value.trim().toLowerCase();
await OperatorStack.joinWaitlist({ email });
showSurveyQuestion(); // your own markup
async function onAnswer(text) {
await OperatorStack.submitForm("frm_wl_q1", {
email,
current_tool: text,
survey: "q1-current-tool",
});
}
Both calls write to the same contact because the lookup key is (project_id, email). The contact has a waitlist entry, a form submission, and a timeline that shows both.
Do not render the question inside the default waitlist widget's success message and expect it to submit. The success message is plain text. Build the survey as your own element after joinWaitlist resolves, as above.
Space the Sends
A schedule that has worked for a pre-launch list:
| When | What you send | Why |
|---|---|---|
| Signup (on page) | The current-tool question | Highest response rate, no email needed |
| Day 5 | The objection question | Fresh enough to remember the decision |
| Week 3 | The pricing choice | After they have seen two updates from you |
Stop sending to anyone who ignored two survey emails in a row. Two ignored emails is a no, and a third one costs you an unsubscribe. Use the survey tag in the submissions export to see who has already answered.
Read the Answers
Open the form's submissions or export the CSV. Every field in the schema becomes a column, and submitted_at comes first. For a one-question survey you will have three columns: email, current_tool, survey.
After 20 to 30 answers, group the free-text replies by tool name. If one competitor appears in more than a third of them, that is the comparison page to write and the objection to answer on your landing page.
If you want more than the answers, such as how to weigh them against signup count, the build-or-kill rule treats reply rate itself as one of the three thresholds.
Frequently Asked Questions
How many questions should a waitlist survey have?
One. Send a single question per email and let the reply rate guide the next one. A signup who gave you an email address ten days ago has not agreed to fill out a questionnaire.
How do I know which waitlist signup sent which answer?
Include their email in the survey link as a query parameter and write it into a hidden form field named email. OperatorStack matches the submission to the contact on that exact string, so no sign-in or second email prompt is needed.
Can I ask the survey on the thank-you screen right after signup?
Yes, and it gets the highest response rate because the person is still on the page. Keep the email from your own signup handler (the SDK does not store it) and submit it with the answer.
When should I send the first waitlist survey?
Between day 3 and day 7 after signup, unless you ask on the thank-you screen. Earlier feels pushy. Later and the person has forgotten what they signed up for. Send it from a real name, with the product name in the subject.
Do survey answers show up on the contact in the dashboard?
Only email and name are copied onto the contact. The answer stays on the form submission, linked by contact_id, and you read it in the form's submissions or the CSV export.