Product Design Requirements (PDR)
This document captures the functional and visual requirements demonstrated above. Implement against these rules; the HTML mock uses sample data only.
1. Problem & goal
Ops need a daily store-level settlement view that (a) reconciles Actual vs Expected Received and Actual vs Expected Paid, (b) proves the cash balance equation, and (c) flags unstable settlement amounts against a selectable previous-day moving average.
Goal: one screen where investigators can see which store is wrong, why (line-level Diff), and whether today’s settlement is abnormal vs recent history.
2. Settlement time model (cut-off)
- Cut-off: daily
11:00clean settlement. - Settlement window: previous day 11:00 → report date 11:00.
Example:
17 Sep 11:00 → 18 Sep 11:00. - Settlement time (run): report date ~
11:01. Example:18 Sep 11:01. - All Settled / Expected Settlement figures for the report date must use this window batch, not calendar midnight–midnight.
- UI must display Settlement window + Settlement time + Cut-off on every report.
3. Page layout & controls
- Payo brand chrome (navy top bar, logo, Poppins/Inter, teal accents).
- Title: Daily Settlement Report.
- Controls:
- Report date picker
- Previous average toggle: 7-day / 14-day / 30-day (mutually exclusive; default 14)
- Above column headers, a Total row shows the sum of Open Balance, To Commission, To Adyen, To Merchant, To SameDay Account, Close Balance, and Diff (outflow columns use bracket format).
- Summary KPIs: store count, To Merchant (window) = sum of column To Merchant (Actual) across all stores (payout to merchants for the day; excludes SameDay Account and To Commission), with status pills showing selected previous N-day average total and % difference vs today, yellow alert count, red alert count.
- Main table: one row per store; click expands detail.
4. Main table columns
| Column | Meaning | Sign / format |
|---|---|---|
| Status | Green / yellow indicator light | — |
| 7-day Settled | Sparkline of last 7 settlement amounts + selected previous-avg line | Chart |
| Store | Name + store code; subtitle shows prev-avg & today settled | — |
| Open Balance (Actual) | Opening balance for the settlement window | Unsigned $x.xx |
| To Commission (Actual) | Amount moved to commission account (Surcharge / Deduction related). Does not include Charge back or Charge back fee. | Outflow brackets ($x.xx) |
| To Adyen (Actual) | Charge back + Charge back fee (Actual). These amounts go directly to the Adyen account, not to Commission. | Outflow brackets |
| To Merchant (Actual) | Settlement + Refund (equals Actual Paid Total; excludes SameDay) | Outflow brackets |
| To SameDay Account (Actual) | Amount to same-day settlement account | Outflow brackets |
| Close Balance (Actual) | Closing balance after window movements | Unsigned |
| Diff |
(Open − |To Commission| − |To Adyen| − |To Merchant| − |To SameDay|) − Close.
Zero means the balance equation holds. Non-zero → show balance break red status pill (no special Diff cell colour).
|
AU brackets when negative; highlight when ≠ 0 |
Do not show Fees, Net, or a separate Settled column on the main grid (Settled history remains only in the 7-day chart / store subtitle).
5. Balance equation (red alert)
To Adyen = Charge back + Charge back fee (Actual) · To Merchant = Settlement + Refund
If left-hand side ≠ Close Balance (tolerance: 0.01 AUD after rounding to 2 dp), set status light to red, show the gap in the Diff column, and add a balance break red status pill on the store row. Do not recolour the Diff cell itself.
Tooltip / subtitle should state the gap, e.g.
Open − outflows ≠ Close (gap $X.XX).
6. Settlement stability chart & previous average
- Place a mini chart before each store name (same row).
- Bars: last 7 days Settled amounts for that store (window-based daily settled).
- Overlay: horizontal dashed line = selected previous N-day average, where N ∈ {7, 14, 30}.
- Previous N-day average definition: mean of Settled for the N days immediately before report date (exclude today). Not including today.
- Alert rule: if
today Settled > previous N-day avg→ status light yellow (in addition to balance-break rule). - Today’s bar may use warn colour when over the line; chart background may tint warn.
- Global toggle updates all store charts and alert recalculation.
7. Expandable reconciliation detail
Clicking a store row expands two side-by-side comparison cards.
7.1 Actual Received ↔ Expected Received
| Line | Actual naming / destination | Expected naming Source: backend calculation (must differ from Actual) |
|---|---|---|
| Surcharge | Surcharge collected → Commission Account (in Received Total / To Commission scope) | Surcharge |
| Deduction | Deduction collected → Commission Account (in Received Total / To Commission scope) | Deduction |
| Charge back | Charge back collected → Adyen account (feeds To Adyen; excluded from Received Total & To Commission) | Charge back |
| Charge back fee | Charge back fee collected → Adyen account (feeds To Adyen; excluded from Received Total & To Commission) | Charge back fee |
- Actual (Surcharge / Deduction): collected amounts from the Commission Account ledger.
- Actual (Charge back / Charge back fee): amounts that go directly to Adyen (not Commission). Sum = main-grid To Adyen (Actual).
- Expected: amounts we should collect, computed by the backend (rules / fee schedule / window batch). Must not be the same feed as Actual.
Columns: Line item | Actual | Expected | Diff. Diff ≠ 0 → red row highlight. Received Total = Surcharge + Deduction only (Charge back / fee excluded, same pattern as SameDay on Paid).
Received amounts display as positive (plain dollars).
7.2 Actual Paid ↔ Expected Paid
| Line | Actual Source: system auto or manual payout |
Expected Source: system payout calculation basis |
|---|---|---|
| Settlement | Settlement (actual) | Settlement (expected) |
| Refund | Refund (actual) — included in To Merchant / Paid Total | Refund (expected) |
| Same-day settlement | Paid same-day settlement — excluded from Paid Total | Same-day settlement |
- Actual: amounts that were paid out — from system automatic payout and/or manual payout records.
- Expected: amounts that should be paid, from the system’s payout calculation basis (rules for the settlement window). Must not be copied from the Actual payout feed.
Paid / outflow amounts use AU accounting brackets, e.g. ($4,200.00).
To Merchant on the main table equals the Paid card
Total row:
To Merchant = Settlement + Refund.
Same-day settlement remains a detail line and the main-grid
To SameDay Account column, but is excluded from the Paid Total
(so Total always matches To Merchant).
Badge on card: “Matched” or “N mismatch(es)”. SameDay over/under still drives over-paid / under-paid status even though it is outside Total.
8. Money format (AU)
- Locale:
en-AU, 2 decimal places. - Positive / balances:
$1,234.56 - Negative / outflows / paid:
($1,234.56)— no leading minus sign; same ink colour as positives (not red). - Diff column: same bracket convention for negative diffs.
- Red highlight only when Diff ≠ 0 (mismatch row), not merely because a value is negative/bracketed.
9. Status light rules (summary)
| Condition | Status |
|---|---|
| Received Total (Surcharge+Deduction) Actual < Expected OR To Adyen Actual < Expected OR Actual Paid Total (Settlement+Refund) > Expected OR SameDay Actual > Expected OR Balance equation fails (Diff ≠ 0) |
Red (priority over yellow) — under-received / over-paid / balance break |
| Received Total (Surcharge+Deduction) Actual > Expected OR To Adyen Actual > Expected OR Actual Paid Total (Settlement+Refund) < Expected OR SameDay Actual < Expected |
Yellow status pills — over-received / under-paid |
| today Settled > previous N-day avg (and no red condition) |
Yellow (+ row tint / status light) |
| None of the above | Green |
Red/yellow recon rules compare totals (sum of line items). Paid totals use absolute payout amounts (ignore display brackets). Line-level Diff ≠ 0 still highlights red inside the expanded detail.