Viva Engage Town Hall Question Collector
Ahead of a town hall/AMA, the flow collects questions submitted via a Microsoft Form or a Viva Engage thread, de-duplicates and clusters similar questions, ranks them by upvotes/reactions, and delivers a ranked list to the presenter plus a Teams summary. Makes leadership Q&A sessions data-driven and inclusive.
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 makes town hall / AMA Q&A data-driven. Each time an attendee submits a question through a Microsoft Form, the flow captures it, also reads the linked Viva Engage community thread, de-duplicates questions, ranks the combined set by upvotes/reactions, posts a ranked summary to a Teams channel, and emails the presenter the ranked list. A Dataverse table is the durable question store so rankings accumulate across submissions.
Why it matters: The loudest voices shouldn't dominate Q&A. Aggregating questions from a Form and a Viva thread and ranking by reaction surfaces the questions people actually care about.
Status: Built as a demo — ships Off. Going live requires only (1) authorizing the five connection references and (2) setting the seven environment variable values. No placeholder/fixture data — every data fetch is a real connector action.
Use Case
Leadership running a quarterly town hall wants the top employee questions surfaced and ranked automatically, drawn from both a submission Form and an open Viva Engage community thread, without manual triage.
Flow Architecture
When a Town Hall Question Is Submitted
Microsoft Forms CreateFormWebhookFires per Form submission; form_id is bound to flowlibs_TownHallFormId.
Initialize & read submission
InitializeVariable + Forms GetFormResponseById + ComposeMint a guid() correlation id, load topic and status labels, retrieve the submitted answer set, and extract/normalize the question text and submitter.
Dedup the Form question
Dataverse ListRecords + Condition + CreateRecordLook up an equivalent normalized question; create a new question record if none exists.
Read & merge Viva thread
Viva GetMessagesInGroupV3 + Filter + ForeachRead the linked community thread, keep non-system posts containing a ?, and per message normalize → dedupe by message id → create if new (CreateRecord) else update upvotes (UpdateRecord).
Rank, summarize & deliver
Dataverse ListRecords + Select/Compose + Teams + OutlookRead all rows ordered by upvotes desc (top 20), build a ranked HTML table, post the summary to the town hall Teams channel, and email the presenter the ranked list.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_TownHallFormId | String | REPLACE_WITH_FORM_ID | Microsoft Form for question submission (trigger) |
| flowlibs_FormQuestionFieldId | String | REPLACE_WITH_FORM_QUESTION_FIELD_ID | Form answer-field id holding the question text |
| flowlibs_VivaEngageCommunityId | String | REPLACE_WITH_VIVA_COMMUNITY_ID | Viva Engage community/group id (reused) |
| flowlibs_TeamsGroupId | String | REPLACE_WITH_TEAMS_GROUP_ID | Teams team (group) id for the summary (reused) |
| flowlibs_TeamsChannelId | String | REPLACE_WITH_TEAMS_CHANNEL_ID | Teams channel id for the summary (reused) |
| flowlibs_PresenterEmail | String | presenter@contoso.com | Presenter who receives the ranked email |
| flowlibs_TownHallTopic | String | Quarterly Town Hall | Topic label in Teams/email headings |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Microsoft Forms | shared_microsoftforms | CreateFormWebhook GetFormResponseById |
| Viva Engage | shared_yammer | GetMessagesInGroupV3 |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord UpdateRecord |
| 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.
- Smarter clustering
- Replace exact normalized-text matching with fuzzy matching or an Azure OpenAI grouping step to merge semantically similar questions.
- Live re-ranking
- The flow re-ranks and re-posts on every submission; add a debounce or switch to a scheduled digest if posting frequency is too high.
- Anonymity
- Form questions store the responder; map the submitter to Anonymous if you want fully anonymous Q&A.
- Answer follow-up
- After the event, post answers back to the Viva thread or mark rows with a Status of Answered.
- Top-N
- Change the $top on Get Ranked Questions to control how many questions appear in the summary.
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.01Form question (configurable field)
Read the question from the configured answer field.
EXPR.02Normalize for dedup
Lowercased/trimmed text for de-duplication.
EXPR.03Viva is-question filter
Keep non-system Viva posts containing a question mark.
EXPR.04Viva upvotes
Reaction count + 1 for ranking.
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.