SurveyMonkey Detractor Recovery Workflow
When a SurveyMonkey response scores below a threshold (detractor/low CSAT), the flow opens a recovery case in Dataverse, alerts the account owner in Teams, emails the respondent a personal follow-up (if identifiable), and tracks the case to closure with an SLA. Turns negative feedback into structured service recovery.
Provided as-is, without warranty of any kind. Review and test each pattern in a non-production environment before deploying it to live automations. See our Terms.
Overview
This solution turns negative SurveyMonkey feedback into structured, SLA-tracked service recovery. When a survey response scores below a configurable detractor threshold, the Intake flow opens a recovery case in Dataverse, alerts the account-owner Teams channel, and emails the respondent a personal follow-up (when an email was collected). A second scheduled SLA Monitor flow watches for cases that pass their SLA due date and escalates them.
Why it matters: A detractor is most recoverable right after they complain. Automating case creation, owner alerting and SLA escalation closes the loop fast instead of leaving feedback to sit in a dashboard.
Built as two flows + one Dataverse table in one solution. Both flows ship Off; going live requires only connection authorization and environment-variable values.
Use Case
A CX / Operations team wants low-scoring survey responses to automatically become tracked recovery cases, each with an owner alert, a personal respondent follow-up, and an SLA that auto-escalates if the case is not resolved in time.
Flow Architecture
When_a_survey_response_is_submitted
SurveyMonkey OnNewResponseAddedSurvey (poll Minute/3, splitOn)Fires once per new response.
Initialize_Correlation_Id
Initialize Variable (string)guid() traceability id.
Initialize_Score_Threshold
Initialize Variable (integer)Detractor cutoff from env var.
Initialize_Response_Score
Initialize Variable (integer)Score carried on custom_value.
Initialize_Respondent_Email
Initialize Variable (string)Email if identity collected.
Initialize_Respondent_Name
Initialize Variable (string)First + last name.
Initialize_SLA_Hours
Initialize Variable (integer)SLA window for the case.
Initialize_Response_Id
Initialize Variable (string)SurveyMonkey response id.
Condition_Is_Detractor
Condition (less(score, threshold))On detractor: compose case title, Create_Recovery_Case (Dataverse), Post_Teams_Alert, and if email present Send_Followup_Email (Outlook). Satisfied responses are ignored.
SLA Monitor: Check_for_overdue_cases_on_a_schedule
Recurrence (Hour/1)Flow B hourly sweep: List_Overdue_Cases (Dataverse), then per case Post_SLA_Breach_Teams, Send_SLA_Breach_Email, Mark_Case_Escalated.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_SurveyMonkeySurveyId | String | <configure> | Survey the Intake flow polls (reused). |
| flowlibs_DetractorScoreThreshold | String | 7 | Score strictly below this = detractor (new). |
| flowlibs_SLADefaultThresholdHours | String | 24 | SLA window in hours (reused). |
| flowlibs_TeamsGroupId | String | <your-team-id> | Account-owner Teams team (reused). |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Alert channel (reused). |
| flowlibs_RecoveryAlertEmail | String | alerts@yourcompany.com | SLA-breach escalation distro (reused). |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| SurveyMonkey | shared_surveymonkey | OnNewResponseAddedSurvey |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord ListRecords UpdateRecord |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Office 365 Outlook | shared_office365 |
Customization Guide
Almost every realistic variant of this flow can be implemented by changing environment variable values. A few cases require small edits inside the flow definition — those are called out explicitly below.
- Threshold
- Adjust flowlibs_DetractorScoreThreshold (e.g. 7 for NPS detractors 0-6, or a CSAT cutoff).
- SLA window
- Change flowlibs_SLADefaultThresholdHours; new cases pick it up automatically.
- Owner routing
- Match the respondent email to an account/contact to route to the right owner channel.
- Closure + win-back
- Add a status of Closed and a goodwill follow-up email on resolution; the SLA Monitor only acts on Open cases.
- Root cause
- Store the verbatim theme on the case for trend reporting.
Key Expressions
The flow is intentionally light on Power Fx / WDL gymnastics — the heaviest expressions are the branch-name concatenation and the approval outcome check. They are listed below in the order they appear in the flow.
EXPR.01Detractor gate
Routes low scores into recovery.
EXPR.02Score (from custom_value)
Reads the score carried on custom_value.
EXPR.03SLA due date
Computes the case SLA due date.
EXPR.04Overdue filter (Flow B)
Finds open, overdue cases.
EXPR.05Has-email gate
Only emails identifiable respondents.
Customize & download
Generate a ready-to-import copy of this solution with your environment-variable values baked in — available on Base, Pro, or Team.
Upgrade to customize
Comments
Sign in to join the conversation.
Sign inNo comments yet. Be the first to share your experience with this flow.