SurveyMonkey Employee Pulse to HR Action
When an employee pulse-survey response comes in (eNPS, engagement), the flow anonymizes and aggregates results by team in Dataverse, alerts HR in Teams when a team's score drops below a threshold, and on a schedule emails managers their team's anonymized pulse summary. Drives timely action on employee sentiment while protecting anonymity.
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 SurveyMonkey employee pulse surveys into timely HR action while protecting anonymity. It is built as two cloud flows in one solution sharing a single anonymized Dataverse table:
- Flow A — Employee Pulse Response Intake and HR Alert (event-driven): on each new pulse response it stores an anonymized record (team, score, date only — no respondent identity) in Dataverse and alerts HR in Teams when the score is below the engagement threshold. - Flow B — Manager Pulse Summary Scheduled Digest (scheduled weekly): reads the anonymized responses, enforces an anonymity floor, and posts an aggregated per-team summary to the managers' Teams channel.
Why it matters: Employee sentiment data is only valuable if it reaches managers fast — without exposing individuals. Aggregated, threshold-driven alerts drive action while preserving trust. The flows deliberately never read or store respondent name/email.
Status: Built and verified (Flow Checker 0 errors / 0 warnings on both flows). Both flows ship Off — going live requires only authorizing the connections and setting the environment variable values.
Use Case
An HR team running pulse surveys (eNPS / engagement) wants per-team trends and early warnings on declining engagement, with anonymity guaranteed. HR is alerted in real time when a team's score drops below a threshold, and managers receive a weekly anonymized summary — all without ever seeing individual responses.
Flow Architecture
When_a_new_pulse_response_is_added
SurveyMonkey OnNewResponseAddedSurvey (poll, splitOn)Fires per new completed pulse response.
Initialize_Correlation_Id
Initialize Variable (String)Mints guid() to trace this response.
Initialize_Team
Initialize Variable (String)Resolves team (default for demo; custom_value / survey question at go-live).
Initialize_Score
Initialize Variable (Integer)Pulse score (demo stand-in reads custom_value).
Initialize_Threshold
Initialize Variable (Integer)Engagement threshold from env var.
Get_Survey_Details
SurveyMonkey GetSurveySurvey title for the record + alert.
Create_Anonymized_Pulse_Record
Dataverse CreateRecordStores team + score + date (no identity).
Check_If_Below_Threshold
Condition (If)If below threshold, Alert_HR_In_Teams (PostMessageToConversation) with an anonymized early warning.
Flow B: Weekly_Recurrence
Recurrence (Week/1)Reads last 7 days (ListRecords), counts responses, checks anonymity floor, then selects/builds an HTML per-team summary and posts to managers' Teams; otherwise composes a suppressed note.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_PulseSurveyId | String | REPLACE_WITH_SURVEY_ID | SurveyMonkey survey id (Flow A trigger + GetSurvey). |
| flowlibs_EngagementThreshold | String | 70 | Score below which HR is alerted. |
| flowlibs_MinResponsesForReport | String | 5 | Anonymity floor for the weekly summary. |
| flowlibs_DefaultTeamName | String | General Staff | Team label stand-in for the Off demo. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams group/team id for posts. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Teams channel id for posts. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| SurveyMonkey | shared_surveymonkey | OnNewResponseAddedSurvey GetSurvey |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord ListRecords |
| 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.
- Map the real score and team at go-live
- Replace the demo stand-ins: read the eNPS/engagement rating question from triggerOutputs()?['body/pages'], and the team from a survey question or a second SurveyMonkey invite parameter passed in custom_value.
- Driver questions
- Break out engagement drivers (manager, workload, recognition) into separate columns/scores per team.
- Trend over time
- Add a Power BI report over flowlibs_pulseresponse to chart eNPS by quarter.
- Action plans
- On a below-threshold alert, also create a manager action-plan task (Planner/To-Do).
- Separate audiences
- Point the HR alert and the manager summary at different Teams channels by adding a second group/channel env-var pair.
- Delivery channel
- Swap or add Outlook SendEmailV2 to email managers their summary in addition to the Teams post.
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.01Correlation id (Flow A, action 1)
Trace id for the response.
EXPR.02Team resolution (demo)
Go-live: map from triggerOutputs()?['body/pages'] or body/custom_value.
EXPR.03Score stand-in (demo)
Reads the pulse score from custom_value.
EXPR.04Alert gate (Flow A)
Alerts HR when below threshold.
EXPR.057-day window (Flow B ListRecords $filter)
Limits to the last week.
EXPR.06Response count
Counts responses in window.
EXPR.07Anonymity gate (Flow B)
Suppresses small-sample summaries.
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.