
Image URL
Do not index
Do not index
AI summary
An in-app NPS survey lets you collect real‑time feedback from active users within your product, showing a 0‑10 rating question at a natural break point and routing promoters to testimonial or case‑study requests; it requires setting up targeting rules, pre‑filling user name and email via URL parameters, and handling display formats (card, panel, modal) while avoiding interruptions during onboarding, checkout, errors, or unsaved work, and includes guidance on timing, frequency, and technical implementation details.
Title
How to Run an In-App NPS Survey
Date
Oct 17, 2026
Description
How to run an in-app NPS survey: when in-app beats email, when to show it, what never to interrupt, and the exact setup with Testimonial's NPS embed.
Status
In progress
Current Column
In the queue
Person
Writer
Your NPS email goes to the person who signed the contract.
The people who use your product every day never open it.
The ones who do are rating something they last touched three weeks ago.
An in-app NPS survey asks the people doing the work, while they're doing it. It also misses everyone who has stopped logging in. That tradeoff is the whole decision, so this post starts there — then when to show the survey, what never to interrupt, and the exact setup with Testimonial's NPS embed.
If you want the programme around the score — what happens after a 9 or a 6 — start with our guide to NPS surveys. NPS is one input in the whole testimonial pipeline; this post is only about the in-product channel.
What you'll end up with
- A 0–10 NPS question inside your logged-in product, shown to the users you choose, at a moment you choose
- Every response attributed to a real person, without asking them who they are
- Promoters routed into a testimonial request or a case study invite, automatically
- In-app responses you can read separately from email responses
In-app or email: pick by who you need to hear from
In-app | Email | |
Reaches | Active users, at the moment of use | Anyone with an address — dormant accounts, the buyer, the admin who never logs in |
Misses | Anyone who has stopped logging in | People who ignore vendor email |
Context | They just used the product | They're in their inbox, between other things |
Use it for | "How's the product working for you?" | The account-level view and renewal risk |
The row people skip is Misses.
An in-app score can only hear from people who still show up. The users drifting toward churn are exactly the ones it can't reach. So an in-app score tends to flatter you, and a rising one doesn't mean the account base is healthier.
My verdict: if you sell to teams, run both, and don't merge them in your head. In-app for the people using the product. Email for the person who renews it — our NPS survey email templates cover that half. If you sell to individuals who are both user and buyer, in-app alone is a reasonable place to start.
When to show it
The survey should appear at a moment that has nothing to do with the survey.
After the core job has happened a few times. Someone in their first session is rating your onboarding, not your product. Wait until they've done the thing they signed up to do — sent the invoice, published the report, shipped the build — more than once. Pick the number from your own product; there's no universal one.
At a finished moment, never mid-task. Right after an export downloads. On the dashboard after a report goes out. The person has just finished something, so a ten-second question costs them nothing.
Once per person per cadence. Store when you last showed it, and check before you show it again. Intercom's own help docs, writing about their users, say: "we recommend surveying our users no more than once a month" (Survey best practices, as of October 2026). Treat that as a ceiling, not a target. For relationship NPS I'd ask far less often than that.
Only people you're willing to email. If promoter routing is on, a 9 or 10 triggers an email to that person. Don't show the survey to anyone you wouldn't want to receive one — trial users on a free seat, a customer mid-dispute, an account your team has flagged.
What never to interrupt
- The first session and any onboarding checklist. You'll measure setup friction and call it loyalty.
- Checkout, upgrade and cancellation flows. A score shown during cancellation measures the cancellation.
- Error states, and the screen right after a failed action.
- Anything with unsaved work — an editor, a long form, a half-built report.
- The week after a support ticket. You'll be scoring the ticket.
None of these need data to justify. They're the moments you'd hate to be interrupted yourself.
Card, panel or modal
An inline card on the home screen or dashboard is the least intrusive option. It's easy to ignore, which is the point. I'd start here.
A slide-in panel gets more attention and still lets the person carry on working.
A modal gets the most attention and costs the most. Use it only at a finished moment, and always give it a close button.
Whichever you pick, the survey should look like part of your product, not a pop-up from someone else's. That's what Minimal mode below is for.
Doing this with Testimonial
Testimonial's NPS ships as a survey you can send by email and as a 0–10 NPS embed you place on a page or inside your product. Same survey, same routing — the embed is just another way in.
Why use it for in-app: the embed lets you hand over the identity you already have. A response from a known person can route a promoter straight into a testimonial or case study request. An anonymous score can't route anywhere.
What you need before starting
- The Ultimate + plan. NPS with auto-routing is listed under Ultimate +, $95/month per space as of October 2026 — see pricing.
- A Space in Testimonial.
- Access to your app's front-end, or a developer who has it. The embed is a snippet; you decide where it goes.
- The signed-in user's name and email, available where you render the survey.
Steps
- Create the survey. In your Space, click "NPS" in the left sidebar, then "New NPS survey" — or "Create your First NPS Survey" if you don't have one yet.
- Name it for yourself. The Name is an internal label — recipients never see it. Something like "In-app — product" keeps it apart from your email survey.
- Keep the question. The default is "How likely are you to recommend us to a friend or colleague?" You can rewrite it, but if you'll compare scores over time, leave it alone.
- Turn on the follow-up. Tick "Ask a follow-up question". The default is "What's the main reason for your score?" It's optional for the respondent, sits on the same screen as the score, and takes up to 2,000 characters. In-app, I'd always keep it: the person has the product in front of them and can tell you exactly what they meant.
- Check the thresholds. The colour-coded score bar has drag handles. Leave the standard 0–6 / 7–8 / 9–10 unless you have a reason to move them — how to calculate NPS shows how the buckets turn into the score.
- Set promoter routing. Under Promoters, tick "Send them a testimonial request email", "Invite them to a case study", or both. The testimonial request goes out with the subject "Would you leave us a quick testimonial?" by default, with a "Leave a testimonial" button to your collection page. You can edit the sender name, subject, body and button colour. Passives and detractors have their own options in the same section; our guide to NPS surveys covers what to do with each.
- Click "Create". You land in the survey's management view: Analytics, Submissions, Recipients, Settings, Embed. Skip "Recipients" — that's for email invitations.
- Open "Embed" and choose the look. Turn on "Dark theme" if your app is dark. Turn on "Minimal mode" — a transparent background with no header — so the survey reads as part of your UI. Then click "Copy code".

- Pass the person in. The help centre's instruction: if you already know who is viewing the page, append
&email=...and&name=...to the iframe URL. That pre-fills and locks both fields and skips the "Tell us who you are" step. URL-encode both values. Illustrative, with blanks:
<!-- Paste the full snippet from "Copy code", then add the two parameters to the iframe's src -->
<iframe src="[the src from Copy code]&email=[url-encoded user email]&name=[url-encoded user name]" ...></iframe>Build those values from your logged-in session on the server or in your app state, never from a field the user types into.
- Render it only when your rule says yes. The embed shows wherever your code puts it, so the "when" lives in your app. A minimal version, illustrative:
// Illustrative — replace the bracketed values with your own rules
const showNps =
user.isSignedIn &&
user.coreActionCount >= [your threshold] &&
daysSince(user.npsLastShownAt) >= [your cadence in days] &&
!user.inOnboarding &&
!user.openSupportTicket;
if (showNps) {
renderNpsCard(); // your container + the snippet from step 9
saveNpsLastShownAt(user); // write the timestamp when you show it, not when they answer
}Write the timestamp when the card is shown. If you only write it on submit, someone who ignores the card will see it every session.
- Test it. Click "Preview" in the management view first to see what respondents see. Then sign in to your app as a test user, let the rule fire, and submit a score. Use a throwaway survey for this so test scores don't sit in your real numbers.

What it looks like when it worked
- The signed-in user sees the 0–10 buttons, labelled "Not at all likely" to "Extremely likely", straight away. No name or email screen.
- After they click "Submit", the response appears in "Submissions" with their name, score, comment and date.
- In "Analytics" you can view embedded NPS, email NPS, or all — so in-app responses stay separable from email ones.
- If they scored in your promoter range and routing is on, the testimonial request goes to the email you passed in step 9.
What they send back is theirs. Publishing it still needs their permission — see the legal side of testimonials.
Where ours stops
Three things to know before you pick this over a dedicated in-app survey tool:
- It doesn't decide when to appear. It's an embed. Targeting, sampling and "last shown" tracking are yours to build — step 10 is the minimum.
- The documented setup is a snippet for a web page. If your product is a native mobile app, check how you'd host it before you plan around it.
- Identity is whatever you append. The pre-fill trusts the URL. Get the values from the session and the attribution is solid; get them wrong and every routed email goes to the wrong person.
If targeting is the hard part for you, use a tool built for it. Refiner documents a Target Audience (who is eligible) plus a Launch Trigger (when it shows): Immediately, Time Delay, Page Visit, Screen Visit, Tracked Event or Manual, with a Recurrence setting on top (Refiner launch triggers, as of October 2026). Intercom's Surveys trigger on event, date, page and audience rules, and Intercom suggests a "Last Survey received" rule to stop over-surveying (Intercom help, as of October 2026). That's the job they're built for.
Use ours if the hard part is what happens after a 9 or a 10: a promoter who turns into a testimonial or a case study without anyone sorting a spreadsheet.
Where people get stuck
The name and email screen still shows. The parameters didn't make it into the iframe. Open your browser's dev tools, inspect the iframe and read its
src. You're looking for &email= and &name= on the end, with values in them.Names with accents or spaces come through mangled. URL-encode both values (
encodeURIComponent in JavaScript) before appending them.The survey is cut off or has a tall empty gap. The embed uses the same iframe-resizer pattern as Wall of Love widgets, so it resizes itself to fit its container. Paste the whole snippet from "Copy code", not just the
<iframe> line, and don't put it inside a fixed-height box with overflow hidden.The same person sees it every day. That's step 10. Write the "last shown" timestamp when the card renders, not when it's answered.
In-app scores look better than email scores. That can be the channel, not the product: in-app only hears from people still logging in. Read the two side by side; don't average them into one number and celebrate.
Wrapping up
That's an in-app NPS survey: pick the channel by who you need to hear from, show it at a finished moment, pass the identity in, and let your 9s and 10s route themselves.
Stuck on the pre-fill or the trigger logic? Reply and tell me which step — I'll help you wire it up.



