SurveyMonkey Verbatim Theme Analysis
When SurveyMonkey responses come in, the flow runs the open-text answers through Azure AI Text Analytics (key phrases + sentiment) and Azure OpenAI to assign a theme, stores the enriched response in Dataverse, and posts a weekly Teams digest of top emerging themes. Turns free-text feedback into actionable, categorized insight.
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 open-text (verbatim) feedback into categorized, sentiment-scored insight, then trends it weekly. It is built as two coordinated cloud flows in one solution:
1. FlowLibs - SurveyMonkey Verbatim Theme Enrichment (event-driven) — fires on each new survey response, pulls the open-text answers, classifies theme + sentiment + key phrases with Azure OpenAI, and stores the enriched record in a Dataverse table. 2. FlowLibs - SurveyMonkey Weekly Theme Digest (scheduled) — once a week, reads the last 7 days of enriched records, tallies mentions per theme, and posts a top-emerging-themes digest to Microsoft Teams.
Why it matters: Open-text is the richest feedback but the hardest to analyze at scale. Automated theming surfaces what customers actually care about — ranked, sentiment-scored, and trended — without anyone reading comments one at a time.
*As-built note:* classification is done with the Azure OpenAI connector; the description's mention of Azure AI Text Analytics is not part of the as-built connector set.
Use Case
A CX/product team collects verbatim feedback in SurveyMonkey and wants it themed, sentiment-scored, and trended automatically. Each response is enriched the moment it arrives; leadership gets a weekly Teams digest of the highest-volume themes. The two flows are decoupled through a shared Dataverse table (a correlationId is stamped on every enriched row so an individual response can be traced from enrichment into the digest window).
Flow Architecture
When a new survey response is added
SurveyMonkey OnNewResponseAddedSurvey (poll, splitOn)Flow A: one run per new response on flowlibs_SurveyId.
Init Correlation Id
Initialize variableMint guid() for cross-flow tracing.
Get Response Details
SurveyMonkey GetResponseDetailsRetrieve the full open-text answers for the response.
Compose Verbatim Text
ComposeCollapse the answer payload into a single verbatim string.
Compose AI Messages
ComposeBuild the chat messages (system prompt constrains theme to flowlibs_ThemeSet, forces JSON).
Classify With Azure OpenAI
Azure OpenAI ChatCompletions_Create_2024Feb15PreviewAssign theme, sentiment, key phrases (json_object mode, temperature 0).
Parse AI Result
Parse JSONParse the model's JSON into theme / sentiment / keyPhrases.
Store Themed Response
Dataverse CreateRecordWrite the enriched record to flowlibs_verbatimtheme.
Flow B: Every week
Recurrence (Week/1)Reads last 7 days (ListRecords), collects/distinct themes, tallies mentions per theme, composes digest HTML, and posts the weekly digest to Teams.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_SurveyId | String | <configure> | Source SurveyMonkey survey id the trigger watches. |
| flowlibs_ThemeSet | String | Pricing,Product Quality,Customer Support,Usability,Delivery & Shipping,Feature Request,Other | Allowed themes the AI must choose from. |
| flowlibs_AOAIDeploymentName | String | gpt-4o-mini | Azure OpenAI chat model deployment. |
| flowlibs_AOAIApiVersion | String | 2024-02-15-preview | Azure OpenAI api-version. |
| flowlibs_TeamsGroupId | String | <your-team-id> | Teams team (group) id for the digest. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | Teams channel id for the digest. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| SurveyMonkey | shared_surveymonkey | OnNewResponseAddedSurvey GetResponseDetails |
| Azure OpenAI | shared_azureopenai | ChatCompletions_Create_2024Feb15Preview |
| Microsoft Dataverse | shared_commondataserviceforapps | CreateRecord ListRecords |
| Microsoft Teams |
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.
- Theme taxonomy
- Edit flowlibs_ThemeSet to your own categories; the model is constrained to choose exactly one.
- Auto-routing
- Branch on flowlibs_theme (e.g. route Pricing to the billing team) by adding a Condition/Switch after the AI classification.
- Trend / spike alerts
- In Flow B, compare a theme's current count to a stored baseline and alert when volume spikes.
- Sentiment escalation
- In Flow A, add a Condition: if sentiment = negative, post an immediate Teams/Outlook alert in addition to storing the row.
- Multilingual
- Translate the verbatim (Microsoft Translator) before the Azure OpenAI call.
- Digest cadence
- Change the Recurrence frequency/interval, or filter the digest to negative-sentiment rows only.
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.01Theme/sentiment system prompt
Constrains the model output.
EXPR.02AI output text
Extracts the model's JSON content.
EXPR.03Digest window filter (Dataverse $filter)
varWindowStart = @{addDays(utcNow(),-7)}.
EXPR.04Distinct themes
De-duplicates themes.
EXPR.05Per-theme count
Counts mentions of each theme.
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.