Skip to content

Tables and columns

A datasource can include up to eight tables. Power BI shows only the ones you ticked when you created the datasource.

  • Column names are the same as in Zendesk’s own API, such as created_at or assignee_id.
  • IDs are whole numbers. Columns ending in _id point to a row in another table, marked → below.
  • Dates and times include the time zone.
  • Tags in the main tables come as one text value, separated by commas. To filter or group by tag, use the tag tables instead.
  • Every column is always there. If a ticket has no value, the cell is empty.

One row per ticket that matches the datasource’s ticket filter. Key: id.

Column Type Notes
id Int64 Ticket number
subject, raw_subject, description Text
status, priority, type Text
custom_status_id Int64
requester_id, submitter_id, assignee_id Int64 → Users.id
organization_id Int64 → Organizations.id
group_id Int64 → Groups.id
brand_id, ticket_form_id, problem_id, forum_topic_id Int64
external_id, recipient, url Text
is_public, has_incidents, from_messaging_channel True/false
satisfaction_score, satisfaction_comment Text unoffered means no survey was sent
via_channel Text The channel the ticket came in through
tags Text Comma-separated
due_at, created_at, updated_at Date-time
one column per custom field Varies See Custom fields

Timings for each ticket that matches the filter. Key: ticket_id, one row per ticket. Tickets that Zendesk has no metrics for get no row.

Column Type
ticket_id Int64, → Tickets.id
metric_set_id Int64
group_stations, assignee_stations, reopens, replies Int32
assigned_at, initially_assigned_at, solved_at, assignee_updated_at, requester_updated_at, status_updated_at, latest_comment_added_at Date-time
reply_time_…, first_resolution_time_…, full_resolution_time_…, agent_wait_time_…, requester_wait_time_…, on_hold_time_… Int64, minutes
created_at, updated_at Date-time

Each duration comes twice: _calendar_minutes and _business_minutes. Business minutes stay empty unless your Zendesk account has a business schedule.

Every user in the account. The ticket filter doesn’t apply. Key: id.

id, name, email, role, active, suspended, verified, organization_id (→ Organizations.id), default_group_id (→ Groups.id), custom_role_id, external_id, alias, details, notes, phone, time_zone, iana_time_zone, locale, ticket_restriction, two_factor_auth_enabled, last_login_at, tags, created_at, updated_at.

role is end-user, agent or admin. Filter on it to split customers from agents.

Every organization in the account. The ticket filter doesn’t apply. Key: id.

id, name, details, notes, external_id, group_id (→ Groups.id), shared_tickets, shared_comments, domain_names (comma-separated), tags, url, created_at, updated_at.

Every agent group in the account. The ticket filter doesn’t apply. Key: id.

id, name, description, is_default, deleted, is_public, url, created_at, updated_at.

One row per object and tag, so tags can be used as a slicer or an axis. Each table has two columns, and together they form the key.

Table Columns Ticket filter applies?
Ticket tags ticket_id (→ Tickets.id), tag Yes
User tags user_id (→ Users.id), tag No
Organization tags organization_id (→ Organizations.id), tag No

Power BI usually doesn’t link these tables on its own, because the column names differ (requester_id in one table, id in the other). Add the links yourself in Model view, by dragging one column onto the other:

From To Cardinality
Ticket metrics[ticket_id] Tickets[id] One to one
Ticket tags[ticket_id] Tickets[id] Many to one
Tickets[requester_id] Users[id] Many to one
Tickets[organization_id] Organizations[id] Many to one
Tickets[group_id] Groups[id] Many to one
User tags[user_id] Users[id] Many to one
Organization tags[organization_id] Organizations[id] Many to one

A ticket points to three users: requester, submitter and assignee. Power BI allows only one active link between two tables, so link requester_id to Users, and load Users a second time as an Agents table for assignee_id. The report template does exactly that.