Smartsheet Project Row Sync to Dataverse
On a schedule, the flow reads rows from a Smartsheet project sheet, upserts each task into a Dataverse project table keyed on the Smartsheet row ID, and posts a Teams notice when a task's status flips to At Risk or Blocked. Keeps a Power Platform project app in sync with a PM-maintained Smartsheet.
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 synchronizes a Smartsheet project sheet into Dataverse so a Power Platform project app and reporting stay current with what PMs maintain in Smartsheet. On a schedule (every 2 hours) it reads sheet rows, upserts each task into a Dataverse project-task table keyed on the Smartsheet row ID, and posts a Teams notice whenever a task flips to At Risk or Blocked. Each run also writes an audit/watermark row recording when it ran and how many rows it processed. Status: BUILT - solution FlowLibs - Smartsheet Project Row Sync to Dataverse, flow shipped Off, Flow Checker 0 errors / 0 warnings, all three connectors bound. Why it matters: PMs love Smartsheet; the rest of the business lives in Power Platform. A keyed upsert keeps both aligned, and flip-detection surfaces newly at-risk tasks proactively instead of on every sync.
Use Case
A PMO runs project plans in Smartsheet but needs the data in Dataverse for cross-project dashboards and app workflows, plus immediate visibility the moment a task becomes At Risk or Blocked.
Flow Architecture
Every 2 Hours
Recurrence (Hour / 2)Sync cadence.
Initialize variables (x9)
Initialize VariableSheet id, Teams group/channel ids, the four Smartsheet column titles (task name, status, assignee, due date), rows-processed counter, and the per-run correlation id.
Get Sheet Rows
Smartsheet GetSheetDataReads all rows (columns keyed by title) into body/value[].
Apply To Each Row
Foreach (concurrency 1)Iterates each Smartsheet row.
List Existing Task
Dataverse ListRecords$filter flowlibs_smartsheetrowid eq the row id (the upsert key).
Compose Existing Status
ComposeCaptures previously-stored status for flip-detection.
Compose Task Row
ComposeBuilds the Dataverse row object as one bound expression.
Condition Task Exists
If (Update or Create)Yes -> Update Task (UpdateRecord); No -> Create Task (CreateRecord).
Increment Rows Processed
Increment VariableCounts the row.
Condition Status Flip
Ifstatus in (At Risk, Blocked) AND changed -> Notify Teams (PostMessageToConversation).
Compose Sync Run
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_SmartsheetSheetId | String | REPLACE_WITH_SMARTSHEET_SHEET_ID | Source Smartsheet sheet id. |
| flowlibs_TeamsGroupId | String | <your-team-id> | PM Teams group (Team) id. |
| flowlibs_TeamsChannelId | String | <your-channel-id> | PM Teams channel id. |
| flowlibs_ProjectTaskTable | String | flowlibs_projecttasks | Dataverse target table (entity set name). |
| flowlibs_ProjectSyncRunTable | String | flowlibs_projectsyncruns | Dataverse audit/watermark table (entity set name). |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Smartsheet | shared_smartsheet | GetSheetData |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord UpdateRecord |
| Microsoft Teams | shared_teams | PostMessageToConversation |
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.
- Column titles
- Edit the four Initialize var...Column actions to match your sheet headers (defaults: Task Name, Status, Assigned To, Due Date).
- At-risk labels
- The flip condition matches At Risk / Blocked (case-insensitive). Add more labels by extending the OR in Condition Status Flip.
- Cadence
- Change the Recurrence interval (default every 2 hours).
- Webhook
- For near-real-time sync, swap the Recurrence for the Smartsheet OnUpdatedSpecificSheet trigger (the connector exposes batch update triggers).
- Two-way
- Write Dataverse status changes back to Smartsheet via InsertRow/update; guard against loops with the existing flowlibs_source flag column.
- Due date
- flowlibs_duedate is a DateTime column; the flow passes the raw Smartsheet value (or null when empty). If your sheet uses a non-ISO date format, add a parse step.
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.01Upsert key (filter)
Matches the Dataverse row on the Smartsheet row id.
EXPR.02Previously-stored status
Reads the prior status for flip-detection.
EXPR.03Exists test
Decides Update vs Create.
EXPR.04Dynamic column read
Reads a Smartsheet column by its configured title.
EXPR.05Audit record
flowlibs_syncedon set to utcNow(); flowlibs_rowsprocessed set to the run counter.
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.