NPS survey pop-up guide
Get a sense of your customers' satisfaction level with a Net Prompter Score survey
1. Go to "Settings' -> "App settings" -> "User Data&Events" -> "Client attributes" and click "Create".
2. You need one custom attribute: NPS rating.
In this example, NPS rating will have the Value Type set as integer. (The form will have rating values of 0, 1, 2 ...10.)

3. You need a HTML list with all your ratings: similar to this:
<div class="rating">
<ul class="rating-list">
<li>
<input type="radio" id="rating_0" name="nps_rating" value="0"/>
<label for="rating_0">0</label>
</li>
<li>
<input type="radio" id="rating_1" name="nps_rating" value="1"/>
<label for="rating_1">1</label>
</li>
<li>
<input type="radio" id="rating_2" name="nps_rating" value="2"/>
<label for="rating_2">2</label>
</li>
<li>
<input type="radio" id="rating_3" name="nps_rating" value="3"/>
<label for="rating_3">3</label>
</li>
<li>
<input type="radio" id="rating_4" name="nps_rating" value="4"/>
<label for="rating_4">4</label>
</li>
<li>
<input type="radio" id="rating_5" name="nps_rating" value="5"/>
<label for="rating_5">5</label>
</li>
<li>
<input type="radio" id="rating_6" name="nps_rating" value="6"/>
<label for="rating_6">6</label>
</li>
<li>
<input type="radio" id="rating_7" name="nps_rating" value="7"/>
<label for="rating_7">7</label>
</li>
<li>
<input type="radio" id="rating_8" name="nps_rating" value="8"/>
<label for="rating_8">8</label>
</li>
<li>
<input type="radio" id="rating_9" name="nps_rating" value="9"/>
<label for="rating_9">9</label>
</li>
<li>
<input type="radio" id="rating_10" name="nps_rating" value="10"/>
<label for="rating_10">10</label>
</li>
</ul>
</div>
4. Now, go to "Form code editor": Tools > Pop-ups > Create new > Form code editor.
5. Paste the HTML list code into the editor. Before the final </div> closing, insert your custom NPS rating attribute. Add display: "none style" to it since it will only be holding your real value for this attribute, and we are using radio inputs shown above to get the rating.
...
</li>
</ul>
<input type="hidden" name="REPLACE_WITH_YOUR_ATTRIBUTE_NAME">
</div>
...
6. Add script handling update of your hidden attribute.
<script>const ratingInputs = document.querySelectorAll('[name="nps_rating"]');
for (var input of ratingInputs) {
input.addEventListener('change', function (e) {
document.querySelector('input[name="REPLACE_WITH_YOUR_ATTRIBUTE_NAME"]').value = e.target.value;
});
}
</script>
7. Bear in mind that you have to change the bold text according to the inserted attribute name. To do so, first insert a field by clicking on Insert button like this:

After this a field will be inserted, looking like this

It is very important to leave the field but to comment it out (using <!-- and --> tags) so it looks like this:
<!-- [:attr_nps_rating_788 class="ue_input"] -->
Text after ":" and before "class" is your attribute name (in this case it's "attr_nps_rating_788"). Replace "REPLACE_WITH_YOUR_ATTRIBUTE_NAME" with it. The result should look like this:

8. Add some style, a submit button, a cancel button and a heading, and thats it!
<style>
.form {
max-width: 600px;
margin: 30px;
font-family: Arial, sans-serif;
background-color: white;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
border-radius: 5px;
padding: 1rem;
}
.rating {
display: flex;
flex-direction: column;
position: relative;
}
.rating h2 {
margin-top: 0;
}
.rating ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
justify-content: space-between;
}
@media (max-width: 660px) {
.rating ul {
flex-wrap: wrap;
justify-content: flex-start;
}
.rating ul li label {
margin: 0 10px 10px 0;
}
}
.rating ul li {
display: inline-flex;
}
.rating ul li input {
position: absolute;
visibility: hidden;
width: 0;
height: 0;
margin: 0;
}
.rating ul li label {
height: 46px;
width: 46px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
border: 1px solid #2db039;
background-color: #ffffff;
font-size: 18px;
color: #414042;
text-decoration: none;
user-select: none;
}
.rating ul li input[type="radio"]:checked + label {
background-color: #35d144;
color: #ffffff;
}
.rating ul li label:hover {
background-color: #2db039;
color: #ffffff;
}
button {
border: 0;
padding: 0.7em 2em;
font-size: 1rem;
background-color: #8d8d8d;
color: white;
margin: 1rem 0 0;
}
button[type="submit"] {
background-color: #1b5e20;
color: white;
}
</style>
9. Save!
Here's the result followed by the final code:

<div class="form"><div class="rating"><h2>NPS Rating</h2><ul class="rating-list"><li><input type="radio" id="rating_0" name="nps_rating" value="0"/><label for="rating_0">0</label></li><li><input type="radio" id="rating_1" name="nps_rating" value="1"/><label for="rating_1">1</label></li><li><input type="radio" id="rating_2" name="nps_rating" value="2"/><label for="rating_2">2</label></li><li><input type="radio" id="rating_3" name="nps_rating" value="3"/><label for="rating_3">3</label></li><li><input type="radio" id="rating_4" name="nps_rating" value="4"/><label for="rating_4">4</label></li><li><input type="radio" id="rating_5" name="nps_rating" value="5"/><label for="rating_5">5</label></li><li><input type="radio" id="rating_6" name="nps_rating" value="6"/><label for="rating_6">6</label></li><li><input type="radio" id="rating_7" name="nps_rating" value="7"/><label for="rating_7">7</label></li><li><input type="radio" id="rating_8" name="nps_rating" value="8"/><label for="rating_8">8</label></li><li><input type="radio" id="rating_9" name="nps_rating" value="9"/><label for="rating_9">9</label></li><li><input type="radio" id="rating_10" name="nps_rating" value="10"/><label for="rating_10">10</label></li></ul>
<!--
[:nps_rating class="ue_input"]
--><input type="hidden" name="nps_rating"></div>
<button data-dismiss="true">Cancel</button><button type="submit">Submit</button>
</div>
<script>const ratingInputs = document.querySelectorAll('[name="nps_rating"]');
for (var input of ratingInputs) {
input.addEventListener('change', function (e) {
document.querySelector('input[name="nps_rating"]').value = e.target.value;
});
}
</script>
<style>
.form {
max-width: 600px;
margin: 30px;
font-family: Arial, sans-serif;
background-color: white;
box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
border-radius: 5px;
padding: 1rem;
}
.rating {
display: flex;
flex-direction: column;
position: relative;
}
.rating h2 {
margin-top: 0;
}
.rating ul {
list-style: none;
padding: 0;
margin: 0;
display: flex;
justify-content: space-between;
}
@media (max-width: 660px) {
.rating ul {
flex-wrap: wrap;
justify-content: flex-start;
}
.rating ul li label {
margin: 0 10px 10px 0;
}
}
.rating ul li {
display: inline-flex;
}
.rating ul li input {
position: absolute;
visibility: hidden;
width: 0;
height: 0;
margin: 0;
}
.rating ul li label {
height: 46px;
width: 46px;
display: flex;
align-items: center;
justify-content: center;
border-radius: 50%;
border: 1px solid #2db039;
background-color: #ffffff;
font-size: 18px;
color: #414042;
text-decoration: none;
user-select: none;
}
.rating ul li input[type="radio"]:checked + label {
background-color: #35d144;
color: #ffffff;
}
.rating ul li label:hover {
background-color: #2db039;
color: #ffffff;
}
button {
border: 0;
padding: 0.7em 2em;
font-size: 1rem;
background-color: #8d8d8d;
color: white;
margin: 1rem 0 0;
}
button[type="submit"] {
background-color: #1b5e20;
color: white;
}
</style>