Notion Bug Tracker to Azure DevOps Sync
When a bug is logged or updated in a Notion bug database, the flow creates or updates a matching Azure DevOps work item, syncs state and priority both ways, and notifies the dev channel in Teams. Uses an ID mapping and source flag to avoid loops, letting non-developers triage in Notion while engineers work in Azure DevOps.
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 keeps a Notion bug database and Azure DevOps in two-way sync and notifies a Microsoft Teams dev channel. Non-developers triage bugs in Notion; engineers work the matching work items in Azure DevOps; state and priority stay aligned in both directions without duplicate data entry.
Because the Notion connector has no trigger and Azure DevOps changes are reconciled on a schedule, the sync is implemented as two poll-based cloud flows + one Dataverse mapping/ledger table. Echo loops are prevented by comparing each side's current value against the last-synced value stored in the ledger (a per-row idempotency check), backed by a source flag for audit.
Both flows ship Off (demo) with Flow Checker 0 errors / 0 warnings.
Use Case
A product team logs and triages incoming bugs in a Notion database, but engineering works in Azure DevOps. They want every Notion bug reflected as an ADO work item, status/priority kept in step in both directions, the linkage recorded so updates target the right counterpart, and the dev channel notified on new and changed bugs.
Flow Architecture
Flow 1: Recurrence (poll Notion)
Recurrence (15 min)Forward sync Notion -> Azure DevOps
List Notion Bugs
Notion Query_a_databaseReads all bug rows (filter in-flow)
Apply To Each Bug
Foreach (concurrency 1)Compose fields, then look up the ledger row by Notion page id
If Mapping Exists
IfBranches new vs existing bug
New bug -> Create ADO Work Item
ADO HttpRequest (JSON-Patch) + Dataverse CreateRecord + HTTP PATCH Notion + TeamsCreates work item, records mapping, writes ADO id back to Notion, notifies Teams
Existing bug -> Update ADO Work Item
ADO HttpRequest PATCH (System.History comment) + Dataverse UpdateRecord + TeamsUpdates work item and ledger when state/priority differ, posts a sync comment
Flow 2: Recurrence (poll ADO via WIQL)
Recurrence (15 min)Reverse sync Azure DevOps -> Notion for NotionSync-tagged items
Query Changed Work Items
ADO HttpRequest (WIQL POST)Work items changed in the last day tagged NotionSync
Apply To Each Work Item
Foreach (concurrency 1)Gets details, looks up the ledger by ADO id
If ADO Changed -> Update Notion
HTTP PATCH Notion + Dataverse UpdateRecord + TeamsPushes state to Notion, updates ledger (source=ADO), notifies Teams
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_NotionBugDatabaseId | String | (set per tenant) | Notion bug database id |
| flowlibs_NotionBugTitleProp | String | Name | Notion title property name |
| flowlibs_NotionBugStateProp | String | Status | Notion state property name (status/select type) |
| flowlibs_NotionBugPriorityProp | String | Priority | Notion priority property name |
| flowlibs_NotionBugDescProp | String | Description | Notion description (rich text) property |
| flowlibs_NotionBugAdoIdProp | String | ADO Work Item ID | Notion rich-text property that stores the linked ADO id |
| flowlibs_NotionApiBaseUrl | String | https://api.notion.com/v1 | Notion REST base (HTTP writeback) |
| flowlibs_AdoBugWorkItemType | String | Bug | ADO work item type to create |
| flowlibs_AdoApiVersion | String | 7.0 | ADO REST API version |
| flowlibs_NotionApiVersion |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Notion | shared_notionip | Query_a_database |
| Azure DevOps | shared_visualstudioteamservices | HttpRequest |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord UpdateRecord |
| Microsoft Teams | shared_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.
- Connect & configure
- Authorize the four connections, then set the env var values (Notion DB id + integration secret, ADO org/project, Teams group/channel ids).
- Map your Notion schema
- Point the flowlibs_NotionBug*Prop env vars at your actual property names; state/priority extraction supports both Notion status and select types.
- State mapping
- Notion state text is copied to ADO System.Tags and ADO System.State is copied back to the Notion status property. For strict workflows, insert a state-mapping Compose/Switch.
- Priority mapping
- Priority is carried as an ADO tag. To set the real Microsoft.VSTS.Common.Priority (1-4), add a mapping step in Compose_New/Update_Work_Item_Patch.
- Cadence
- Adjust the two Recurrence triggers (default 15 min) to your SLA.
- Turn on
- Flip both flows On once connections and env vars are set.
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.01Notion state (status or select)
Reads either Notion property type
EXPR.02Echo guard (forward)
Acts only when state or priority changed
EXPR.03ADO create URI (JSON-Patch)
Content-Type application/json-patch+json
EXPR.04ADO sync comment
JSON-Patch System.History comment
EXPR.05Notion writeback (dynamic property key)
Builds the PATCH body with a configurable property name
EXPR.06WIQL (reverse)
Recently changed NotionSync work items
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.