SurveyMonkey Triggered Survey Dispatch
When a business event happens (case closed, order delivered, onboarding completed in Dataverse), the flow sends the right SurveyMonkey survey to the contact via the Send-Survey/collector API with personalized metadata, respecting a frequency cap so customers aren't over-surveyed. Automates event-driven, well-governed survey distribution.
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 distributes SurveyMonkey surveys at the moment of experience. When a transactional business event is recorded in Dataverse (case closed, order delivered, onboarding completed), the flow picks the right survey for that event type, checks a per-contact frequency cap, and emails the contact a personalized survey link — then logs the send for audit and future cap checks.
Why it matters: Surveys sent at the moment of experience get far higher response and relevance. A governed dispatch with a frequency cap protects the customer relationship from over-surveying.
Status: Built and verified (Flow Checker 0 errors / 0 warnings). Ships Off — going live requires only authorizing the three connections and setting env var values.
Use Case
A team wants transactional surveys triggered by events, personalized, and capped per contact — not blasted on a schedule. A Business Event row is created by an upstream system (CRM case-close plugin, order-fulfillment flow, onboarding completion, etc.); this flow reacts to that row, dispatches the survey, and records it.
Flow Architecture
When a Business Event Completes
Dataverse SubscribeWebhookTrigger (create, org scope)Fires when a new Business Event row is created.
Initialize varCorrelationId
InitializeVariable (String)guid() trace id stamped on the log row.
Initialize varContactEmail
InitializeVariable (String)Recipient email from the trigger row.
Initialize varContactName
InitializeVariable (String)Contact name (defaults to Customer).
Initialize varEventType
InitializeVariable (String)Event type used to select the survey.
Initialize varEventReference
InitializeVariable (String)Source transaction id (case/order).
Initialize varFrequencyCapDays
InitializeVariable (Integer)Min days between surveys (from env var).
Initialize varSurveyLogTable
InitializeVariable (String)Survey-log entity set name (from env var).
Initialize varSurveyId
InitializeVariable (String)Survey id mapped from event type, else default.
Check Frequency Cap
Dataverse ListRecordsRecent sends to this contact within the cap window.
Condition Eligible
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_EventSurveyMap | String | {"case_closed":"100000001","order_delivered":"100000002","onboarding_completed":"100000003"} | Event type → SurveyMonkey survey id. |
| flowlibs_FrequencyCapDays | String | 30 | Min days between surveys to one contact. |
| flowlibs_SurveyLogTable | String | flowlibs_surveylogs | Entity set name of the send-log table. |
| flowlibs_DefaultSurveyId | String | 100000001 | Fallback survey id when event type is unmapped. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Dataverse | shared_commondataserviceforapps | SubscribeWebhookTrigger ListRecords CreateRecord |
| SurveyMonkey | shared_surveymonkey | GetSurvey |
| Office 365 Outlook | shared_office365 | SendEmailV2 |
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.
- Event → survey routing
- Edit flowlibs_EventSurveyMap to add event types and their survey ids; unmapped types fall back to flowlibs_DefaultSurveyId.
- Frequency cap
- Change flowlibs_FrequencyCapDays (e.g. 7, 90) to tune how often a contact may be surveyed.
- Channel choice
- Swap Send Survey Invitation for an SMS connector (e.g. Twilio) to deliver by text instead of email.
- Sampling
- Add a Condition before dispatch using rand(1,100) to survey only a percentage of contacts and reduce fatigue.
- Locale
- Extend the map to event-type+language keys and select a localized survey id per contact.
- Trigger on update instead of create
- Change the trigger's message to Update and add a filterexpression if 'completed' is signalled by a status change rather than a new row.
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.01Survey for event
Maps event type to a survey id.
EXPR.02Cap window filter
Built with concat + formatDateTime(addDays(utcNow(), mul(-1, varFrequencyCapDays)), 'yyyy-MM-ddTHH:mm:ssZ').
EXPR.03Eligible
True when under the frequency cap.
EXPR.04Survey link
Collector link for the invite.
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.