SurveyMonkey Response to CRM Enrichment
When a SurveyMonkey response is received, the flow matches the respondent to a Dataverse contact/account by email, writes the score and key answers onto the CRM record (last survey score, date, sentiment), and tags the account at-risk if the score is low. Keeps customer health current in the CRM from survey signals.
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 flow enriches the CRM from SurveyMonkey responses. Each time a new response is submitted, the flow reads the respondent's email and survey score, looks up a matching CRM contact in Dataverse, and writes the latest score, date, sentiment and at-risk flag onto that record. If no contact matches the email, it creates a new CRM contact from the response so the CRM stays complete. A Teams message notifies the account-owner channel either way.
Why it matters: Survey signals are most useful sitting next to the customer record. Pushing the score and an at-risk flag onto the CRM keeps customer-health current and visible to the people who own the relationship — no manual data entry.
Status: Built as an unmanaged solution, shipped Off (demo). Going live requires only authorizing the three connections and setting the environment variable values.
Use Case
A sales / customer-success team wants every customer's latest survey score, sentiment and risk flag on their CRM contact record automatically, and wants the owning channel pinged when feedback is negative.
Flow Architecture
When a new SurveyMonkey response is received
SurveyMonkey OnNewResponseAddedSurvey (polling, splitOn body)Fires per new response.
Initialize Correlation Id
InitializeVariable (String)Run correlation id.
Initialize Respondent Email
InitializeVariable (String)Respondent email match key.
Initialize Respondent Name
InitializeVariable (String)Respondent name.
Initialize Survey Score
InitializeVariable (Integer)Survey score.
Initialize AtRisk Threshold
InitializeVariable (Integer)At-risk score threshold.
Initialize CRM Entity Set
InitializeVariable (String)CRM contact entity-set name.
Compose Sentiment
ComposeNegative/Neutral/Positive from the score.
Initialize At Risk Flag
InitializeVariable (String)Yes/No at-risk flag.
List Matching CRM Contacts
Dataverse ListRecords ($filter email eq)Look up the contact by email.
Check If Contact Exists
Condition (If)On match: Update CRM Contact Enrichment (Dataverse UpdateRecord) then Post Teams Enrichment Update. On no match: Create CRM Contact From Response (Dataverse CreateRecord) then Post Teams New Contact.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_SurveyMonkeySurveyId | String | REPLACE_WITH_SURVEY_ID | Survey the trigger polls (reused). |
| flowlibs_TeamsGroupId | String | <your-team-id> | Target Teams team for the alert (reused). |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Target Teams channel for the alert (reused). |
| flowlibs_AtRiskScoreThreshold | String | 6 | Score at/below which the account is tagged at-risk. |
| flowlibs_CrmContactEntitySet | String | flowlibs_surveycrmcontacts | CRM contact entity-set name used by ListRecords. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| SurveyMonkey | shared_surveymonkey | OnNewResponseAddedSurvey |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords UpdateRecord CreateRecord |
| Microsoft Teams | shared_teams | PostMessageToConversation |
Note — All connections are referenced as solution connection references; the flow is portable between environments as long as a connection is mapped at import time.
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.
- Composite health score
- Blend the survey score with support/usage signals into a single customer-health field on the contact.
- Score history
- Add a child table and append each response so you can chart sentiment trajectory.
- CS playbook
- Branch on the at-risk flag to start an Approvals-gated recovery playbook (see Detractor Recovery).
- Account rollup
- Match on account/domain as well as email to roll survey health up to the account level.
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.01Score (from custom_value)
Reads score from custom_value.
EXPR.02Sentiment
Derives sentiment band.
EXPR.03At-risk flag
Tags the account at-risk.
EXPR.04Email match filter
Looks up the matching contact.
EXPR.05Contact-found test
Branches match vs create.
EXPR.06Matched contact id
Id of the matched contact.
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.