offdataai
Finance & Accounting · data model template

Accounts Receivable Analytics data model

Kimball warehouse for accounts receivable: an accumulating-snapshot invoice fact (issued → due → paid roles, DSO and aging measures), a transaction-grain receipt fact, and a monthly aging periodic snapshot over conformed customer/account/sales-rep/entity dimensions. Customer tax IDs and contact details are masked.

Order-to-cash accounts-receivable analytics covering the customer-invoice lifecycle from issuance through payment, cash-receipt application, and a monthly AR aging snapshot across a multi-entity, multi-currency ledger. A Kimball star schema with a conformed SCD2 customer dimension and account, sales-rep, and legal-entity dimensions supporting DSO, aging buckets, and collections-effectiveness analysis. Customer tax IDs 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
101
columns
13
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: Snowflake). Edit it in plain English or on the canvas, then ship it to any supported warehouse.

Subject areas

invoicingcash_applicationagingconformed_dimensions

Design decisions

  • Accumulating snapshot for the invoice lifecycle

    An AR invoice has well-defined milestones (issued, due, paid) updated on the same row as it ages; Kimball's accumulating-snapshot pattern with multiple date-role keys yields DSO and days-aging lag measures directly.

  • Separate monthly AR aging periodic snapshot

    Aging balances are semi-additive (sum across customers, not across months); a periodic snapshot at customer/entity/month grain gives fast aging-bucket and reserve reporting independent of invoice volume.

  • Distinct transaction-grain receipt fact

    Cash receipts are a separate process whose grain (one application of cash) differs from invoice grain; a dedicated fact supports cash-inflow forecasting and short-payment analysis without overloading the invoice grain.

  • SCD2 on the customer dimension

    Credit rating, collections status, and segment change over time; type-2 history preserves the as-was customer profile so historical aging and exposure are computed against the policy in force at the time, as required for SOX-compliant reserve estimates.

Tables in the Accounts Receivable 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_ar_invoice

Grain: one row per AR invoice (accumulating snapshot: issued → due → paid)

Accumulating snapshot tracking the receivable lifecycle for DSO and collections.

ColumnTypeKeys
ar_invoice_keybigintPK
customer_keybigint
account_keybigint
sales_rep_keybigint
entity_keybigint
payment_terms_keybigint
invoice_date_keybigint
due_date_keybigint
paid_date_keybigint
invoice_numbervarchar
sales_order_numbervarchar
currencyvarchar
invoice_amountdecimal
tax_amountdecimal
amount_receiveddecimal
amount_outstandingdecimal
write_off_amountdecimal
days_sales_outstandinginteger
days_aginginteger
aging_bucketvarchar
is_paidboolean
is_paid_lateboolean
is_disputedboolean
invoice_statusvarchar

fct_ar_receipt

Grain: one row per cash-receipt application line

Transaction-grain receipt fact — one row per cash applied to a customer invoice.

ColumnTypeKeys
ar_receipt_keybigintPK
date_keybigint
customer_keybigint
account_keybigint
entity_keybigint
receipt_idvarchar
invoice_numbervarchar
currencyvarchar
receipt_amountdecimal
discount_alloweddecimal
write_off_amountdecimal
exchange_ratedecimal
receipt_methodvarchar
is_short_paymentboolean

fct_ar_aging_snapshot

Grain: one row per customer per entity per month-end (periodic snapshot)

Monthly periodic snapshot of AR aging — balances are semi-additive across months.

ColumnTypeKeys
date_keybigint
customer_keybigint
entity_keybigint
total_outstandingdecimal
balance_currentdecimal
balance_1_30decimal
balance_31_60decimal
balance_61_90decimal
balance_over_90decimal
balance_disputeddecimal
open_invoice_countinteger
weighted_avg_days_outstandinginteger
collections_statusvarchar

Dimension tables (5)

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_customer

Grain: one row per customer per SCD2 version

SCD type 2

ColumnTypeKeys
customer_keybigintPK
customer_idvarcharBK
customer_namevarchar
tax_idvarcharPII
emailvarcharPII
phonevarcharPII
customer_segmentvarchar
industryvarchar
credit_ratingvarchar
credit_limitdecimal
billing_countryvarchar
statevarchar
collections_statusvarchar
is_activeboolean

dim_account

Grain: one row per GL account per SCD2 version

SCD type 2

ColumnTypeKeys
account_keybigintPK
account_idvarcharBK
account_numbervarchar
account_namevarchar
account_typevarchar
statement_sectionvarchar
is_activeboolean

dim_sales_rep

Grain: one row per sales representative per SCD2 version

SCD type 2

ColumnTypeKeys
sales_rep_keybigintPK
sales_rep_idvarcharBK
sales_rep_namevarcharPII
emailvarcharPII
sales_teamvarchar
regionvarchar
manager_namevarcharPII
is_activeboolean

dim_entity

Grain: one row per legal entity per SCD2 version

SCD type 2

ColumnTypeKeys
entity_keybigintPK
entity_idvarcharBK
entity_namevarchar
entity_typevarchar
countryvarchar
functional_currencyvarchar
tax_jurisdictionvarchar

Lookup tables (1)

dim_payment_terms

Grain: one row per payment-terms code

ColumnTypeKeys
payment_terms_keybigintPK
terms_codevarcharBK
terms_namevarchar
net_due_dayssmallint

Relationships

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

  • fct_ar_invoice.invoice_date_key → dim_date (many-to-one)
  • fct_ar_invoice.customer_key → dim_customer (many-to-one)
  • fct_ar_invoice.account_key → dim_account (many-to-one)
  • fct_ar_invoice.sales_rep_key → dim_sales_rep (many-to-one)
  • fct_ar_invoice.entity_key → dim_entity (many-to-one)
  • fct_ar_invoice.payment_terms_key → dim_payment_terms (many-to-one)
  • fct_ar_receipt.date_key → dim_date (many-to-one)
  • fct_ar_receipt.customer_key → dim_customer (many-to-one)
  • fct_ar_receipt.account_key → dim_account (many-to-one)
  • fct_ar_receipt.entity_key → dim_entity (many-to-one)
  • fct_ar_aging_snapshot.date_key → dim_date (many-to-one)
  • fct_ar_aging_snapshot.customer_key → dim_customer (many-to-one)
  • fct_ar_aging_snapshot.entity_key → dim_entity (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