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