offdataai
Banking & Financial Services · data model template

Mortgage Origination & Servicing data model

Kimball warehouse for mortgage lending: an application accumulating snapshot, funded-loan origination, servicing-transaction ledger, monthly loan-performance/delinquency snapshots, and escrow disbursements over conformed borrower, property, loan, investor, and delinquency-status dimensions.

Residential mortgage analytics across the full lifecycle: application and underwriting, funded-loan origination, servicing transactions, monthly performance and delinquency snapshots, and escrow disbursements — a Kimball star schema with conformed borrower, property, and loan dimensions supporting pull-through, HMDA reporting, delinquency-roll, and investor analysis with regulated PII (SSN) 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.

KimballBanking & Financial ServicesHMDARESPATILAECOAGLBA
13
tables
118
columns
20
relationships
8
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

originationservicingperformanceconformed_dimensions

Design decisions

  • Application as an accumulating snapshot

    An application moves through submission → processing → underwriting → decision with milestone dates; an accumulating snapshot measures pull-through and time-to-decision.

  • Monthly performance snapshot for delinquency

    Delinquency status and balances are evaluated monthly for investor and regulatory reporting; a periodic snapshot enables delinquency-roll and transition-matrix analysis.

  • HMDA action-taken on the application fact

    HMDA requires reporting the action taken (originated/denied/withdrawn) and denial reason; capturing them on the application fact makes LAR submission a direct query.

  • Full masking on SSN

    RESPA/GLBA require restricting access to borrower SSNs; classified restricted and fully masked.

Tables in the Mortgage Origination & Servicing 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 (5)

fct_application

Grain: one row per application (accumulating snapshot)

Accumulating snapshot through the application funnel (pull-through).

ColumnTypeKeys
application_keybigintPK
date_keybigint
borrower_keybigint
property_keybigint
loan_officer_keybigint
channel_keybigint
decision_date_keybigint
application_idvarchar
requested_amountdecimal
ltv_ratiodecimal
dti_ratiodecimal
application_statusvarchar
hmda_action_takenvarchar
denial_reasonvarchar
days_to_decisioninteger

fct_loan_origination

Grain: one row per funded loan

Funded-loan fact — booking-grain origination measures.

ColumnTypeKeys
loan_origination_keybigintPK
date_keybigint
loan_keybigint
borrower_keybigint
property_keybigint
investor_keybigint
original_balancedecimal
note_ratedecimal
ltv_ratiodecimal
cltv_ratiodecimal
dti_ratiodecimal
discount_pointsdecimal
closing_costsdecimal
has_mortgage_insuranceboolean

fct_servicing_transaction

Grain: one row per servicing transaction

Transaction-grain servicing ledger event.

ColumnTypeKeys
servicing_transaction_keybigintPK
date_keybigint
loan_keybigint
borrower_keybigint
transaction_idvarchar
transaction_typevarchar
transaction_amountdecimal
principal_paiddecimal
interest_paiddecimal
escrow_paiddecimal
fees_paiddecimal
currencyvarchar

fct_loan_performance_snapshot

Grain: one row per loan per month (periodic snapshot)

Monthly performance snapshot driving delinquency-roll analysis.

ColumnTypeKeys
date_keybigint
loan_keybigint
borrower_keybigint
delinquency_status_keybigint
investor_keybigint
scheduled_balancedecimal
actual_balancedecimal
current_interest_ratedecimal
days_past_dueinteger
escrow_balancedecimal
unpaid_principal_balancedecimal
is_modifiedboolean
is_in_forbearanceboolean

fct_escrow_disbursement

Grain: one row per escrow disbursement

Escrow disbursements for taxes and insurance.

ColumnTypeKeys
escrow_disbursement_keybigintPK
date_keybigint
loan_keybigint
disbursement_typevarchar
payee_namevarchar
disbursement_amountdecimal
escrow_balance_afterdecimal

Dimension tables (5)

dim_date

Grain: one row per calendar day

ColumnTypeKeys
date_keybigintPK
full_datedateBK
month_numbersmallint
quartersmallint
yearsmallint

dim_borrower

Grain: one row per borrower per SCD2 version

SCD type 2

ColumnTypeKeys
borrower_keybigintPK
borrower_idvarcharBK
first_namevarcharPII
last_namevarcharPII
ssnvarcharPII
date_of_birthdatePII
credit_scoresmallint
annual_incomedecimal
employment_statusvarchar
is_first_time_buyerboolean
citizenship_statusvarchar
emailvarcharPII

dim_property

Grain: one row per property per SCD2 version

SCD type 2

ColumnTypeKeys
property_keybigintPK
property_idvarcharBK
address_line1varcharPII
cityvarchar
statevarchar
postal_codevarcharPII
countyvarchar
property_typevarchar
occupancy_typevarchar
appraised_valuedecimal
purchase_pricedecimal
year_builtsmallint

dim_loan

Grain: one row per loan per SCD2 version

SCD type 2

ColumnTypeKeys
loan_keybigintPK
loan_numbervarcharBK
loan_typevarchar
loan_purposevarchar
lien_positionsmallint
term_monthssmallint
rate_typevarchar
amortization_typevarchar
interest_ratedecimal
is_conformingboolean

dim_loan_officer

Grain: one row per loan officer

ColumnTypeKeys
loan_officer_keybigintPK
loan_officer_idvarcharBK
officer_namevarcharPII
nmls_idvarchar
branchvarchar
regionvarchar

Lookup tables (3)

dim_investor

Grain: one row per secondary-market investor

ColumnTypeKeys
investor_keybigintPK
investor_idvarcharBK
investor_namevarchar
investor_typevarchar

dim_delinquency_status

Grain: one row per delinquency bucket

ColumnTypeKeys
delinquency_status_keybigintPK
status_codevarcharBK
status_namevarchar
days_past_due_minsmallint
is_seriously_delinquentboolean

dim_channel

Grain: one row per origination channel

ColumnTypeKeys
channel_keybigintPK
channel_codevarcharBK
channel_namevarchar

Relationships

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

  • fct_application.date_key → dim_date (many-to-one)
  • fct_application.borrower_key → dim_borrower (many-to-one)
  • fct_application.property_key → dim_property (many-to-one)
  • fct_application.loan_officer_key → dim_loan_officer (many-to-one)
  • fct_application.channel_key → dim_channel (many-to-one)
  • fct_loan_origination.date_key → dim_date (many-to-one)
  • fct_loan_origination.loan_key → dim_loan (many-to-one)
  • fct_loan_origination.borrower_key → dim_borrower (many-to-one)
  • fct_loan_origination.property_key → dim_property (many-to-one)
  • fct_loan_origination.investor_key → dim_investor (many-to-one)
  • fct_servicing_transaction.date_key → dim_date (many-to-one)
  • fct_servicing_transaction.loan_key → dim_loan (many-to-one)
  • fct_servicing_transaction.borrower_key → dim_borrower (many-to-one)
  • fct_loan_performance_snapshot.date_key → dim_date (many-to-one)
  • fct_loan_performance_snapshot.loan_key → dim_loan (many-to-one)
  • fct_loan_performance_snapshot.borrower_key → dim_borrower (many-to-one)
  • fct_loan_performance_snapshot.delinquency_status_key → dim_delinquency_status (many-to-one)
  • fct_loan_performance_snapshot.investor_key → dim_investor (many-to-one)
  • fct_escrow_disbursement.date_key → dim_date (many-to-one)
  • fct_escrow_disbursement.loan_key → dim_loan (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