Viva Engage Question to Expert Routing
When a question is posted in a Viva Engage community and goes unanswered for a threshold, the flow identifies likely experts (by topic/skill in Dataverse or Azure AD) and notifies them in Teams to respond, then thanks responders. Reduces unanswered questions and connects people to expertise faster.
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 connects Viva Engage community questions to subject-matter experts. On an hourly schedule it scans a configured Viva Engage community, identifies posts that look like questions and have gone unanswered past a threshold, matches each question to an expert from a Dataverse roster (by topic), notifies the matched expert in a Microsoft Teams channel, and records the routing in a Dataverse ledger for idempotency and audit.
Why it matters: Unanswered questions erode community value. Automatically routing them to the right people lifts response rates, surfaces organizational expertise, and prevents questions from slipping through the cracks.
Status: Built as an unmanaged solution; ships Off. Going live requires only connection authorization and environment-variable configuration.
Use Case
A knowledge-sharing Viva Engage community wants questions that nobody has engaged with to be automatically routed to the appropriate subject-matter expert. Rather than relying on people to monitor the feed, the flow watches for unanswered questions, matches them by topic against a maintainable expert roster, and posts a prompt to a Teams routing channel. Every routing is logged so the same question is never routed twice.
Flow Architecture
Recurrence
Recurrence (Hour / 1)Runs hourly to scan the community.
Initialize variables
InitializeVariableMint a guid() correlation id and load each environment variable (community id, scan limit, unanswered hours, Teams group/channel, default expert) into a working variable.
Get Recent Community Posts
Viva Engage GetMessagesInGroupV3Read recent thread-starter posts (threaded=true) from the configured community, then filter to non-system posts containing a ? with zero reactions (unanswered proxy).
Foreach question
Foreach (sequential)Compute the question's age; check the ledger by message id (idempotency); when age >= threshold AND not already routed, read the active expert roster (ListRecords), match an expert whose topic appears in the question text (fallback to the default expert), post the question + suggested expert to the routing channel (Teams), and write a ledger record (CreateRecord).
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_VivaEngageCommunityId | String | REPLACE_WITH_VIVA_COMMUNITY_ID | Numeric Viva Engage community (group) ID to monitor. |
| flowlibs_VivaEngageScanLimit | String | 50 | Max recent posts to scan per run. |
| flowlibs_QuestionUnansweredHours | String | 4 | Hours a question may go unanswered before routing. |
| flowlibs_ExpertRoutingTeamsGroupId | String | 00000000-0000-0000-0000-000000000000 | Teams group (team) ID of the routing channel. |
| flowlibs_ExpertRoutingTeamsChannelId | String | 19:0000…@thread.tacv2 | Teams channel ID where questions are posted. |
| flowlibs_DefaultExpertContact | String | community-experts@yourcompany.com | Fallback expert email when no topic match is found. |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Viva Engage | shared_yammer | GetMessagesInGroupV3 |
| Microsoft Teams | shared_teams | PostMessageToConversation |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord |
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.
- Maintain the expert roster
- Add rows to Engage Expert with a single keyword in flowlibs_topicarea (matched against the question text) and flowlibs_isactive = Yes. Use flowlibs_topickeywords for documentation/future multi-keyword matching.
- Tune the threshold
- Change flowlibs_QuestionUnansweredHours to make routing more or less eager; adjust the Recurrence frequency to match.
- Smarter topic matching
- Replace the single-keyword contains match with an Azure OpenAI classification step that maps the question to a topic, then match on that.
- Thank responders (phase 2)
- Add a companion flow that re-reads the community, detects when a routed question has gained a reply/reaction (via liked_by), and posts a thank-you.
- Resolve author names
- The flow stores the Viva Engage sender_id; add a GetUserDetailsById call to display the asker's name.
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.01Unanswered-question filter
Non-system question posts with zero reactions.
EXPR.02Question age (hours)
Hours elapsed since the post was created.
EXPR.03Expert topic match
Match experts whose topic area appears in the question.
EXPR.04Selected expert (with fallback)
Pick the matched expert or fall back to the default 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.