offdataai
Supply Chain & Logistics · data model template

Procurement Spend Analytics data model

Kimball warehouse for procurement: a transaction-grain PO-line fact, a goods-receipt fact (OTIF and quality measures), and an atomic spend fact (savings and spend-under-management) over conformed supplier/material/category/buyer/cost-center/contract dimensions. Supplier tax IDs are masked.

Source-to-pay procurement and spend analytics covering purchase-order commitments, goods receipts, and atomic invoiced spend across a multi-currency, multi-entity supply base. A Kimball star schema with a conformed SCD2 supplier dimension and material, category, buyer, cost-center, and contract dimensions supporting spend-under-management, maverick-spend, contract-compliance, OTIF delivery, and supplier-quality analysis. Supplier tax IDs are classified restricted 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.

KimballSupply Chain & LogisticsSOXGAAPGDPR
11
tables
118
columns
20
relationships
3
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

purchasingreceivingspend_managementconformed_dimensions

Design decisions

  • Three transaction-grain facts for the procurement processes

    Purchasing (commitment), receiving (fulfilment), and spend (realization) are distinct business processes at different atomic grains; Kimball recommends one fact per process so each can be analyzed and drilled-across via conformed dimensions.

  • Dedicated atomic spend fact for spend-under-management

    Procurement KPIs (addressable spend, savings, maverick rate) require the lowest realized-spend atom; modeling spend separately from PO commitments avoids double-counting and supports non-PO spend that never had a purchase order.

  • SCD2 on supplier and material dimensions

    Supplier tier, risk rating, and material commodity classification change over time; type-2 history preserves the as-was attributes so spend can be re-aggregated under the classification in force when the transaction occurred.

  • Contract dimension to measure compliance

    Linking each PO line and spend row to a contract lets the model distinguish on-contract from maverick spend, a primary category-management lever, using a conformed dimension rather than a fact attribute.

Tables in the Procurement Spend 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_purchase_order_line

Grain: one row per purchase-order line

Transaction-grain PO line fact — the atomic commitment of procurement spend.

ColumnTypeKeys
purchase_order_line_keybigintPK
date_keybigint
supplier_keybigint
material_keybigint
category_keybigint
buyer_keybigint
cost_center_keybigint
contract_keybigint
currency_keybigint
need_by_date_keybigint
po_numbervarchar
po_line_numberinteger
ordered_quantitydecimal
unit_pricedecimal
line_amountdecimal
tax_amountdecimal
exchange_ratedecimal
is_contract_backedboolean
is_maverickboolean
po_line_statusvarchar

fct_goods_receipt

Grain: one row per goods-receipt line

Transaction-grain receipt fact supporting OTIF and supplier-quality analysis.

ColumnTypeKeys
goods_receipt_keybigintPK
date_keybigint
supplier_keybigint
material_keybigint
cost_center_keybigint
po_numbervarchar
po_line_numberinteger
receipt_numbervarchar
received_quantitydecimal
accepted_quantitydecimal
rejected_quantitydecimal
received_valuedecimal
days_lateinteger
is_on_timeboolean
is_in_fullboolean
quality_statusvarchar

fct_spend

Grain: one row per atomic spend transaction (invoiced/settled spend)

Transaction-grain spend fact — the unit of spend-under-management analysis.

ColumnTypeKeys
spend_keybigintPK
date_keybigint
supplier_keybigint
material_keybigint
category_keybigint
buyer_keybigint
cost_center_keybigint
contract_keybigint
currency_keybigint
po_numbervarchar
invoice_numbervarchar
spend_quantitydecimal
spend_amountdecimal
spend_amount_reportingdecimal
savings_amountdecimal
exchange_ratedecimal
spend_classificationvarchar
is_po_backedboolean
is_under_managementboolean

Dimension tables (7)

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_supplier

Grain: one row per supplier per SCD2 version

SCD type 2

ColumnTypeKeys
supplier_keybigintPK
supplier_idvarcharBK
supplier_namevarchar
tax_idvarcharPII
supplier_tiervarchar
supplier_statusvarchar
countryvarchar
statevarchar
risk_ratingvarchar
quality_ratingdecimal
diversity_classificationvarchar
is_preferredboolean
is_single_sourceboolean

dim_material

Grain: one row per material/SKU per SCD2 version

SCD type 2

ColumnTypeKeys
material_keybigintPK
material_idvarcharBK
material_namevarchar
material_typevarchar
unit_of_measurevarchar
commodity_codevarchar
is_hazardousboolean
is_activeboolean

dim_category

Grain: one row per procurement spend category

ColumnTypeKeys
category_keybigintPK
category_idvarcharBK
category_namevarchar
spend_typevarchar
parent_category_idvarchar
is_managedboolean

dim_buyer

Grain: one row per buyer/purchasing agent

ColumnTypeKeys
buyer_keybigintPK
buyer_idvarcharBK
buyer_namevarcharPII
emailvarcharPII
buying_teamvarchar
regionvarchar
is_activeboolean

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_contract

Grain: one row per supplier contract

ColumnTypeKeys
contract_keybigintPK
contract_idvarcharBK
contract_namevarchar
contract_typevarchar
contract_statusvarchar
start_datedate
end_datedate
committed_valuedecimal
is_auto_renewboolean

Lookup tables (1)

dim_currency

Grain: one row per ISO currency

ColumnTypeKeys
currency_keybigintPK
currency_codevarcharBK
currency_namevarchar
currency_symbolvarchar

Relationships

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

  • fct_purchase_order_line.date_key → dim_date (many-to-one)
  • fct_purchase_order_line.supplier_key → dim_supplier (many-to-one)
  • fct_purchase_order_line.material_key → dim_material (many-to-one)
  • fct_purchase_order_line.category_key → dim_category (many-to-one)
  • fct_purchase_order_line.buyer_key → dim_buyer (many-to-one)
  • fct_purchase_order_line.cost_center_key → dim_cost_center (many-to-one)
  • fct_purchase_order_line.contract_key → dim_contract (many-to-one)
  • fct_purchase_order_line.currency_key → dim_currency (many-to-one)
  • fct_goods_receipt.date_key → dim_date (many-to-one)
  • fct_goods_receipt.supplier_key → dim_supplier (many-to-one)
  • fct_goods_receipt.material_key → dim_material (many-to-one)
  • fct_goods_receipt.cost_center_key → dim_cost_center (many-to-one)
  • fct_spend.date_key → dim_date (many-to-one)
  • fct_spend.supplier_key → dim_supplier (many-to-one)
  • fct_spend.material_key → dim_material (many-to-one)
  • fct_spend.category_key → dim_category (many-to-one)
  • fct_spend.buyer_key → dim_buyer (many-to-one)
  • fct_spend.cost_center_key → dim_cost_center (many-to-one)
  • fct_spend.contract_key → dim_contract (many-to-one)
  • fct_spend.currency_key → dim_currency (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