offdataai
Sales & CRM · data model template

Customer Support / CX Analytics data model

Kimball warehouse for help-desk/ticketing support: an accumulating-snapshot ticket fact (open → first response → resolved → closed) with SLA-breach and FCR flags, a transaction-grain ticket-activity fact, and a CSAT survey fact, over conformed customer/agent/channel/priority/category/product dimensions on BigQuery. For Salesforce Service Cloud (Case, Entitlement, Milestone, Asset), use the Salesforce Service Cloud Analytics template.

Vendor-neutral customer-support and CX analytics for help-desk/ticketing platforms (Zendesk, Freshdesk, ServiceNow, Intercom): the ticket lifecycle, conversation activity, and CSAT/CES/NPS survey responses over a conformed SCD2 customer dimension with agent, channel, priority, category, and product dimensions for SLA, FCR, and satisfaction analytics. It is a Kimball dimensional model: fact tables at a declared grain surrounded by conformed dimensions, ready for BI tools and a semantic layer.

KimballSales & CRMGDPRCCPA
10
tables
98
columns
15
relationships
6
PII columns

Opening the template creates a project with the ERD, platform-native DDL, a dbt project and documentation already generated (recommended platform: BigQuery). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

ticketssatisfactionconformed_dimensions

Design decisions

  • Accumulating snapshot for tickets

    A support ticket has a clear lifecycle (open → first response → resolved → closed); an accumulating snapshot delivers response, resolution, and handle-time lags from one evolving row.

  • Separate activity fact at touchpoint grain

    SLA and FCR live on the ticket, but conversation flow, reassignments, and per-reply latency need their own transaction-grain fact.

  • Dedicated CSAT fact rather than a ticket attribute

    Surveys are optional, can have multiple responses, and carry CES/NPS alongside CSAT, so a separate fact keeps the ticket grain clean.

  • Masking of customer and agent PII under GDPR/CCPA

    Support records contain personal contact data subject to access and erasure rights; email is hashed and names classified confidential.

Tables in the Customer Support / CX Analytics model

Every table with its grain, columns, types and keys. PK marks a primary key, BK a business key and PII a column classified as personal data, which gets a masking strategy by default.

Fact tables (3)

fct_ticket

Grain: one row per support ticket (accumulating snapshot open → resolved → closed)

Accumulating-snapshot fact — one row per ticket; milestone date keys and durations fill as the ticket progresses.

ColumnTypeKeys
ticket_keybigintPK
customer_keybigint
agent_keybigint
channel_keybigint
priority_keybigint
category_keybigint
product_keybigint
opened_date_keybigint
first_response_date_keybigint
resolved_date_keybigint
closed_date_keybigint
ticket_idvarchar
ticket_statusvarchar
first_response_minutesinteger
resolution_minutesinteger
handle_time_minutesinteger
reopen_countsmallint
reassignment_countsmallint
is_first_contact_resolutionboolean
is_sla_response_breachedboolean
is_sla_resolution_breachedboolean
is_escalatedboolean

fct_ticket_activity

Grain: one row per ticket activity (reply, status change, note)

Transaction-grain ticket-activity fact for conversation flow and agent touchpoint analytics.

ColumnTypeKeys
ticket_activity_keybigintPK
date_keybigint
customer_keybigint
agent_keybigint
channel_keybigint
ticket_idvarchar
activity_idvarchar
activity_typevarchar
actor_typevarchar
activity_countsmallint
response_lag_minutesinteger

fct_csat

Grain: one row per CSAT/CES survey response

Transaction-grain CSAT survey fact tying satisfaction back to the ticket, agent, and channel.

ColumnTypeKeys
csat_keybigintPK
date_keybigint
customer_keybigint
agent_keybigint
channel_keybigint
category_keybigint
ticket_idvarchar
survey_idvarchar
csat_scoresmallint
ces_scoresmallint
nps_scoresmallint
is_satisfiedboolean
is_detractorboolean
has_verbatimboolean
response_countsmallint

Dimension tables (4)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_weeksmallint
month_numbersmallint
quartersmallint
yearsmallint
is_weekendboolean
is_business_dayboolean

dim_customer

Grain: one row per customer per SCD2 version

SCD type 2

ColumnTypeKeys
customer_keybigintPK
customer_idvarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
phonevarcharPII
company_namevarchar
customer_segmentvarchar
support_tiervarchar
account_countryvarchar
preferred_languagevarchar
lifetime_ticket_countinteger
is_at_riskboolean

dim_agent

Grain: one row per support agent per SCD2 version

SCD type 2

ColumnTypeKeys
agent_keybigintPK
agent_idvarcharBK
agent_namevarcharPII
agent_emailvarcharPII
support_teamvarchar
agent_tiervarchar
queuevarchar
site_locationvarchar
is_outsourcedboolean

dim_product

Grain: one row per product

ColumnTypeKeys
product_keybigintPK
product_idvarcharBK
product_namevarchar
product_linevarchar
product_versionvarchar

Lookup tables (3)

dim_channel

Grain: one row per support channel

ColumnTypeKeys
channel_keybigintPK
channel_codevarcharBK
channel_namevarchar
is_synchronousboolean

dim_priority

Grain: one row per ticket priority

ColumnTypeKeys
priority_keybigintPK
priority_codevarcharBK
priority_namevarchar
priority_ranksmallint
target_response_minutesinteger
target_resolution_minutesinteger

dim_category

Grain: one row per ticket category

ColumnTypeKeys
category_keybigintPK
category_codevarcharBK
category_namevarchar
subcategory_namevarchar
issue_typevarchar

Relationships

Each relationship is a foreign key on the first table referencing the second.

  • fct_ticket.customer_key → dim_customer (many-to-one)
  • fct_ticket.agent_key → dim_agent (many-to-one)
  • fct_ticket.channel_key → dim_channel (many-to-one)
  • fct_ticket.priority_key → dim_priority (many-to-one)
  • fct_ticket.category_key → dim_category (many-to-one)
  • fct_ticket.product_key → dim_product (many-to-one)
  • fct_ticket_activity.date_key → dim_date (many-to-one)
  • fct_ticket_activity.customer_key → dim_customer (many-to-one)
  • fct_ticket_activity.agent_key → dim_agent (many-to-one)
  • fct_ticket_activity.channel_key → dim_channel (many-to-one)
  • fct_csat.date_key → dim_date (many-to-one)
  • fct_csat.customer_key → dim_customer (many-to-one)
  • fct_csat.agent_key → dim_agent (many-to-one)
  • fct_csat.channel_key → dim_channel (many-to-one)
  • fct_csat.category_key → dim_category (many-to-one)

Related templates

All templates →
Start for $1

From requirements to AI-ready context, in one platform.

Describe your business in a conversation, start from a template or connect your own database. Your first model is ready in minutes.

Get startedBook a demo

Plans from $1/month · cancel any time