offdataai
Supply Chain & Logistics · data model template

Field Service Analytics data model

Kimball warehouse for field-service management: an accumulating work-order snapshot tracking created->dispatched->completed milestones, a truck-roll fact for dispatch efficiency, and a parts-consumption fact over conformed technician/customer/asset/service-type/region dimensions. For Salesforce Field Service (ServiceAppointment, ServiceTerritory, WorkType), use the Salesforce Field Service Analytics template.

Vendor-neutral field-service-management analytics (utilities, telecom, equipment maintenance, HVAC) covering the work-order lifecycle, technician truck rolls, and parts consumption — a Kimball star schema with conformed technician (SCD2), customer, asset, service-type, and region dimensions for first-time-fix, SLA attainment, and dispatch-efficiency reporting. It is a Kimball dimensional model: fact tables at a declared grain surrounded by conformed dimensions, ready for BI tools and a semantic layer.

KimballSupply Chain & LogisticsSOXGDPR
13
tables
132
columns
23
relationships
7
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

work_ordersdispatchpartsschedulingconformed_dimensions

Design decisions

  • Accumulating snapshot for the work order

    A work order progresses through created, dispatched, and completed milestones with measurable lags; an accumulating snapshot supports cycle-time, SLA, and first-time-fix analysis on one updated row.

  • Separate truck-roll fact at the visit grain

    First-time-fix and routing efficiency require a record per technician visit (with repeat-visit flags) that a work-order-level fact cannot express when multiple visits resolve one order.

  • Parts consumption at its own transaction grain

    Material cost and warranty recovery need a row per part used; modeling it separately keeps quantities and costs additive and independent of labor measures on the work order.

  • Customer and service address classified as PII

    Residential service addresses and contacts are personal data subject to privacy controls, so they are flagged PII and masked while remaining usable for regional analytics.

Tables in the Field Service 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 (4)

fct_work_order

Grain: one row per work order (accumulating snapshot created->dispatched->completed)

Accumulating snapshot of the work-order lifecycle with milestone lags.

ColumnTypeKeys
work_order_keybigintPK
created_date_keybigint
technician_keybigint
customer_keybigint
asset_keybigint
service_type_keybigint
region_keybigint
priority_keybigint
channel_keybigint
resolution_code_keybigint
dispatched_date_keybigint
completed_date_keybigint
work_order_numbervarchar
create_to_dispatch_hoursdecimal
dispatch_to_arrival_hoursdecimal
onsite_duration_hoursdecimal
create_to_complete_hoursdecimal
labor_costdecimal
parts_costdecimal
total_billed_amountdecimal
is_first_time_fixboolean
is_sla_metboolean
customer_satisfaction_scoredecimal

fct_truck_roll

Grain: one row per technician visit (truck roll)

Transaction-grain truck-roll fact for dispatch and routing efficiency.

ColumnTypeKeys
truck_roll_keybigintPK
date_keybigint
technician_keybigint
customer_keybigint
region_keybigint
truck_roll_idvarchar
work_order_numbervarchar
travel_distance_kmdecimal
travel_time_minutesdecimal
onsite_minutesdecimal
travel_costdecimal
visit_sequencesmallint
is_repeat_visitboolean
is_resolvedboolean

fct_parts_consumption

Grain: one row per part consumed on a work order

Transaction-grain parts-consumption fact for service material cost.

ColumnTypeKeys
parts_consumption_keybigintPK
date_keybigint
technician_keybigint
asset_keybigint
service_type_keybigint
work_order_numbervarchar
part_numbervarchar
part_descriptionvarchar
quantity_usedinteger
unit_costdecimal
extended_costdecimal
billed_amountdecimal
is_warranty_coveredboolean
is_from_truck_stockboolean

fct_appointment

Grain: one row per scheduled appointment slot

Transaction-grain appointment fact for scheduling and arrival-window KPIs.

ColumnTypeKeys
appointment_keybigintPK
date_keybigint
technician_keybigint
customer_keybigint
service_type_keybigint
region_keybigint
channel_keybigint
appointment_idvarchar
scheduled_window_start_minuteinteger
scheduled_window_end_minuteinteger
actual_arrival_minuteinteger
window_adherence_minutesdecimal
lead_time_daysdecimal
is_within_windowboolean
is_no_showboolean
is_rescheduledboolean
is_cancelledboolean

Dimension tables (5)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
day_of_weeksmallint
month_numbersmallint
quartersmallint
yearsmallint
is_business_dayboolean
is_holidayboolean

dim_technician

Grain: one row per technician per SCD2 version

SCD type 2

ColumnTypeKeys
technician_keybigintPK
technician_idvarcharBK
technician_namevarcharPII
employee_numbervarcharPII
home_regionvarchar
skill_levelvarchar
specialtyvarchar
certificationvarchar
hire_datedate
is_activeboolean

dim_customer

Grain: one row per service customer per SCD2 version

SCD type 2

ColumnTypeKeys
customer_keybigintPK
customer_idvarcharBK
customer_namevarcharPII
customer_typevarchar
service_addressvarcharPII
cityvarchar
statevarchar
postal_codevarcharPII
contact_phonevarcharPII
contract_tiervarchar

dim_asset

Grain: one row per serviced asset per SCD2 version

SCD type 2

ColumnTypeKeys
asset_keybigintPK
asset_idvarcharBK
asset_namevarchar
asset_typevarchar
manufacturervarchar
model_numbervarchar
serial_numbervarcharPII
install_datedate
warranty_expiry_datedate
is_under_contractboolean

dim_region

Grain: one row per service region

ColumnTypeKeys
region_keybigintPK
region_idvarcharBK
region_namevarchar
districtvarchar
territoryvarchar
countryvarchar
dispatch_centervarchar

Lookup tables (4)

dim_service_type

Grain: one row per service type

ColumnTypeKeys
service_type_keybigintPK
service_type_codevarcharBK
service_type_namevarchar
service_categoryvarchar
default_sla_hoursdecimal
is_billableboolean

dim_priority

Grain: one row per priority level

ColumnTypeKeys
priority_keybigintPK
priority_codevarcharBK
priority_namevarchar
target_response_hoursdecimal

dim_channel

Grain: one row per intake channel

ColumnTypeKeys
channel_keybigintPK
channel_codevarcharBK
channel_namevarchar
is_self_serviceboolean

dim_resolution_code

Grain: one row per resolution code

ColumnTypeKeys
resolution_code_keybigintPK
resolution_codevarcharBK
resolution_namevarchar
resolution_categoryvarchar
is_successfulboolean

Relationships

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

  • fct_work_order.created_date_key → dim_date (many-to-one)
  • fct_work_order.technician_key → dim_technician (many-to-one)
  • fct_work_order.customer_key → dim_customer (many-to-one)
  • fct_work_order.asset_key → dim_asset (many-to-one)
  • fct_work_order.service_type_key → dim_service_type (many-to-one)
  • fct_work_order.region_key → dim_region (many-to-one)
  • fct_work_order.priority_key → dim_priority (many-to-one)
  • fct_work_order.channel_key → dim_channel (many-to-one)
  • fct_work_order.resolution_code_key → dim_resolution_code (many-to-one)
  • fct_truck_roll.date_key → dim_date (many-to-one)
  • fct_truck_roll.technician_key → dim_technician (many-to-one)
  • fct_truck_roll.customer_key → dim_customer (many-to-one)
  • fct_truck_roll.region_key → dim_region (many-to-one)
  • fct_parts_consumption.date_key → dim_date (many-to-one)
  • fct_parts_consumption.technician_key → dim_technician (many-to-one)
  • fct_parts_consumption.asset_key → dim_asset (many-to-one)
  • fct_parts_consumption.service_type_key → dim_service_type (many-to-one)
  • fct_appointment.date_key → dim_date (many-to-one)
  • fct_appointment.technician_key → dim_technician (many-to-one)
  • fct_appointment.customer_key → dim_customer (many-to-one)
  • fct_appointment.service_type_key → dim_service_type (many-to-one)
  • fct_appointment.region_key → dim_region (many-to-one)
  • fct_appointment.channel_key → dim_channel (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