An NPS survey that tells you why the score is what it is.

Survey Keeper is the open-source survey and Net Promoter Score server for a small product or shop. Define questions in plain text, share a link, and read results with a confidence range, the words detractors use more than promoters, and a score for each channel you sent it through. Below is the same calculation the server uses, running on sample answers you can replace. Everything on this page runs in your browser; nothing you type is uploaded.

Try it: paste scores and comments

—

What people mention

WordCommentsDetractors vs promoters

Word counting with common words removed, not a language model. A word detractors use at least 1.5 times as often as promoters is a place to look first.

Why someone would use this

TodayCatchSurvey Keeper
Typeform, SurveyMonkey, Delighted, SurvicateMonthly fees that rise with responses; answers live with them; the cheap tiers hide trend and exportYour server, unlimited surveys and responses, no per-response fee
LimeSurvey, FormbricksFull platforms: a database, a build, many settingsOne Node process and one JSON file
A Google Form and a spreadsheetNo NPS maths, no range, no per-channel score, no alert on an unhappy customerNPS, 95% range, results by ?ref= and a webhook on every detractor

Honest limits: no skip logic or page branching, no email sending (share the link or embed it), one admin key, no respondent panel, and the word table is counting, not sentiment analysis. For research-grade surveys, use a full platform.

Run it yourself

git clone https://github.com/Duncan-Haywood/oss-monorepo && cd oss-monorepo/ventures/survey-keeper
node --test
ADMIN_KEY=$(openssl rand -hex 16) node server.mjs

Open http://localhost:8080/admin (any user name, ADMIN_KEY as the password), edit the sample survey, and share /s/customer-pulse?ref=email. One-click Render deploy, Fly.io and Docker are in the README.

Questions

Why not just use Typeform, SurveyMonkey or Delighted?

Those are polished and the right call if you need logic branching, a design studio, panels of respondents or a vendor to call. They charge by the month, often cap responses on the cheaper plans, and your customers' answers live on their servers. Survey Keeper is one small Node server in your own account: NPS, rating, choice and free-text questions, results with a confidence range, CSV export and no per-response fee. It suits a product or shop that wants a pulse from a few hundred customers.

How is the NPS calculated, and what is the range?

Each answer counts as +1 for a 9 or 10, 0 for a 7 or 8 and -1 for 0 to 6. The score is the average times 100. The 95% range comes from the variance of that three-point score, so with 20 answers it is wide and with 400 it narrows. If a change moves the score by less than the range, you cannot tell it from noise.

What is the detractor-words table?

For every free-text question, Survey Keeper lists the words that come up in comments and shows whether detractors or promoters use each one more often. It is plain word counting with stop words removed, not a language model. A word like billing that detractors use several times as often as promoters points at what to fix first.

Can I paste scores I already have?

Yes. The demo on this page takes lines of a score and an optional comment, for example 9, fast and friendly, and shows the NPS, its range and the word table in your browser. Nothing you paste is uploaded.

How do I run a survey?

Define it in plain text, one question per line, such as nps*: How likely are you to recommend us? and text: What is the main reason for your score? Share the link, add ?ref=email or ?ref=app to see each channel's score, or embed it in an iframe from an origin you allow.

What does it store?

Your survey definitions and each response as the answers given, a timestamp and an optional short source tag, in one JSON file you control. It stores no name, email or IP address unless a respondent types one into a comment. IP addresses are held in memory only for rate limiting. You are the operator and responsible for your privacy notice and any consent your respondents' location requires.