[{"data":1,"prerenderedAt":414},["ShallowReactive",2],{"blog-how-to\u002Fwaitlist-survey":3},{"id":4,"title":5,"body":6,"category":384,"date":385,"dateModified":385,"description":386,"draft":387,"extension":388,"faq":389,"featured":387,"keywords":398,"meta":399,"navigation":400,"ogDescription":401,"ogTitle":5,"path":402,"readTime":403,"schemaType":404,"seo":405,"sitemap":406,"stem":407,"tags":408,"twitterCard":412,"__hash__":413},"blog\u002Fblog\u002Fhow-to\u002Fwaitlist-survey.md","Survey Waitlist Signups Without Annoying Them",{"type":7,"value":8,"toc":375},"minimark",[9,13,16,31,36,39,42,45,58,61,65,72,79,89,92,115,129,139,143,146,154,157,163,171,175,178,181,189,196,206,210,213,269,275,279,294,297,305,352],[10,11,12],"p",{},"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.",[10,14,15],{},"The fix is not a better form. It is a smaller ask, tied to a contact you already know.",[17,18,19],"tldr",{},[10,20,21,22,26,27,30],{},"Ask one question per email. Put the signup's email address in the survey link, write it into a hidden ",[23,24,25],"code",{},"email"," field, and post to a form key with ",[23,28,29],{},"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.",[32,33,35],"h2",{"id":34},"why-one-question-beats-a-survey","Why One Question Beats a Survey",[10,37,38],{},"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.",[10,40,41],{},"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.",[10,43,44],{},"Good first questions are narrow and about the past or present, not the future:",[46,47,48,52,55],"ul",{},[49,50,51],"li",{},"\"What do you use today to do this?\" (current tool, a positioning anchor)",[49,53,54],{},"\"What almost stopped you from signing up?\" (objection)",[49,56,57],{},"\"Which of these two would you rather pay for?\" (a choice, not \"would you pay?\")",[10,59,60],{},"Avoid \"Would you use this?\" Everyone on your list already said yes by joining.",[32,62,64],{"id":63},"build-the-form","Build the Form",[10,66,67,68,71],{},"Create a form in the Forms section and copy its key, for example ",[23,69,70],{},"frm_wl_q1",". Because forms are schema-on-write, you do not define fields in advance. The first submission creates them.",[10,73,74,75,78],{},"Host the survey page anywhere, including your own landing page at ",[23,76,77],{},"\u002Fsurvey",":",[80,81,87],"pre",{"className":82,"code":84,"language":85,"meta":86},[83],"language-html","\u003Cform id=\"survey\">\n  \u003Cinput type=\"hidden\" name=\"email\" \u002F>\n  \u003Clabel>What do you use today to track signups?\u003C\u002Flabel>\n  \u003Ctextarea name=\"current_tool\" required>\u003C\u002Ftextarea>\n  \u003Cbutton>Send\u003C\u002Fbutton>\n\u003C\u002Fform>\n\n\u003Cscript src=\"https:\u002F\u002Foperatorstack.dev\u002Fos.js\" data-project=\"pk_your_project_key\">\u003C\u002Fscript>\n\u003Cscript>\n  const params = new URLSearchParams(location.search);\n  const form = document.getElementById(\"survey\");\n  form.elements.email.value = (params.get(\"email\") || \"\").trim().toLowerCase();\n\n  form.addEventListener(\"submit\", async (e) => {\n    e.preventDefault();\n    await OperatorStack.submitForm(\"frm_wl_q1\", {\n      email: form.elements.email.value,\n      current_tool: form.elements.current_tool.value,\n      survey: \"q1-current-tool\",\n    });\n    form.innerHTML = \"\u003Cp>Thanks. That helps.\u003C\u002Fp>\";\n  });\n\u003C\u002Fscript>\n","html","",[23,88,84],{"__ignoreMap":86},[10,90,91],{},"Three details matter here.",[10,93,94,101,102,105,106,109,110,100],{},[95,96,97,98,100],"strong",{},"The key must be exactly ",[23,99,25],{},"."," ",[23,103,104],{},"Email"," or ",[23,107,108],{},"your_email"," saves the answer with no contact behind it. See ",[111,112,114],"a",{"href":113},"\u002Fblog\u002Fhow-to\u002Fform-answers-to-contact-fields","what maps to the contact and what does not",[10,116,117,120,121,124,125,128],{},[95,118,119],{},"Lowercase the address."," The match uses the string as sent, so ",[23,122,123],{},"Jane@Acme.com"," and ",[23,126,127],{},"jane@acme.com"," become two contacts.",[10,130,131,138],{},[95,132,133,134,137],{},"Tag each send with a ",[23,135,136],{},"survey"," field."," When you run question two next week against the same form, the tag tells you which wave an answer came from.",[32,140,142],{"id":141},"send-the-link-without-asking-for-email-again","Send the Link Without Asking for Email Again",[10,144,145],{},"Your email tool can merge the address into the link. In Mailchimp or Loops the merge tag differs, but the shape is the same:",[80,147,152],{"className":148,"code":150,"language":151},[149],"language-text","https:\u002F\u002Fyourapp.com\u002Fsurvey?email={{email}}\n","text",[23,153,150],{"__ignoreMap":86},[10,155,156],{},"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.",[158,159,160],"tip-box",{},[10,161,162],{},"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.",[10,164,165,166,170],{},"If you export the waitlist with ",[111,167,169],{"href":168},"\u002Fblog\u002Fhow-to\u002Fexport-waitlist-data","your contacts and referral counts",", you can merge directly from that CSV into whatever tool sends the mail.",[32,172,174],{"id":173},"ask-on-the-thank-you-screen","Ask on the Thank-You Screen",[10,176,177],{},"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.",[10,179,180],{},"The SDK does not keep the email after a signup, so hold it in your own handler:",[80,182,187],{"className":183,"code":185,"language":186,"meta":86},[184],"language-javascript","const email = signupInput.value.trim().toLowerCase();\nawait OperatorStack.joinWaitlist({ email });\n\nshowSurveyQuestion(); \u002F\u002F your own markup\n\nasync function onAnswer(text) {\n  await OperatorStack.submitForm(\"frm_wl_q1\", {\n    email,\n    current_tool: text,\n    survey: \"q1-current-tool\",\n  });\n}\n","javascript",[23,188,185],{"__ignoreMap":86},[10,190,191,192,195],{},"Both calls write to the same contact because the lookup key is ",[23,193,194],{},"(project_id, email)",". The contact has a waitlist entry, a form submission, and a timeline that shows both.",[197,198,199],"warning-box",{},[10,200,201,202,205],{},"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 ",[23,203,204],{},"joinWaitlist"," resolves, as above.",[32,207,209],{"id":208},"space-the-sends","Space the Sends",[10,211,212],{},"A schedule that has worked for a pre-launch list:",[214,215,216,232],"table",{},[217,218,219],"thead",{},[220,221,222,226,229],"tr",{},[223,224,225],"th",{},"When",[223,227,228],{},"What you send",[223,230,231],{},"Why",[233,234,235,247,258],"tbody",{},[220,236,237,241,244],{},[238,239,240],"td",{},"Signup (on page)",[238,242,243],{},"The current-tool question",[238,245,246],{},"Highest response rate, no email needed",[220,248,249,252,255],{},[238,250,251],{},"Day 5",[238,253,254],{},"The objection question",[238,256,257],{},"Fresh enough to remember the decision",[220,259,260,263,266],{},[238,261,262],{},"Week 3",[238,264,265],{},"The pricing choice",[238,267,268],{},"After they have seen two updates from you",[10,270,271,272,274],{},"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 ",[23,273,136],{}," tag in the submissions export to see who has already answered.",[32,276,278],{"id":277},"read-the-answers","Read the Answers",[10,280,281,282,285,286,288,289,288,292,100],{},"Open the form's submissions or export the CSV. Every field in the schema becomes a column, and ",[23,283,284],{},"submitted_at"," comes first. For a one-question survey you will have three columns: ",[23,287,25],{},", ",[23,290,291],{},"current_tool",[23,293,136],{},[10,295,296],{},"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.",[10,298,299,300,304],{},"If you want more than the answers, such as how to weigh them against signup count, ",[111,301,303],{"href":302},"\u002Fblog\u002Fbest-practices\u002Fbuild-or-kill-waitlist-data","the build-or-kill rule"," treats reply rate itself as one of the three thresholds.",[306,307,308,315,324,330,336],"faq-section",{},[309,310,312],"faq-item",{"question":311},"How many questions should a waitlist survey have?",[10,313,314],{},"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.",[309,316,318],{"question":317},"How do I know which waitlist signup sent which answer?",[10,319,320,321,323],{},"Include their email in the survey link as a query parameter and write it into a hidden form field named ",[23,322,25],{},". OperatorStack matches the submission to the contact on that exact string, so no sign-in or second email prompt is needed.",[309,325,327],{"question":326},"Can I ask the survey on the thank-you screen right after signup?",[10,328,329],{},"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.",[309,331,333],{"question":332},"When should I send the first waitlist survey?",[10,334,335],{},"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.",[309,337,339],{"question":338},"Do survey answers show up on the contact in the dashboard?",[10,340,341,342,124,344,347,348,351],{},"Only ",[23,343,25],{},[23,345,346],{},"name"," are copied onto the contact. The answer stays on the form submission, linked by ",[23,349,350],{},"contact_id",", and you read it in the form's submissions or the CSV export.",[353,354,355,356],"content-related-articles",{},"\n  ",[357,358,355,362],"contentrelatedcard",{"href":359,"title":360,"description":361},"\u002Fblog\u002Fhow-to\u002Fforms-customer-research","Forms for Customer Research","Build a five-field research form that feeds the same contact list as your waitlist.",[357,363,355,366],{"href":113,"title":364,"description":365},"Form Fields to Contact Record: What Maps and What Doesn't","Only email and name reach the contact. Where every other answer lives and how to filter on it.",[357,367,370],{"href":302,"title":368,"description":369},"Validate a SaaS Idea With a Waitlist: The Build or Kill Rule","Reply rate is one of the three thresholds that decide whether to build.",[371,372],"cta-box",{"href":373,"label":374},"\u002F","Get Started Free",{"title":86,"searchDepth":376,"depth":376,"links":377},2,[378,379,380,381,382,383],{"id":34,"depth":376,"text":35},{"id":63,"depth":376,"text":64},{"id":141,"depth":376,"text":142},{"id":173,"depth":376,"text":174},{"id":208,"depth":376,"text":209},{"id":277,"depth":376,"text":278},"how-to","2026-10-23","Ask your waitlist one question at a time, tie each answer to the right contact, and keep replies high. Working form, SDK code, and a send schedule.",false,"md",[390,391,393,394,396],{"question":311,"answer":314},{"question":317,"answer":392},"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.",{"question":326,"answer":329},{"question":332,"answer":395},"Between day 3 and day 7 after signup. 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.",{"question":338,"answer":397},"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.","survey waitlist signups,waitlist survey,waitlist survey questions,ask waitlist a question,survey pre-launch list,waitlist feedback form",{},true,"One question, one link, answers tied to the contact. How to survey a waitlist with OperatorStack forms.","\u002Fblog\u002Fhow-to\u002Fwaitlist-survey","7 min","HowTo",{"title":5,"description":386},{"loc":402},"blog\u002Fhow-to\u002Fwaitlist-survey",[409,410,411],"waitlist","forms","customer-research","summary_large_image","sgdxZzlPoFnKUgLzMyHqvSSOGovIhTAFKJmQBvbR3qE",1793197855444]