Write your questions one per line and get three things out: a printable paper survey with real answer boxes, a plain-text version to paste into an email or a form builder, and a CSV header row so whatever you collect answers with lines up afterwards. Paste the responses back in and it counts them — per-question counts and percentages that always state how many people answered, blanks counted on their own line rather than treated as a 'no', a bar chart per question as SVG, and written comments listed word for word. Being straight with you: it cannot gather responses from other people, because that needs a server for those answers to arrive at and this runs entirely in your browser tab. It builds the survey and tallies the results; the collecting in the middle is yours. It also makes no claim beyond the answers in front of it — no test of anything, no error bars, no leap from the people who answered to the people who did not.
Worked example
=== PRINTABLE SURVEY ===
Customer feedback
=================
5 questions. Leave any question blank if you would rather not answer.
1. How satisfied are you with the service?
Tick one number from 1 to 5:
1 [ ] 2 [ ] 3 [ ] 4 [ ] 5 [ ]
1 = Very unhappy 5 = Very happy
2. Which plan are you on?
Choose one:
( ) Free
( ) Pro
( ) Team
3. Which features do you use?
Choose all that apply:
[ ] Search
[ ] Export
[ ] Sharing
4. Would you recommend us?
( ) Yes ( ) No
5. What should we fix first?
____________________________________________
____________________________________________
____________________________________________
____________________________________________
Thank you.
=== PLAIN TEXT VERSION (paste into an email or a form builder) ===
Customer feedback
1. How satisfied are you with the service?
(rating 1 to 5; 1 = Very unhappy, 5 = Very happy)
2. Which plan are you on?
(choose one)
- Free
- Pro
- Team
3. Which features do you use?
(choose all that apply)
- Search
- Export
- Sharing
4. Would you recommend us?
(yes / no)
5. What should we fix first?
(long answer)
=== CSV HEADER ROW (make your response file start with exactly this line) ===
How satisfied are you with the service?,Which plan are you on?,Which features do you use?,Would you recommend us?,What should we fix first?
One column per question, in the same order.
- Single choice / yes-no / rating: write the answer, or leave it blank if the person skipped it.
- Multiple choice: separate the ticked options with semicolons, like `Search;Export`.
- Ranking: list the options in order, best first, separated by semicolons.
- Anything before the first question column (a timestamp, an email) is skipped, as long as the header wording still matches.
=== RESULTS ===
5 response(s) read (the first row was the header and is not counted as a response).
5 question(s) in the definition; column 1 of each response row is question 1.
Q1. How satisfied are you with the service? [rating scale]
Answered: 4 of 5 response(s). Left blank: 1.
Every percentage below is out of the 4 who answered. The 1 blank(s) are counted above and left out of that base; they are not read as a 'no'.
1: 0 (0.0%)
2: 1 (25.0%)
3: 0 (0.0%)
4: 1 (25.0%)
5: 2 (50.0%)
Median = 4.5 on the 1 to 5 scale (4 readable answer(s)).
Mean = 4 on the 1 to 5 scale (4 readable answer(s)).
A mean over a rating scale is a summarising convention, not a measurement: the gap between 1 and 2 is not known to be the same size as the gap between 4 and 5, and "3.7" is not a quantity anybody chose. The distribution above is the honest answer; the median is usually the safer single number.
Q2. Which plan are you on? [single choice]
Answered: 5 of 5 response(s). Left blank: 0.
Every percentage below is out of the 5 who answered. Nobody left this one blank.
Free: 2 (40.0%)
Pro: 2 (40.0%)
Team: 1 (20.0%)
Q3. Which features do you use? [multiple choice]
Answered: 4 of 5 response(s). Left blank: 1.
Every percentage below is out of the 4 who answered. The 1 blank(s) are counted above and left out of that base; they are not read as a 'no'.
People could tick more than one box, so these do NOT add up to 100%. 6 box(es) were ticked in total by 4 people.
Search: 3 (75.0% of those who answered)
Export: 2 (50.0% of those who answered)
Sharing: 1 (25.0% of those who answered)
Q4. Would you recommend us? [yes / no]
Answered: 5 of 5 response(s). Left blank: 0.
Every percentage below is out of the 5 who answered. Nobody left this one blank.
Yes: 4 (80.0%)
No: 1 (20.0%)
Q5. What should we fix first? [long text]
Answered: 3 of 5 response(s). Left blank: 2.
Every answer is printed below word for word, in the order it was read. Nothing here is scored, grouped, ranked or summarised — reading them is the work, and no tool can do it for you.
1. Faster export please
2. Billing is confusing, and slow
3. Nothing, it is fine
--- SVG 1 of 4: Q1. How satisfied are you with the service? (save as .svg, or paste into a document) ---
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 234" width="720" height="234" font-family="system-ui,sans-serif">
<rect width="720" height="234" fill="#0b0e14"/>
<text x="20" y="28" fill="#e6e9f0" font-size="15" font-weight="700">Q1. How satisfied are you with the service?</text>
<text x="20" y="48" fill="#9aa3b5" font-size="11">scale 1 to 5; 4 of 5 responses answered</text>
<text x="240.0" y="84.0" fill="#e6e9f0" font-size="11" text-anchor="end">1</text>
<rect x="250.0" y="72.0" width="0.0" height="16" fill="#2dd4bf"/>
<text x="258.0" y="84.0" fill="#9aa3b5" font-size="11">0 (0.0%)</text>
<text x="240.0" y="110.0" fill="#e6e9f0" font-size="11" text-anchor="end">2</text>
<rect x="250.0" y="98.0" width="190.0" height="16" fill="#2dd4bf"/>
<text x="448.0" y="110.0" fill="#9aa3b5" font-size="11">1 (25.0%)</text>
<text x="240.0" y="136.0" fill="#e6e9f0" font-size="11" text-anchor="end">3</text>
<rect x="250.0" y="124.0" width="0.0" height="16" fill="#2dd4bf"/>
<text x="258.0" y="136.0" fill="#9aa3b5" font-size="11">0 (0.0%)</text>
<text x="240.0" y="162.0" fill="#e6e9f0" font-size="11" text-anchor="end">4</text>
<rect x="250.0" y="150.0" width="190.0" height="16" fill="#2dd4bf"/>
<text x="448.0" y="162.0" fill="#9aa3b5" font-size="11">1 (25.0%)</text>
<text x="240.0" y="188.0" fill="#e6e9f0" font-size="11" text-anchor="end">5</text>
<rect x="250.0" y="176.0" width="380.0" height="16" fill="#2dd4bf"/>
<text x="638.0" y="188.0" fill="#9aa3b5" font-size="11">2 (50.0%)</text>
<line x1="250.0" y1="204.0" x2="700.0" y2="204.0" stroke="#232a3d"/>
<text x="20" y="222.0" fill="#9aa3b5" font-size="10">Percentages are of the 4 people who answered this question.</text>
</svg>
--- SVG 2 of 4: Q2. Which plan are you on? (save as .svg, or paste into a document) ---
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 182" width="720" height="182" font-family="system-ui,sans-serif">
<rect width="720" height="182" fill="#0b0e14"/>
<text x="20" y="28" fill="#e6e9f0" font-size="15" font-weight="700">Q2. Which plan are you on?</text>
<text x="20" y="48" fill="#9aa3b5" font-size="11">5 of 5 responses answered; 0 left blank</text>
<text x="240.0" y="84.0" fill="#e6e9f0" font-size="11" text-anchor="end">Free</text>
<rect x="250.0" y="72.0" width="380.0" height="16" fill="#2dd4bf"/>
<text x="638.0" y="84.0" fill="#9aa3b5" font-size="11">2 (40.0%)</text>
<text x="240.0" y="110.0" fill="#e6e9f0" font-size="11" text-anchor="end">Pro</text>
<rect x="250.0" y="98.0" width="380.0" height="16" fill="#2dd4bf"/>
<text x="638.0" y="110.0" fill="#9aa3b5" font-size="11">2 (40.0%)</text>
<text x="240.0" y="136.0" fill="#e6e9f0" font-size="11" text-anchor="end">Team</text>
<rect x="250.0" y="124.0" width="190.0" height="16" fill="#2dd4bf"/>
<text x="448.0" y="136.0" fill="#9aa3b5" font-size="11">1 (20.0%)</text>
<line x1="250.0" y1="152.0" x2="700.0" y2="152.0" stroke="#232a3d"/>
<text x="20" y="170.0" fill="#9aa3b5" font-size="10">Percentages are of the 5 people who answered this question.</text>
</svg>
--- SVG 3 of 4: Q3. Which features do you use? (save as .svg, or paste into a document) ---
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 182" width="720" height="182" font-family="system-ui,sans-serif">
<rect width="720" height="182" fill="#0b0e14"/>
<text x="20" y="28" fill="#e6e9f0" font-size="15" font-weight="700">Q3. Which features do you use?</text>
<text x="20" y="48" fill="#9aa3b5" font-size="11">4 of 5 responses answered; more than one box allowed</text>
<text x="240.0" y="84.0" fill="#e6e9f0" font-size="11" text-anchor="end">Search</text>
<rect x="250.0" y="72.0" width="380.0" height="16" fill="#2dd4bf"/>
<text x="638.0" y="84.0" fill="#9aa3b5" font-size="11">3 (75.0%)</text>
<text x="240.0" y="110.0" fill="#e6e9f0" font-size="11" text-anchor="end">Export</text>
<rect x="250.0" y="98.0" width="253.3" height="16" fill="#2dd4bf"/>
<text x="511.3" y="110.0" fill="#9aa3b5" font-size="11">2 (50.0%)</text>
<text x="240.0" y="136.0" fill="#e6e9f0" font-size="11" text-anchor="end">Sharing</text>
<rect x="250.0" y="124.0" width="126.7" height="16" fill="#2dd4bf"/>
<text x="384.7" y="136.0" fill="#9aa3b5" font-size="11">1 (25.0%)</text>
<line x1="250.0" y1="152.0" x2="700.0" y2="152.0" stroke="#232a3d"/>
<text x="20" y="170.0" fill="#9aa3b5" font-size="10">Percentages are of the 4 people who answered this question.</text>
</svg>
--- SVG 4 of 4: Q4. Would you recommend us? (save as .svg, or paste into a document) ---
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 720 156" width="720" height="156" font-family="system-ui,sans-serif">
<rect width="720" height="156" fill="#0b0e14"/>
<text x="20" y="28" fill="#e6e9f0" font-size="15" font-weight="700">Q4. Would you recommend us?</text>
<text x="20" y="48" fill="#9aa3b5" font-size="11">5 of 5 responses answered; 0 left blank</text>
<text x="240.0" y="84.0" fill="#e6e9f0" font-size="11" text-anchor="end">Yes</text>
<rect x="250.0" y="72.0" width="380.0" height="16" fill="#2dd4bf"/>
<text x="638.0" y="84.0" fill="#9aa3b5" font-size="11">4 (80.0%)</text>
<text x="240.0" y="110.0" fill="#e6e9f0" font-size="11" text-anchor="end">No</text>
<rect x="250.0" y="98.0" width="95.0" height="16" fill="#2dd4bf"/>
<text x="353.0" y="110.0" fill="#9aa3b5" font-size="11">1 (20.0%)</text>
<line x1="250.0" y1="126.0" x2="700.0" y2="126.0" stroke="#232a3d"/>
<text x="20" y="144.0" fill="#9aa3b5" font-size="10">Percentages are of the 5 people who answered this question.</text>
</svg>
WHAT THIS DOES AND DOES NOT TELL YOU
- It counts the answers in front of it. That is all it does.
- It says nothing about people who did not answer, and nothing about anybody outside the group you asked. Thirty answers tell you what those thirty people wrote down.
- Blank answers are counted and shown on their own line. They are never filled in, never carried over from another row, and never read as a 'no'.
- Every percentage states the number it was taken over, because people skip questions and that number differs from question to question.
- Percentages are rounded to one decimal place for display only. Where rounding stops a set of them adding to 100%, the total is printed instead of being adjusted.
- Free-text answers are listed word for word. They are not scored, sorted into themes or judged.
- There is no server here: this cannot collect answers for you, and nothing you paste leaves this browser tab.
Frequently asked
Can it collect the responses for me?
No, and nothing here pretends otherwise. Collecting answers from other people means those people need somewhere to send them, which means a server — and this tool runs entirely inside your browser tab with no network. What it does instead is the two halves that do not need one: it builds the survey (printable, plain text, and a CSV header row), and it tallies the answers once you have them back. Collect them however suits you: printed copies, an email thread, a shared spreadsheet, or any hosted form. If that form's export columns match the CSV header row this prints, the tally will line up.
How do I write the questions?
One per line: `question text | type | options`. The type is read loosely — `rating 1-5`, `scale 0 to 10`, `single`, `multi`, `yes/no`, `short`, `long`, `rank` all work, and anything it cannot place becomes a short-text question and says so. Options are comma-separated, or semicolon-separated if one of them contains a comma. Leave the type off and it guesses from whether you listed options. Lines starting with # are ignored.
What happens to questions people skipped?
They are counted on their own line and left out of the base of every percentage for that question. A blank is never read as a 'no', never filled in from another row, and never quietly dropped — which matters, because 60% of the 10 people who answered is a very different sentence from 60% of the 40 people you asked.
Does it tell me whether a result is real?
No. It counts what is in front of it and stops. There is no test, no error bar and no leap from the people who answered to anybody who did not. Thirty answers tell you what those thirty people wrote down, and any sentence stronger than that has to come from you, with the reasoning shown.
Why does it print a mean and then warn about it?
Because people expect the number and it is still worth seeing — but averaging a 1-to-5 agreement scale treats the gap between 1 and 2 as the same size as the gap between 4 and 5, and nobody has shown that it is. The distribution is the honest answer, the median is usually the safer single number, and the mean is a convention for summarising, not a measurement.
What does it do with written comments?
Lists them, word for word, in the order it read them. It does not score their mood, sort them into themes or pick out the interesting ones. Reading them is the work, and a tool that pretended to do it for you would be hiding the thing you most need to see.