Follow up with every NPS detractor
Open one Zendesk ticket per unhappy account a month and share detractor comments in Slack, from NPS responses in PostgreSQL. SQL and cadences included.
- PostgreSQL
- Zendesk
- Slack
- Customer success
- once per account per month
The trigger
One read-only SELECT against PostgreSQL. Rowfire polls it for new rows, and the rule fires once per account per month.
SELECT r.id AS response_id,
a.id AS account_id,
a.name AS account,
p.name AS plan,
r.respondent,
r.score,
r.comment,
r.submitted_at
FROM nps_responses r
JOIN accounts a ON a.id = r.account_id
JOIN plans p ON p.id = a.plan_id
WHERE r.score <= 6
AND a.is_internal = falseThe clock is submitted_at and the key is account_id. A score of 6 or
below is a detractor on the standard NPS scale.
One trigger, two rules
| rule | fires at most | action | demo backtest, 120 days |
|---|---|---|---|
detractor_follow_up |
once per account per month | Zendesk ticket, high priority | 65 of 120 rows |
detractor_to_slack |
once per account per day | Slack #customer-voice |
120 |
The trigger is polled once and its rows go to both rules, so the channel hears every comment while customer success gets one ticket per unhappy account a month.
{{ respondent }} at {{ account }} ({{ plan }}) scored us {{ score }}: "{{ comment }}"
Start both rules in shadow, check the backtest’s example rows, then promote. For accounts that never got going at all, see rescue trials that never activated.
Questions
Why key it by account and not by response?
Several people at one company can score you low in the same week. Keyed by account, customer success opens one ticket for the company, not one per respondent.
Can the whole team see the comments without the ticket noise?
Yes. A second rule on the same trigger posts to a Slack channel at most once a day per account, while the ticket rule stays monthly.