Skip to content

Wealth intelligence engine

ID MOD-101
System SD06
Repo bank-risk-platform
Build status Not started
Deployed No

Purpose

Computes a daily net worth snapshot per customer by combining internal bank data (account balances, loan positions, property equity) with external asset data (KiwiSaver/superannuation from MOD-100). Produces KiwiSaver health indicators — government member tax credit utilisation gap and PIR mismatch risk — as customer-facing insights.

This module does not provide financial advice. It computes factual indicators from observable data and surfaces them in the app with appropriate framing (e.g. "You may be missing out on $X of government contributions — contributions of $Y more this year would unlock the full match").

Net worth computation

Daily, after MOD-100 external asset refresh completes:

Net worth =
    Deposit account balances (SD01 accounts where account_type IN ('TRANSACTION','SAVINGS','TERM'))
  + External asset balances  (SD01 assets where asset_type IN ('KIWISAVER','SUPERANNUATION'))
  - Loan balances outstanding (SD01 accounts where account_type IN ('HOME_LOAN','PERSONAL_LOAN','OVERDRAFT'))
  + Property equity estimate  (properties.estimated_value - SUM of secured loan balances)

Results published to wealth.net_worth_daily Snowflake Dynamic Table (1-hour lag from source refresh).

Liquidity tiers

Net worth is stratified into four tiers for the app dashboard:

Tier Asset types Accessible
Instant access Transaction + savings accounts Immediately
Short-term locked Term deposits, notice accounts On maturity / notice period
Illiquid Property equity On sale (weeks–months)
Retirement-locked KiwiSaver / AU superannuation On eligibility (age 65 NZ; preservation age AU)

KiwiSaver health indicators

Government member tax credit gap (NZ)

The NZ government contributes $0.50 per $1 of member contribution, up to a maximum of $521.43/year. To receive the full credit, a member must contribute at least $1,042.86 during the KiwiSaver financial year (1 July – 30 June).

The module: 1. Identifies inbound KiwiSaver contribution credits in the customer's transaction history (employer contribution direct credits, voluntary top-ups) 2. Sums year-to-date contributions 3. Computes the gap between YTD contributions and $1,042.86 4. Calculates weeks remaining in the KiwiSaver year 5. Publishes mtc_gap_nzd, mtc_shortfall_per_week, mtc_full_credit_achievable to wealth.kiwisaver_health

This indicator is only computed for NZ customers with a KiwiSaver account linked via MOD-100. It does not recommend contribution amounts — it reports facts about the customer's current trajectory.

PIR mismatch risk

Incorrect PIR (Prescribed Investor Rate) is a widespread and under-served problem in NZ. Members on the wrong rate pay too much or (technically) too little tax. The three rates are 10.5%, 17.5%, and 28%.

The module: 1. Sums gross salary credits observed in the customer's transaction history over the trailing 12 months (identifies likely income band) 2. Maps this to the applicable PIR band under the Income Tax Act 2007 s HL 21 3. Compares the inferred PIR to the PIR reported by the KiwiSaver provider via Akahu 4. Sets pir_mismatch_risk: true if the bands differ 5. Surfaces as an in-app insight: "Your KiwiSaver tax rate may not match your income — check with your provider."

This is an observation, not a directive. No tax advice is provided.

Snowflake schema

wealth.net_worth_daily (Dynamic Table, 1-hour lag)

Column Type Description
customer_id uuid Customer reference
as_at_date date Effective date of snapshot
instant_access_nzd numeric(18,2) Transaction + savings balances
short_term_locked_nzd numeric(18,2) Term deposits and notice accounts
illiquid_equity_nzd numeric(18,2) Property equity estimate
retirement_locked_nzd numeric(18,2) KiwiSaver + AU super balance (NZD)
total_assets_nzd numeric(18,2) Sum of all asset tiers
total_liabilities_nzd numeric(18,2) All outstanding loan balances
net_worth_nzd numeric(18,2) Assets minus liabilities
computed_at timestamptz When this row was last computed

wealth.kiwisaver_health (Dynamic Table, daily)

Column Type Description
customer_id uuid
ks_year_start date Current KiwiSaver year start (1 July)
ytd_contributions_nzd numeric(10,2) Observed YTD contributions
mtc_threshold_nzd numeric(10,2) $1,042.86
mtc_gap_nzd numeric(10,2) Gap to full government match (0 if met)
mtc_full_credit_achievable boolean True if gap closeable in remaining weeks
inferred_pir_pct numeric(4,1) PIR inferred from 12m salary history
reported_pir_pct numeric(4,1) PIR reported by provider via Akahu
pir_mismatch_risk boolean True if inferred ≠ reported

FMA compliance note

All outputs are factual computations on the customer's own data. No statements are made about which funds, providers, or products a customer should choose. The module does not constitute "personalised financial advice" under the Financial Markets Conduct Act 2013 s 431C. Display copy in the app is reviewed for advice boundary compliance before release.


Module dependencies

Depends on

Module Title Required? Contract Reason
MOD-100 External asset connector Required External asset data (KiwiSaver/super balances) is the primary new input to net worth calculations — module cannot fulfil BG-016 without it.
MOD-042 CDC pipeline — Neon logical replication to S3 Iceberg Required CDC pipeline propagates SD01 account, loan, and asset records to Snowflake where wealth Dynamic Tables are computed.
MOD-001 Double-entry posting engine Required Posted ledger balances in SD01 are the source of truth for deposit and loan balances used in net worth calculation.
MOD-104 AWS shared infrastructure bootstrap Required MOD-104 provisions the S3 Iceberg bucket (Snowflake external tables), KMS key, and bank-risk-platform EventBridge bus ARN. Required before this module can be deployed.
MOD-102 Snowflake account configuration & governance Required Snowflake account and governance provisioned by MOD-102 must exist before this module can read or write Snowflake.

Required by

(No modules in this wiki currently declare a dependency on this module.)


Policies satisfied

(No policies assigned)


Capabilities satisfied

Capability Title Mode How
CAP-142 CAP-142 CALC Aggregates bank balances, loan positions, property equity, and external asset balances daily into a tiered net worth snapshot published to wealth.net_worth_daily.
CAP-143 CAP-143 CALC Computes KiwiSaver government match utilisation gap and PIR mismatch risk from transaction and external asset data, surfacing insights (not advice) to the customer.

Part of SD06 — Snowflake Analytics & Risk Platform Compiled 2026-05-22 from source/entities/modules/MOD-101.yaml