Zendesk Ticket to Dataverse and Power BI Analytics
On a schedule, the flow exports Zendesk tickets and metrics into a Dataverse table (status, priority, CSAT, resolution time, agent) and refreshes a Power BI dashboard of volume, SLA attainment, and agent performance. Provides governed support analytics blended with other business data.
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 delivers governed support analytics from Zendesk. On a daily schedule it reads the Zendesk *tickets* dataset, upserts each ticket's metrics (status, priority, type, CSAT, resolution time, assignee, requester, timestamps) into a dedicated Dataverse table, then refreshes a Power BI dataset so the support dashboard (volume, SLA attainment, agent performance) always reflects the latest data.
Why it matters: Zendesk Explore is siloed. Landing the data in Dataverse lets you blend support KPIs with sales/ops/finance metrics and report on them in Power BI alongside the rest of the business.
Build status: Built via the FlowLibs API-first method (workflow-table clientdata). Ships Off. Flow Checker: 0 errors / 0 warnings. All three connections bound.
Use Case
Leadership and operations want support KPIs in Power BI next to the rest of the business, on a governed, auditable Dataverse table rather than a Zendesk-only export. The flow keeps a row per ticket, refreshed daily, with no duplicates (idempotent upsert keyed on the Zendesk ticket id).
Flow Architecture
Recurrence_Daily_Export
Recurrence (Day/1, 6:00 AM ET)Runs the export once daily
Initialize_Snapshot_Timestamp
Initialize Variable (string varSnapshotDate = utcNow())One run timestamp stamped on every row for time-series reporting
Get_Zendesk_Tickets
Zendesk GetItems (table + $filter from env vars)Reads the Zendesk tickets dataset
Export_Each_Ticket
Foreach over body/value (sequential, concurrency 1)Processes each ticket
Find_Existing_Metric_Row
Dataverse ListRecords ($filter on flowlibs_ticketid)Looks up an existing metric row for this ticket
Upsert_Metric_Row
Condition (If) — row count = 0?Branch to create vs update
Create_Metric_Row
Dataverse CreateRecordInserts a new metric row
Update_Metric_Row
Dataverse UpdateRecord (by recordId)Refreshes the existing row
Refresh_PowerBI_Dataset
Power BI RefreshDataset (groupid+datasetid)Refreshes the analytics dashboard dataset
Environment Variables
| Schema name | Type | Default | Description |
|---|---|---|---|
| flowlibs_ZendeskTicketsTable | String | tickets | Zendesk dataset table read by GetItems (reused) |
| flowlibs_ZendeskAnalyticsFilter | String | status ne 'deleted' | OData $filter applied to the export — returns all non-deleted tickets incl. solved/closed so CSAT and resolution time are captured (new this build) |
| flowlibs_PowerBIWorkspaceId | String | (workspace/group id) | groupid path param for RefreshDataset (reused) |
| flowlibs_PowerBIDatasetId | String | (dataset id) | datasetid path param for RefreshDataset (reused) |
Connectors & Connections
| Connector | API name | Actions used |
|---|---|---|
| Zendesk | shared_zendesk | GetItems |
| Microsoft Dataverse | shared_commondataserviceforapps | ListRecords CreateRecord UpdateRecord |
| Power BI | shared_powerbi | RefreshDataset |
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.
- Filter scope
- Change flowlibs_ZendeskAnalyticsFilter (e.g. status:open, or an updated_at window) to control which tickets are exported each run.
- Schedule
- Adjust the Recurrence_Daily_Export frequency/time for more frequent loads.
- More fields
- Zendesk ticket rows expose tags, organization_id, group_id, due_at, etc.; add columns + item/... mappings to capture them.
- CSAT trend / backlog snapshot / agent leaderboard
- Build these as Power BI visuals over the flowlibs_zendeskticketmetric table; the flowlibs_snapshotdate column supports daily time-series snapshots.
- Portability
- To move tenants, update only the four env var values and re-authorize the three connection references.
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.01Run snapshot
Single run timestamp stamped on every row
EXPR.02Ticket id (dedup key)
Zendesk ticket id used as the upsert key
EXPR.03Existing-row lookup filter
Dataverse filter to find an existing metric row
EXPR.04Upsert branch test
Decide create vs update by row count
EXPR.05Update record id
Record id of the existing row for UpdateRecord
EXPR.06Resolution hours (solved/closed only)
Compute resolution hours for resolved tickets
EXPR.07CSAT score (null-safe)
Read the CSAT score with an unrated fallback
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.