# Monthly expense baseline and emergency reserve

Analysis run 2026-07-26. **One-off analysis, not a feature** — nothing in the app
computes these numbers. Read "Reproducing this" before trusting a restated figure.

The question: how much should be held in reserve to cover 6–12 months of expenses?

## Answer

| Scenario | $/mo | 6 months | 12 months |
|---|---:|---:|---:|
| Survival — contracted loan repayment, essentials only | 3,040 | 18,250 | 36,500 |
| **Realistic — contracted loan, + dining and charity** | **4,140** | **24,800** | **49,600** |
| Status quo — keep overpaying the loan, normal life ex-travel | 5,557 | 33,500 | 67,000 |

Use the middle row. The survival row assumes dining is cut to zero and stays
there, which is not a plan anyone executes for six months.

Against that, liquidity already available (statements 133 and 131, 2026-06-30):

| | |
|---|---:|
| Loan redraw | 81,017.42 |
| Offset balance | 8,753.00 |
| **Accessible** | **89,770.42** |

That is 3.6× the six-month target and 1.8× the twelve-month one. Redraw grew
$62,387.17 → $81,017.42 across the last two loan statements, matching the
overpayment rate — the money spent killing the loan faster is still reachable.

**Caveat on counting redraw as the reserve.** It is available at AMP's
discretion, and lenders reduce or freeze it exactly when a borrower looks
distressed — which is when it would be needed. The rate also moved 5.54% → 6.29%
between the two statements, so redrawn funds cost more than they did. Hold some
genuine cash; it does not need to be $50,000.

## This is *your* outgoings, not household spend

The app only sees accounts that get imported. Sonu's own spending on the
household is invisible to it. Grocery spend reads as ~$300/mo gross on 4–10
transactions, which is implausible for a household and is partly explained by her
paying from her own account.

For "how much reserve do **I** need" that blind spot does not matter — your own
outgoings is the correct measure. Do not relabel these figures as household
totals; they are not, and they would be wrong by an unknown amount.

## The loan has two floors

This is the largest single lever and the reason there are three scenarios.

| | $/fortnight | $/mo annualised | Your 50% |
|---|---:|---:|---:|
| Contracted minimum | 1,190.54 | 2,579.50 | **1,290** |
| Actual direct debit | 2,500.00 | 5,416.67 | **2,708** |
| Voluntary overpayment | 1,309.46 | 2,837.17 | 1,419 |

Dropping to contracted cuts your loan cost by $1,418/mo. Sonu's obligation is a
fixed 50% of the repayment (see CLAUDE.md → "The shared loan"), so it falls with
it. Her rate returned to $1,250/fortnight in July 2026 after the reduced $750
period during her leave.

## Baseline composition

Built from **Feb–Jun 2026** — the months where split data is trustworthy — with
annual items annualised over 12 rather than divided by the 5-month sample.

| Essential | $/mo | Note |
|---|---:|---|
| Loan (contracted, your 50%) | 1,290 | 2,708 at the current actual rate |
| Transport | 326 | |
| Insurance | 280 | annualised; your 55% |
| Utilities | 278 | shared energy/water + personal mobile |
| Subscriptions | 204 | shared household + personal/AI |
| Groceries | 200 | see the blind-spot note above |
| Card + package fees | 175 | annualised — see below |
| Health | 167 | |
| Rates + rego | 122 | annualised, your share |
| **Essential** | **3,042** | |
| + dining 675, charity 422 | 4,139 | charity is a Smith Family sponsorship commitment |
| + typical shopping | ~4,800 | median 657, **not** the 1,709 mean |

**Travel is excluded throughout.** At $3,153/mo of your share even post-cutover it
would roughly double every figure, and it is the first thing that stops.

## Four corrections the raw data needed

Any restatement that skips these will be wrong. None are fixed in the data yet.

**Micro-investing counted as spend.** Raiz ($9,406 / 27 rows), Vanguard Super
($500) and moomoo ($300) sit in `other` as debits — $10,206/yr, ~$850/mo of
phantom spend. These belong in `investment`, which is already excluded.

**Incoming money counted as negative spend.** 17 rows in `other` typed `credit`
($5,622 in the window). `SPEND_SIGNED` negates credits so refunds cancel
purchases, but these are not refunds — they are money arriving. June 2025 shows
*minus* $7,814 of total spend because two Wise credits of ~$16.7k each landed in
`other`.

**`government` is two unrelated things.** $25,554 of ATO payments (one annual
bill, routed through Zen B2B and RewardPay to earn points) versus $2,054 council
rates and $875 rego. Tax is not a monthly living cost and falls with income
anyway; rates and rego are non-negotiable. Splitting them moves this line from
$2,411/mo to $244/mo.

**`fees` is mostly annual.** Of $2,599 post-cutover, $1,750 is an annual card fee
and $349 a loan package annual fee. Recurring is ~$175/mo annualised, not the
$520/mo the 5-month mean implies.

## Splits: what is trustworthy and what is not

Splits exist in this app from **2026-01-09** only; before that they were tracked
in SplitMyExpenses. So a trailing-12-month per-person series splices six months
of *gross* onto six months of *net* and is not a series at all. Use Feb–Jun 2026.

**Partial split coverage within a category is usually correct, not a gap.** This
was misdiagnosed once during the analysis. Verified composition:

| Category | Your share | Split | Unsplit |
|---|---:|---|---|
| utilities | 69% | Globird, OVO, GWW, home telecoms | Telstra, Vodafone, Optus, JB Hi-Fi Mobile |
| subscriptions | 91% | Uber One, Amazon Prime, OnePass | Claude, OpenAI, Anthropic, OpenRouter, You.com, LinkedIn, Xero, Billdu, Spotify, Patreon |
| fees | 100% | — | credit card fees are personal |
| charity | 100% | — | personal commitment |

Only *shared* utilities and subscriptions are split. Mobile bills, AI
subscriptions and card fees are personal and correctly sit at 100%. Do not
"fix" these ratios.

## Known weak spots

- **`other` is $424–773/mo of your share and unclassified.** The single biggest
  lever on accuracy. Clearing it with the rule preview
  (`GET /api/rules/[id]/matches`) improves every other view at the same time.
- **Five months is a short sample**, and it contains the Europe trip and the ATO
  bill. Both are excluded, but they crowd out the ordinary months. The
  SplitMyExpenses CSVs would stretch it to 18 months — worth having, not
  blocking, since only an *aggregate ratio per category* is needed, not row
  matching, so the combined-transaction problem does not bite.
- **`/api/analytics/monthly` does not filter `reconciled_with_id IS NOT NULL`.**
  48 rows are double-counted app-wide. Small, but real, and unrelated to this
  analysis. The queries below do filter it.

## Reproducing this

Working queries are not checked in; they were run ad hoc against
`postgres-personal`. The shape that matters:

```sql
-- Per-category monthly distribution, your share, Feb-Jun 2026.
-- Mirrors src/lib/analytics-sql.ts, plus the corrections above.
WITH s AS (
  SELECT to_char(t.transaction_date,'YYYY-MM') m,
    COALESCE(o.category_override, t.category, 'other') cat,
    SUM((CASE WHEN t.transaction_type IN ('refund','credit') THEN -1 ELSE 1 END)
        * (CASE WHEN t.interest_amount IS NOT NULL
                THEN t.interest_amount ELSE COALESCE(t.amount_aud, t.amount) END)
        * COALESCE(ts.share_percent, o.my_share_percent,
            100 - COALESCE((SELECT SUM(x.share_percent) FROM transaction_splits x
                            WHERE x.transaction_id = t.id
                              AND x.participant_id <> 1), 0)) / 100)::numeric(12,2) amt
  FROM transactions t
  LEFT JOIN transaction_overrides o ON o.transaction_id = t.id
  LEFT JOIN transaction_splits ts ON ts.transaction_id = t.id AND ts.participant_id = 1
  LEFT JOIN statements st ON st.id = t.statement_id
  WHERE COALESCE(t.owner_id, st.owner_id) = 1
    AND t.reconciled_with_id IS NULL                      -- see weak spots
    AND ((t.transaction_type IN ('debit','fee','interest')
          OR t.interest_amount IS NOT NULL)
         OR t.transaction_type IN ('refund','credit'))
    AND COALESCE(o.category_override, t.category, 'other')
        NOT IN ('transfers','investment','income')
    -- correction 1: misfiled investments
    AND COALESCE(t.merchant_normalized, t.merchant_name, '')
        !~* '^(Raiz|Vanguard Super|moomoo)'
    -- correction 2: incoming money miscategorised as 'other' credits
    AND NOT (COALESCE(o.category_override, t.category, 'other') = 'other'
             AND t.transaction_type = 'credit')
    AND t.transaction_date >= '2026-02-01' AND t.transaction_date < '2026-07-01'
  GROUP BY 1, 2
)
SELECT cat, count(*) mths, round(avg(amt),0) mean,
       round(percentile_cont(0.5) WITHIN GROUP (ORDER BY amt)::numeric, 0) median
FROM s GROUP BY cat ORDER BY mean DESC;
```

Use the **median** for anything recurring monthly and the **annualised total** for
lumpy-but-certain items (insurance, rates, rego, annual card fees). Means are
badly skewed here — shopping is 1,709 mean against 657 median.

Corrections 3 and 4 (`government`, `fees`) are not expressible as filters; they
need the category split by merchant, done by hand above.

## If this becomes a feature

The blocker is `other`, not the split model — the split data held up under
scrutiny. Sequence:

1. Recategorise Raiz / Vanguard Super / moomoo to `investment` (27 rows,
   unambiguous) via the rule preview.
2. Split `government` so rates and rego separate from ATO. Probably a new
   category or a tag; `government` conflates a recurring obligation with an
   annual tax bill.
3. Work `other` down with the rule preview.
4. Then a baseline panel on Insights, which already carries the
   Regular/Occasional split this analysis is a stricter version of
   (`REGULAR_CATEGORIES` in `src/lib/categories.ts`).

A **liquidity vs baseline** view would be genuinely new rather than a restatement:
`statements.redraw_available`, offset closing balance, and the
contracted-vs-actual repayment gap are all in the schema and nothing reads them.
