Survey Dashboard Template
A results layout that assembles itself from your own form export. Bring one row per respondent carrying a submission date, two segment columns, a Likert answer, a zero-to-ten score, a star rating and a yes-or-no question. Drop the file and the NPS split, the Likert distribution, the rating panels and the segment cuts appear. Nothing to fill in.
The sample is the fastest way to see whether this layout fits before you go and find your own export. Real-shaped responses across several departments and tenure bands.
The column contract
Eight columns: an identifier, a date, two segments and four answer columns of four different kinds. That variety is deliberate. A Likert item, a zero-to-ten score, a star rating and a boolean each want a different panel, and having one of each is what makes this layout worth using instead of a generic bar chart.
| Column | What it holds | Role | Required | What breaks without it |
|---|---|---|---|---|
response_id |
A response reference, like R-600 | Identifier | Optional | Nothing visual, but duplicate submissions become impossible to find, and a form left open in two tabs produces them regularly. |
submitted_date |
The day the response arrived | Date | Required | The response curve disappears, so you cannot see whether the reminder email worked or whether late responses skew negative. |
department |
The team the respondent belongs to | Category | Required | Every result collapses into one company-wide number, which is the least actionable form a survey result can take. |
tenure |
Band like under 1 year or 5+ years | Category | Optional | The second cut goes, and with it the ability to see whether new joiners and veterans disagree about the same question. |
recommend |
Likert answer, from strongly disagree to strongly agree | Category | Required | The distribution panel is gone, and a scale question summarized only as a mean loses the shape that makes it interesting. |
nps_score |
The raw 0 to 10 answer | Rating | Required | No promoter and detractor split and no headline NPS, which for most surveys is the number that gets quoted. |
rating |
A star or satisfaction score | Rating | Optional | You lose the second opinion. When rating and NPS disagree, that gap is usually the most useful finding in the whole survey. |
would_refer |
yes or no | Boolean | Optional | The clean binary split goes. It is the one answer nobody can hedge on, which makes it the easiest to present. |
What you get
- A KPI strip. Total responses, net promoter score, average rating, and the share answering yes to the referral question. Four numbers that fit on one slide.
- Responses over time. Submissions per day. The shape tells you when reminders went out, and whether the last few days added anything new.
- NPS distribution. A count at every score from zero to ten. Almost every survey is bimodal here, with a pile at eight to ten and a smaller pile low down, and the single NPS number hides that completely.
- Promoter, passive, detractor split. The standard three buckets as shares, so the headline number can be seen rather than just quoted.
- Likert distribution. Counts across the agreement scale for the recommend question, left in scale order rather than sorted by size, because a Likert axis that jumps from agree to strongly disagree to neutral is unreadable.
- NPS by department. The cut that turns a company number into a conversation with a specific team.
- Rating by tenure. Satisfaction across tenure bands. A dip at the one-to-two-year mark is common and worth naming out loud.
- Referral rate by department. The percentage answering yes, per team, which usually tracks NPS closely and occasionally does not, and the exception is the interesting one.
- Response counts by segment. Deliberately its own panel, sitting next to the results, so nobody quotes a department bar built from three people.
i. Bring these columns
Export responses in wide format, one row per person, then rename the headers. Survey tools export the full question text as the header, so you will be replacing things like How likely are you to recommend us to a friend or colleague? with nps_score. Do that rename in the file rather than in your head; a chart titled with a forty-word question is not a chart anyone will read.
Split multi-selects into one column per option, and drop the free-text columns entirely before you go any further.
ii. Drop the file
Open the dashboard view and drop the CSV. Roles come from the values, which matters a lot here. nps_score holding small integers in a bounded range reads as a rating rather than as a quantity, so it is never summed. recommend holding short repeating phrases reads as a category and gets a distribution. would_refer holding only yes and no reads as a boolean and gets a two-way split.
The file never leaves the tab. For an anonymous internal survey that promise had to be kept before anyone opened a browser, but it is worth knowing that nothing here weakens it.
iii. Adjust what you need
The adjustment that matters most on a survey dashboard is sort order. Set the Likert panel to file order so the scale runs from strongly disagree to strongly agree, instead of being sorted largest first, which scrambles an ordinal axis into nonsense. After that, swap department for tenure on any segment panel, and switch a rating panel from mean to median when the distribution is lopsided.
Then export. PNG for the readout deck, and the aggregated CSV alongside it, because survey findings get challenged more than any other kind and being able to hand over the exact counts behind a bar ends that conversation in one message.
Getting your export into this shape
Form tools mostly export the right shape and the wrong headers. Google Forms writes a Timestamp column and then one column per question, using the full question text including any punctuation you typed. Typeform does the same and adds submission metadata columns. SurveyMonkey is the awkward one: its CSV has two header rows, the first holding the question and the second holding the sub-question or answer label, so a naive parse gives you a first data row full of column names. Delete or merge that second row before anything else. Qualtrics exports three header rows and an import ID line, which is worse but at least consistent.
Once the headers are single and short, the real work is multi-select. A question like which channels do you use exports as a single cell containing Email, Chat, Phone or sometimes Email;Chat;Phone. That is one value. Two hundred respondents choosing freely from six options can generate over fifty distinct combinations, and a bar chart of those combinations is a wall of ones. Split it into one column per option, named uses_email, uses_chat and so on, each holding yes or no for every row including the ones that did not pick it. Each column then reads as a boolean and gets a clean panel. It also makes crossing them with a segment possible, which the combined cell never allows. Comma-separated values inside a comma-delimited file are their own small nightmare, so if your tool offers a different separator for multi-select, take it.
Next, partial responses. Most tools export people who opened the form and abandoned it, and those rows arrive with a date and nothing else. Decide the rule and apply it: I usually drop any row where the NPS question is blank, since that is the question the whole survey exists for. Whatever you decide, write the count of dropped rows into your readout, because response rate is a number people ask about immediately.
Then segment hygiene. Free-text department fields produce Engineering, engineering, Eng and R&D as four separate bars. Map them to one vocabulary before you drop the file. Tenure is the same story when it is collected as a free-text number of years: band it into three or four ranges, since twenty-nine distinct year values produce twenty-nine bars and no insight.
Watch the scale directions too. Some tools export a Likert item with strongly agree coded as 1, so higher looks worse, and if two questions in the same survey run in opposite directions any comparison between them inverts. Keep Likert answers as their original words and this problem simply does not arise.
Finally, anonymity. Strip email addresses, employee numbers and any free-text comment column before the file goes anywhere, including into this dashboard. Then check your segments for small cells: department crossed with tenure crossed with location will produce groups of one, and a group of one is a name however the survey was labeled.
What this template will not do
- No significance testing. Two bars at different heights might be a real difference or might be six people. There are no confidence intervals here and no p values, and I would rather say that than draw an error bar from assumptions the file does not support.
- No text analysis. Free-text comments are not aggregated, coded or summarized. Read them yourself; that is genuinely the best available method at survey scale.
- No wave-on-wave comparison. One file is one survey. Comparing this quarter against last needs both waves in one file with a wave column, and matching question wording across them, which is usually the harder half.
- No weighting. Every response counts once. If your respondents do not match your population, the results are skewed and the dashboard cannot correct for it.
- It will not order an unfamiliar scale. Standard agreement wording is recognized. A custom scale may need the sort set to file order manually so the axis runs in the right direction.
- No response-rate denominator. The file holds responses, not invitations. The dashboard can count who answered and has no idea how many were asked.
Frequently Asked Questions
What is being offered here, if not a downloadable file?
A column contract. The results layout exists already and it activates when it sees rows carrying response_id, submitted_date, department, tenure, recommend, nps_score, rating and would_refer. You bring the responses and the panels arrange themselves around them. For survey work this is a much better fit than a workbook, because every survey has a slightly different question set and a fixed template would need rebuilding each time you change one.
One row per response, always?
Always. One respondent, one row, one column per question. Some export tools offer a long format instead, with one row per question per respondent and columns called question and answer. That shape cannot produce this dashboard, because a single numeric column would then hold NPS scores, star ratings and Likert codes all mixed together and any average across it is meaningless. Pivot the long format wide before you drop the file.
How do I handle a multi-select question?
Split it into one boolean column per option, named for the option, holding yes and no or true and false. A single column holding Email; Chat; Phone in one cell is one value as far as any dashboard is concerned, so a hundred respondents produce sixty distinct combinations and no readable chart. One column per option gives you a clean count for each, they can be compared, and the fact that the percentages add to more than a hundred stops being confusing because each column is its own question.
Should Likert answers be text or numbers?
Text, as in the sample, where recommend holds values like agree and strongly disagree. Text reads as a category and produces a proper distribution across the scale, which is what a Likert item is for. Coding it to 1 through 5 tempts everyone into averaging it, and the average of an ordinal scale assumes the gap between agree and strongly agree is the same size as the gap between neutral and agree, which nobody has ever demonstrated. If you want a number too, add a coded column alongside and be honest that it is a convenience.
How is the NPS score meant to be stored?
As the raw 0 to 10 integer the respondent chose, one per row. Do not store a precomputed promoter or detractor label instead, and do not store a group-level NPS. The dashboard buckets the raw scores into detractors at 0 to 6, passives at 7 and 8, and promoters at 9 and 10, then reports the percentage of promoters minus the percentage of detractors. Keeping the raw column means the same file can also show the full distribution, which is frequently more informative than the single headline number.
Why are department and tenure in the contract?
Because a survey result with no segment is one number, and one number never tells you what to do. Splitting satisfaction by department turns a mediocre company average into a specific problem in a specific team. Tenure is the second most useful cut in almost every internal survey, since new joiners and five-year veterans answer differently about the same thing. Any two segmenting columns will work; these two are the ones I have never regretted collecting.
Small segments look extreme. Is the dashboard wrong?
No, the sample size is. A department with four responses can swing thirty NPS points on one person changing their mind, and the bar will be drawn with exactly as much confidence as a bar built from four hundred responses. Check the response count panel next to any segment chart before you quote it. If a segment has fewer than about twenty responses, treat it as an anecdote worth following up rather than a measurement worth acting on.
What about free-text comments?
Keep them out of this file. A dashboard aggregates, and a column of unique paragraphs has nothing to aggregate; it will be read as a category with one value per row and produce a chart with a bar for every respondent. Comments are also where anonymity actually breaks, since people describe situations that identify them. Export the text separately if you need to read it, and drop the column before you build the dashboard.
Is an anonymous survey still anonymous here?
Nothing in the file leaves your browser tab, so no data is exposed by using this page. The risk with an internal survey is in the file itself, not in the tool: department plus tenure plus location plus role is often enough to identify one person, whatever the survey promised. Before you share the export with anyone, check whether any combination of your segment columns produces a group of one or two, and collapse those segments if it does.
Related
Try it on sample responses
Several departments, several tenure bands, one row per respondent. See the readout before you clean your own export.
Load the template with sample data