figma guide

Designing breach settlement fund reconciliation and bank matching UI in Figma: REC-* periods, BNK-* imports, and PAY-* variance resolution

Design breach settlement fund reconciliation and bank matching UI in Figma with REC-* reconciliation periods, BNK-* statement imports, PAY-* variance queues, and court-ready fund reports.

Published
Updated
Sep 01, 2026
Read time
7 min
Level
Intermediate

Quick answer

Fund reconciliation UI proves settlement money in the bank matches what your system says was disbursed—before counsel signs final accounting or a court asks why $47,000 is unaccounted for. Design REC- reconciliation periods* that lock a date range, BNK- bank statement imports* that map to PAY-* disbursement rows, and variance queues where finance resolves timing differences, voided checks, and processor fees. Admins see ledger vs bank side-by-side; auditors export matched/unmatched lists without spreadsheet archaeology. Connect to payment disbursement, counsel approval, returned payments, final accounting, and compliance exports. Start from the Figma guides hub and pair with tables, badges, and Dev Mode handoff.


Who this is for

  • Product designers building settlement administrator finance consoles where trust-account balances must reconcile to the cent.
  • Settlement fund accountants and claims administrators who match bank CSVs to PAY-* records weekly or before court filings.
  • Class counsel and auditors who need REC-* sign-off trails showing when the fund was last balanced.

Reconciliation lifecycle overview

ReconciliationFlow — REC-992-0033 · Period: 2026-07-01 → 2026-07-31 · Status: Variances open (3)
├── Inputs:
│   ├── System ledger: PAY-* sent · RET-* returned · FEE-* processor fees · ADJ-* manual adjustments
│   ├── [Bank import](/designing-breach-settlement-fund-reconciliation-and-bank-matching-ui-in-figma/) BNK-* lines from trust account CSV/OFX
│   ├── Opening balance (prior REC-* closed balance)
│   └── Expected closing = opening + deposits − disbursements − fees
├── ID namespace:
│   ├── REC-* (reconciliation period) · BNK-* (imported bank line)
│   ├── PAY-* · RET-* · FEE-* · ADJ-* (ledger entries)
│   ├── VAR-* (variance item) · MTCH-* (match record)
│   └── AUD-* (import · match · resolve · close)
├── Match types:
│   ├── Auto-match: amount + date window + reference (check #, ACH trace)
│   ├── Suggested match: fuzzy amount · user confirms
│   ├── Split match: one BNK-* → multiple PAY-* (batch ACH)
│   └── Manual link: VAR-* resolved with reason_enum
├── Outcomes:
│   ├── Closed REC-* → Signed by finance + optional counsel attestation
│   ├── Open VAR-* → Blocks [final accounting](/designing-breach-settlement-final-accounting-and-court-closure-ui-in-figma/) close
│   └── Escalated → [Compliance export](/designing-compliance-exports-and-legal-hold-ui-in-figma/) for external audit
└── Claimant impact: None—this is admin-only; never expose REC-* on [status portal](/designing-breach-settlement-claim-status-portal-and-claimant-dashboard-ui-in-figma/)
Reconciliation stateFinance seesBlocks
DraftImport in progressNothing
MatchingAuto + suggested queueREC-* close
Variances openVAR-* list with agingFinal accounting sign-off
Pending sign-offSummary totals balancedCourt filing export
ClosedLocked period · read-onlyRe-open requires ADJ-* + audit

Verdict: Every disbursement batch should be reconcilable within one REC- period—design imports before you scale to 100k PAY- rows.**


REC-* period structure and dashboard

ReconciliationPeriod — REC-992-0033 · settlement_id: SET-992 · trust_account_id: TRUST-001
├── Core fields:
│   ├── rec_id (REC-*) · period_start · period_end
│   ├── opening_balance · closing_balance_system · closing_balance_bank
│   ├── variance_total (must → 0 to close)
│   ├── status: draft · matching · variances · pending_signoff · closed
│   ├── closed_by_user_id · closed_at
│   └── linked_bnk_import_ids[] · linked_pay_batch_ids[]
├── Dashboard cards:
│   ├── Ledger disbursements (period): $2,847,392.18
│   ├── Bank outflows (matched): $2,847,340.00
│   ├── Unmatched bank lines: 12 · Unmatched ledger: 8
│   ├── Known timing (in transit): $52.18 · Fees: $847.00
│   └── Variance remaining: $0.00 ✓ or $X.XX ⚠
├── Side-by-side table (primary UI):
│   ├── Left: Ledger rows (PAY-* · RET-* · FEE-* · ADJ-*)
│   ├── Right: BNK-* lines with match_status chip
│   ├── Center: Link action · Split · Ignore with reason
│   └── Filters: date · amount range · payment_method · batch_id
└── Actions:
    ├── Import BNK-* CSV · Re-run auto-match · Export unmatched
    ├── Create ADJ-* for legitimate difference · Close REC-* (disabled if VAR-* open)
    └── Link to [audit log](/designing-audit-log-and-security-activity-ui-in-figma/)

Use tables with sticky totals row—finance users scroll thousands of lines during month-end.


BNK-* import and auto-match rules

BankImport — BNK-992-0088 · rec_id: REC-992-0033 · Source: Trust ACH · 4,821 lines
├── Import wizard:
│   ├── Step 1: Upload CSV/OFX · Map columns (date · amount · description · reference)
│   ├── Step 2: Preview dedupe (hash date+amount+ref) · Skip duplicates from prior REC-*
│   ├── Step 3: Run auto-match rules · Show match rate before commit
│   └── Step 4: Commit → BNK-* rows created · AUD-* import logged
├── Auto-match rule priority:
│   ├── Exact: PAY-* check_number === BNK-* reference
│   ├── ACH: trace_id in BNK-* memo matches PAY-* processor_ref
│   ├── Amount+date: same $ ±$0.00 within ±3 business days
│   ├── Batch: sum(BNK-*[]) === sum(PAY-*[]) for batch_id
│   └── Fee: FEE-* template matches processor fee pattern
├── Suggested match UI:
│   ├── Confidence score (high · medium · low)
│   ├── Side preview: PAY-992-22014 ↔ BNK-* line
│   ├── Accept · Reject · Defer to manual
│   └── Bulk accept high-confidence (with undo window)
└── Unmatched BNK-* reasons (common):
    ├── Wire fee not modeled → Create FEE-*
    ├── [Returned check RET-*](/designing-breach-settlement-returned-payment-and-reissue-ui-in-figma/) credit not linked
    ├── Interest on trust balance → ADJ-* income
    └── Bank error → VAR-* escalate

Pair import errors with inline alerts—a malformed CSV should not silently drop 200 rows.


VAR-* variance resolution

VarianceItem — VAR-992-0041 · rec_id: REC-992-0033 · Amount: $52.18 · Status: Open
├── Variance types (reason_enum):
│   ├── timing_in_transit — PAY-* sent · BNK-* posts next period
│   ├── processor_fee_unmapped — Create FEE-* from template
│   ├── partial_return — Link RET-* + remaining PAY-*
│   ├── duplicate_import — Dedupe BNK-* · no ledger impact
│   ├── manual_adjustment — ADJ-* with approver (dual control)
│   └── unknown — Escalate · legal hold on close
├── Resolution UI:
│   ├── Assignee · Due date · Notes (internal)
│   ├── Link to BNK-* and/or PAY-* · Or carry forward to next REC-*
│   ├── Resolve → VAR-* closed · AUD-* captured
│   └── Cannot close REC-* while VAR-* unknown type open
├── Carry-forward:
│   ├── timing_in_transit → Auto-reappear in REC-*+1 with link
│   ├── opening_balance adjustment on next period
│   └── Claimant-neutral—no status portal copy
└── Integration with [counsel approval](/designing-breach-settlement-counsel-review-and-payout-approval-ui-in-figma/):
    ├── Large ADJ-* may require APR-* before REC-* close
    └── Export VAR-* summary for counsel review on final fund report

Comparison: reconciliation vs adjacent settlement finance surfaces

SurfaceFocusThis UI adds
Payment disbursementExecute PAY-*Prove bank matches ledger
Counsel approvalGate releasePost-release balance proof
Returned paymentRET-* creditsMatch return deposits to RET-*
Final accountingCourt closeRequires closed REC-*
Tax reporting1099 totalsReconciled disbursement basis

Handoff checklist (Dev Mode)

  • ReconciliationPeriod — rec_id (REC-*), period_start, period_end, opening_balance, variance_total, status_enum.
  • BankImport — bnk_import_id, rec_id, source_format, line_count, committed_at.
  • BankLine — bnk_id (BNK-*), date, amount, reference, match_status_enum, linked_pay_ids[].
  • VarianceItem — var_id (VAR-*), rec_id, amount, reason_enum, assignee_id, resolved_at.
  • MatchRecord — mtch_id (MTCH-*), bnk_id, ledger_ref_type, ledger_ref_id, match_type_enum.
  • ReconciliationDashboard — side_by_side_layout, auto_match_rules[], close_disabled_reasons[].

Common mistakes

MistakeWhy it hurtsFix
Reconcile in Excel onlyNo AUD-* · court discovery gapBNK-* import + match in product
Single global REC-* for all timeUnmanageable at scaleMonthly or batch-aligned periods
Auto-match without previewWrong PAY-* linksCommit wizard with match rate
Ignore processor feesPersistent VAR-*FEE-* templates on import
Close REC-* with open unknown VAR-*Audit findingHard block on close CTA
Show bank balance to claimantsTrust account exposureAdmin-only surface
No carry-forward for in-transitDuplicate VAR-* every monthtiming_in_transit → next REC-*
Split match without batch hashUnaudited partial linksMTCH-* records both legs
Re-open closed REC-* silentlyTampering riskADJ-* + dual approval + AUD-*
Missing link to unclaimed funds escheat outflowsFund leakMap escheat BNK-* to UCF-*

  1. Define REC- period cadence* (monthly vs per disbursement batch) with finance and counsel.
  2. Prototype BNK- import wizard* with column mapping and dedupe preview.
  3. Design side-by-side match UI with auto, suggested, split, and manual paths.
  4. Build VAR- queue* with reason enums and carry-forward to next period.
  5. Gate final accounting close on last closed REC-*.
  6. Export reconciliation package for compliance exports and court filings.

FAQ

One BNK-* line for a 10,000 PAY-* ACH batch?

Split match UI · Link batch_id · Show sum validation · MTCH-* with pay_ids[] hash · Same pattern as counsel batch COUN-*.

RET-* posted in a different month than PAY-*?

Create VAR- timing* or link RET-* in the REC-* when credit appears · Common with returned payment flows.

Trust account earns interest?

ADJ- income row* · Match BNK-* credit · Document in REC-* notes · May affect residual fund reporting.

Counsel must sign REC-* close?

Configurable · High-variance or ADJ-* above threshold → attestation checkbox · Export for final accounting.

Real-time reconciliation during disbursement?

Operational dashboard separate from period close · REC-* still locks for audit · Don’t mix live queue with closed REC-* edits.


Next steps

Share on X

§ Keep reading

Related guides.