Notion Tasks to Microsoft Planner Sync
Bidirectionally syncs a Notion tasks database with a Microsoft Planner plan: new/changed Notion tasks create or update Planner tasks in the matching bucket, and Planner status changes write back to Notion. Uses a stored ID mapping and a source flag to prevent loops. Lets Notion planners and Planner/Teams users share one task list.
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 tasks database in two-way sync with a Microsoft Planner plan. New/changed Notion tasks create or update Planner tasks in the mapped bucket; when a Planner task is completed, the status is written back to the matching Notion page. A Dataverse ID-mapping ledger plus a source flag prevent infinite update loops, so a Notion-first team and a Planner/Teams team can work from one shared list.
Why it matters: Some people live in Notion, others in Planner/Teams. A loop-safe bidirectional sync means neither group has to switch tools or duplicate effort.
> Built as a two-flow + one-table solution (FlowLibs build CF-449). Ships Off — going live needs only connection authorization and environment-variable values.
Use Case
A team plans in Notion but executes in Teams/Planner (or vice versa). They want tasks and completion status mirrored across both tools, with status-to-bucket mapping and no infinite echo loops.
Flow Architecture
Poll Notion Tasks
Recurrence (hourly)Schedules the poll of the Notion tasks database (Flow A).
Initialize correlation id
Initialize variable (@guid())Mints a trace id (correlationid) carried across both flows and the ledger.
Query Notion Tasks
Notion Query_a_databaseFetches all task rows (filtered in-loop).
Apply to each Notion task
Foreach (concurrency 1)For each task: compose page id/status/title, look up the Dataverse ID-mapping ledger row (ListRecords); if a mapping exists, Update_Planner_Task (Planner UpdateTask_V2) then Update_Mapping_Row (Dataverse UpdateRecord) stamping source=Notion; otherwise Create_Planner_Task (Planner CreateTask_V3) in the mapped bucket then Create_Mapping_Row (Dataverse CreateRecord).
Post Sync Summary To Teams
Microsoft Teams PostMessageToConversationPosts a run summary to the Teams channel.
Flow B — Planner Completion to Notion Writeback
Planner OnCompleteTask (trigger) + Dataverse + HTTP PATCH + TeamsA separate flow fires when a Planner task is completed: it finds the ledger row by Planner task id (ListRecords), checks the loop guard (mapped and not already Done), then writes the status back to Notion via HTTP PATCH, stamps the ledger source=Planner / lastsyncedstatus=Done (UpdateRecord), and notifies Teams.
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_NotionTasksDatabaseId | String | <configure> | Notion tasks database to poll. |
| flowlibs_PlannerPlanID | String | <configure> | Target Planner plan (reused). |
| flowlibs_PlannerGroupID | String | <your-team-id> | Owning M365 group of the plan (reused). |
| flowlibs_PlannerBucketMap | String | { } | Notion status name to Planner bucket id (JSON). |
| flowlibs_NotionTitlePropertyName | String | Name | Notion title property name. |
| flowlibs_NotionStatusPropertyName | String | Status | Notion status property name. |
| flowlibs_NotionStatusDoneValue | String | Done | Status value that marks complete. |
| flowlibs_NotionApiSecret | String | <configure> | Notion integration secret (HTTP writeback). |
| flowlibs_NotionVersion | String | 2022-06-28 | Notion-Version header value. |
| flowlibs_TeamsGroupId | String |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Notion (Independent Publisher) | shared_notionip | Query_a_database |
| Microsoft Planner | shared_planner | CreateTask_V3 UpdateTask_V2 OnCompleteTask |
| 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.
- Bucket mapping
- Populate flowlibs_PlannerBucketMap with {"<Notion status>":"<Planner bucket id>"} pairs to route tasks into buckets.
- Status property type
- The Notion status read coalesces Status- and Select-type properties; the writeback PATCH targets a Status property. If your DB uses a Select, change the PATCH body from status to select.
- Completion mapping
- percentComplete is set to 100 when the Notion status equals flowlibs_NotionStatusDoneValue, else 0. Extend with a richer status to percent map if needed.
- Assignees / due dates / labels
- Extend CreateTask_V3/UpdateTask_V2 with assignments, dueDateTime, and appliedCategories and map from Notion properties.
- Polling cadence
- Adjust the Recurrence interval on Flow A and the Planner OnCompleteTask poll on Flow B.
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 status (Status or Select)
Reads the Notion status from either a Status or a Select property.
EXPR.02Notion title
Reads the Notion task title, defaulting when empty.
EXPR.03Bucket lookup
Maps the Notion status to a Planner bucket id.
EXPR.04Loop guard (Flow B)
Only writes back when the task is mapped and not already marked Done.
EXPR.05Notion writeback body
Builds the Notion PATCH body that sets the status property.
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.