offdataai
Finance & Accounting · data model template

Expense Management Analytics data model

Kimball warehouse for expense management: a transaction-grain expense-line fact (category, policy-limit, and violation measures) plus an accumulating-snapshot expense-report fact (submitted → approved → reimbursed roles, cycle-time and lag measures) over conformed employee/category/cost-center/merchant/project/payment-method dimensions. Employee PII is masked.

Travel-and-expense management analytics covering transaction-grain expense line items and the expense-report lifecycle from submission through approval to reimbursement across a multi-currency workforce. A Kimball star schema with a conformed SCD2 employee dimension and expense-category, cost-center, merchant, project, and payment-method dimensions supporting spend-by-category, policy-compliance, approval-cycle-time, and reimbursement-lag analysis. Employee identity and contact data are classified and masked. It is a Kimball dimensional model: fact tables at a declared grain surrounded by conformed dimensions, ready for BI tools and a semantic layer.

KimballFinance & AccountingSOXGAAPGDPR
9
tables
97
columns
11
relationships
4
PII columns

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

Subject areas

expense_linesexpense_reportsconformed_dimensions

Design decisions

  • Transaction-grain expense-line fact at the lowest atom

    The line item (one charge, one category, one merchant) is the atomic grain of T&E; Kimball recommends declaring facts at the lowest grain so category spend, policy limits, and merchant mix can be analyzed and rolled up without losing detail.

  • Accumulating snapshot for the expense-report lifecycle

    A report progresses through submitted, approved, and reimbursed milestones on the same row; Kimball's accumulating-snapshot pattern with multiple date-role keys yields approval-cycle-time and reimbursement-lag measures directly.

  • Header report fact alongside the line fact

    Some measures (cycle times, report-level approval status, total reimbursed) live naturally at report grain; pairing a header accumulating-snapshot fact with the line transaction fact avoids duplicating header measures onto every line.

  • SCD2 on the employee dimension

    Employee grade, department, and cost-center assignment change over time and drive policy limits; type-2 history preserves the as-was profile so historical policy-compliance is evaluated against the limits in force at the time the expense was incurred.

Tables in the Expense Management 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 (2)

fct_expense_line

Grain: one row per expense line item

Transaction-grain expense fact — the atomic line item for category and policy analysis.

ColumnTypeKeys
expense_line_keybigintPK
date_keybigint
employee_keybigint
expense_category_keybigint
cost_center_keybigint
merchant_keybigint
project_keybigint
payment_method_keybigint
report_numbervarchar
expense_line_numberinteger
currencyvarchar
expense_amountdecimal
amount_reportingdecimal
reimbursable_amountdecimal
tax_amountdecimal
policy_limitdecimal
over_limit_amountdecimal
exchange_ratedecimal
is_billableboolean
is_policy_violationboolean
has_receiptboolean

fct_expense_report

Grain: one row per expense report (accumulating snapshot: submitted → approved → reimbursed)

Accumulating snapshot tracking the report lifecycle for cycle-time and reimbursement-lag.

ColumnTypeKeys
expense_report_keybigintPK
employee_keybigint
cost_center_keybigint
payment_method_keybigint
submitted_date_keybigint
approved_date_keybigint
reimbursed_date_keybigint
report_numbervarchar
currencyvarchar
line_countinteger
total_amountdecimal
reimbursable_amountdecimal
reimbursed_amountdecimal
rejected_amountdecimal
over_limit_amountdecimal
days_to_approveinteger
days_to_reimburseinteger
policy_violation_countinteger
is_approvedboolean
is_reimbursedboolean
report_statusvarchar

Dimension tables (6)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
month_numbersmallint
month_namevarchar
quartersmallint
yearsmallint
fiscal_yearsmallint
fiscal_periodsmallint
is_business_dayboolean
is_period_endboolean

dim_employee

Grain: one row per employee per SCD2 version

SCD type 2

ColumnTypeKeys
employee_keybigintPK
employee_idvarcharBK
first_namevarcharPII
last_namevarcharPII
emailvarcharPII
job_titlevarchar
departmentvarchar
employee_gradevarchar
manager_namevarcharPII
regionvarchar
home_countryvarchar
is_activeboolean

dim_expense_category

Grain: one row per expense category

ColumnTypeKeys
expense_category_keybigintPK
category_idvarcharBK
category_namevarchar
category_groupvarchar
parent_category_idvarchar
is_reimbursableboolean
is_billable_defaultboolean
policy_limitdecimal

dim_cost_center

Grain: one row per cost center per SCD2 version

SCD type 2

ColumnTypeKeys
cost_center_keybigintPK
cost_center_idvarcharBK
cost_center_namevarchar
cost_center_typevarchar
regionvarchar
parent_cost_center_idvarchar

dim_merchant

Grain: one row per merchant

ColumnTypeKeys
merchant_keybigintPK
merchant_idvarcharBK
merchant_namevarchar
mccvarchar
merchant_categoryvarchar
countryvarchar
is_preferred_vendorboolean

dim_project

Grain: one row per project

ColumnTypeKeys
project_keybigintPK
project_idvarcharBK
project_namevarchar
project_statusvarchar
client_namevarchar
is_billableboolean
start_datedate
end_datedate

Lookup tables (1)

dim_payment_method

Grain: one row per expense payment method

ColumnTypeKeys
payment_method_keybigintPK
method_codevarcharBK
method_namevarchar
is_corporate_liabilityboolean

Relationships

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

  • fct_expense_line.date_key → dim_date (many-to-one)
  • fct_expense_line.employee_key → dim_employee (many-to-one)
  • fct_expense_line.expense_category_key → dim_expense_category (many-to-one)
  • fct_expense_line.cost_center_key → dim_cost_center (many-to-one)
  • fct_expense_line.merchant_key → dim_merchant (many-to-one)
  • fct_expense_line.project_key → dim_project (many-to-one)
  • fct_expense_line.payment_method_key → dim_payment_method (many-to-one)
  • fct_expense_report.submitted_date_key → dim_date (many-to-one)
  • fct_expense_report.employee_key → dim_employee (many-to-one)
  • fct_expense_report.cost_center_key → dim_cost_center (many-to-one)
  • fct_expense_report.payment_method_key → dim_payment_method (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