Employee Net Promoter Score, run anonymously
One question. Honest answers. Total anonymity.
Ask your people how likely they are to recommend working here. We collect the answers and hand you back numbers for groups — by site, team, cost centre, tenure. Never for a person.
How likely are you to recommend your company as a place to work?
Pick a score to see what happens to it.
Stored: the score, the comment if one is written, and the
group labels the employer supplied — engineering, toronto,
tenure 2–3 years.
Not stored: who answered, which invitation was used, or when.
The measure
A satisfaction score asks if people are content. This one asks if they’d vouch for you.
Employee Net Promoter Score borrows the customer NPS question and turns it inward. Everyone answers on a scale of 0 to 10, and every answer falls into one of three bands. The bands are deliberately lopsided: only a 9 or a 10 counts in your favour, because recommending an employer to a friend is a high bar and the score is built to respect that.
0 – 6 · Detractors
Would warn people off
They’re unhappy enough to say so out loud. Each one subtracts from the score.
7 – 8 · Passives
Content, not committed
Fine with the job, unlikely to champion it. They count in the total but add nothing.
9 – 10 · Promoters
Would recommend you
Genuine advocates. They’re the only answers that add to the score.
eNPS = % promoters − % detractors
The result runs from −100 to +100 and is written as a whole number, not a percentage. Above zero means advocates outnumber critics. What matters more than the absolute figure is which groups sit below your own average, and which way the number moves next time you ask.
The service
You keep the employee list. We keep nothing that could identify anyone.
enps-survey.org is an API, not a dashboard. Your own application drives it, which means the names and email addresses of your staff never leave your systems. Four endpoints, and one registration you do once in a browser.
Register your app
Give us an application name and an administrator email. We email a link, valid for 30 minutes and usable once; opening it issues your access token and shows it a single time. Keep it — it is stored only as a hash and cannot be recovered.
Once, in a browserPOST /new-caller
→ emailed link
→ client_app_id + access_token
(shown once, never again)
Create a survey
Set a title, an opening and closing time, and the timezone they are written in. You get back a survey code.
Your appPOST /api/v1/surveys
{ "survey_title": "Spring pulse",
"datetime_start": "2027-09-01T09:00",
"datetime_end": "2027-09-14T18:00",
"timezone": "America/Toronto" }
→ survey_code
Register each participant
Send only the labels you want to slice results by: site, team, cost centre, age band, tenure, contracted hours. No name, no email. Up to 500 at a time. Each one returns a unique invitation link.
Your appPOST /api/v1/participants
{ "location": "toronto",
"org_unit": "engineering",
"tenure_bracket": "2-3", … }
→ submit_url
Send the invitations yourself
You match links to people and email them from your own system. This is the step that makes the rest of it work: we never learn the mapping, because we never see it.
Your app · outside enps-survey.orgenps-survey.org/submit/{code}
one link per employee
Employees answer on our page
A score, then one follow-up question worded to match it, and an optional comment. The page picks its language from the browser and can be switched by hand. Each link works exactly once.
Your peoplescore 0–10 + optional comment English · Español · Français · Deutsch · Português (Brasil) · Italiano · Nederlands · 日本語 · 한국어 · 简体中文
Read the results by group
Ask for a breakdown by any one label, or cross a location or team with a demographic band. A separate endpoint reports response rates while the survey is open, so you know whether a group needs a nudge.
Your appPOST /api/v1/surveys/results
{ "grouping1": "org_unit",
"grouping2": "tenure_bracket" }
→ counts, scores, eNPS per group
POST /api/v1/surveys/status
→ invited and replied per group
The guarantee
Anonymity isn’t a setting here. It’s the shape of the database.
A survey people don’t trust returns answers people don’t mean. So the promise isn’t a policy we could quietly change — it’s an absence of columns. There is no field to hold the information, and no query that could produce it.
Employee namesEmail addressesIP address of anyone answeringTime an answer was submittedAny link from an answer to an invitationPer-person results, at any threshold
What a stored answer actually consists of: a score from 0 to 10, an optional comment, and the group labels that were attached before the invitation went out. Whether a given invitation has been used is tracked as a single yes or no, with no timestamp — enough to count response rates, not enough to line anyone up. Answers are not even stored in the order they arrived.
Small groups are merged
A group is reported on its own only with at least six people invited and at least six replies. Both halves matter: eight invited with two replies describes those two people. Anything thinner is folded into a single “other” row, and if that row is also too small it comes back as counts alone — no scores, no comments.
Response rates are blunter still
While a survey is open you can watch participation by site, team or cost centre. That view carries counts only, never answers, and groups with fewer than two people invited are merged before you see them.
What this cannot protect you from: a comment that names its own author. Free text is the one thing we return verbatim, and “as the only left-handed actuary in Saskatoon…” identifies someone whatever the thresholds say. Worth saying so in the invitation.
Ask the question this quarter.
Registration takes a minute and gives you a token. Everything after that is four endpoints and your own code.