figma guide

Designing breach settlement wire and check fallback disbursement UI in Figma: WIR-*, CHK-*, and ACH-failed rail switching

Design breach settlement wire and check fallback UI in Figma with WIR-* wire instructions, CHK-* mail tracking, ACH-failed rail switches, and claimant-safe delivery status.

Published
Updated
Sep 27, 2026
Read time
6 min
Level
Intermediate

Quick answer

Wire and check fallback UI is how programs pay people when ACH is impossible, rejected, or non-compliant—not a “legacy mode” hidden from product specs. Design WIR- wire disbursement* with beneficiary bank capture, CHK- paper check* with mail tracking and stop/reissue, and rail switch workflows that preserve pay_id history when moving from ACH to alternate rails after returns or sanctions clearance. Treasury needs one payment_rail_enum visible on pre-export validation, NACHA preview (ACH-only rows), and status portal timelines. Claimants choosing wire or check need different proof artifacts than TRACE-* ACH—link proof of payment variants. International paths extend foreign claimant without duplicating SWIFT forms on every screen. Start from the Figma guides hub and use forms, saved addresses, and Dev Mode handoff.


Who this is for

  • Product designers where engineering only built ACH FILE-NACHA-* and ops pays wires manually in email.
  • Claims ops reissuing after R03/R04 returns when the claimant cannot fix ACH but can accept a check.
  • Compliance ensuring sanctions screening runs on WIR-* and CHK-* beneficiaries, not only ACH batches.

Rail switch: ACH → WIR-* or CHK-*

PaymentRailSwitch — RSW-992-055 · pay_id: PAY-992-4412 · from: ach · to: wire | check
├── Preconditions:
│   ├── Prior leg: RET-* max retries | VAL-FAIL-* | claimant_elected_alt_rail
│   ├── [Payee correction](/designing-breach-settlement-payee-correction-and-beneficiary-update-ui-in-figma/) complete for new rail
│   ├── SAN-* cleared for updated BENE-* ([sanctions UI](/designing-breach-settlement-sanctions-screening-and-ofac-payment-hold-ui-in-figma/))
│   └── [GATE-PAY-*](/designing-breach-settlement-disbursement-hold-release-and-payment-gate-ui-in-figma/) allows new submission
├── States:
│   ├── requested → bene_data_collected → approved → submitted → confirmed | failed
│   ├── Never delete ACH SUB-* row—append RSW-* event
│   └── New IDMP-* on submit ([idempotency](/designing-breach-settlement-payment-idempotency-and-duplicate-submission-prevention-ui-in-figma/))
├── Artifacts:
│   ├── WIR-* or CHK-* leg id · LOG-RSW-*
│   ├── Counsel flag if amount > threshold
│   └── Fee disclosure (wire fee deducted vs gross)
└── Portal:
    ├── “Payment method updated to {wire|check}”
    └── Timeline omits SWIFT/account numbers
TriggerTypical railAvoid
Repeated ACH returnCHK-*Silent wire without claimant consent
No ACH in countryWIR-*Fake US address for ACH
OFAC hold cleared with wire pathWIR-*Skipping re-screen
Claimant prefers checkCHK-*Mailing to unverified address

Verdict: Rail switch is a first-class workflow, not a support macro—spec RSW-* before check stock runs out mid-wave.


WIR-* wire disbursement workspace

WireDisbursement — WIR-992-883 · pay_id · bene_id: BENE-992-118
├── Beneficiary capture ([forms](/designing-forms-in-figma-inputs-states-and-handoff/)):
│   ├── Legal name match [eligibility](/designing-breach-victim-eligibility-verification-portal-ui-in-figma/) · address
│   ├── Bank name · SWIFT/BIC · IBAN or account+ABA rules by corridor
│   ├── Intermediary bank optional · purpose of payment code (internal)
│   └── Upload voided check / bank letter ([document upload](/designing-breach-settlement-claim-document-upload-and-evidence-management-ui-in-figma/))
├── Validation ([pre-export queue patterns](/designing-breach-settlement-pre-export-payment-validation-and-exception-queue-ui-in-figma/)):
│   ├── Format validators · country allowlist
│   ├── Duplicate BENE fingerprint vs [fraud](/designing-breach-settlement-duplicate-claim-detection-and-fraud-prevention-ui-in-figma/)
│   └── FX estimate display (internal)—not a guaranteed rate in portal
├── Submission:
│   ├── WIR-SUB-* · processor reference WIR-TRACE-*
│   ├── Fee line item · RES-OP-* bucket ([replenishment](/designing-breach-settlement-escrow-replenishment-and-disbursement-reserve-ui-in-figma/))
│   └── [Bank confirmation](/designing-breach-settlement-bank-confirmation-and-trace-matching-ui-in-figma/) match type = wire
├── Failure handling:
│   ├── beneficiary_rejected · swift_invalid · compliance_reject
│   └── Reopen [payee correction](/designing-breach-settlement-payee-correction-and-beneficiary-update-ui-in-figma/)—do not re-ACH automatically
└── Claimant status:
    ├── “International transfer sent” · expected delivery window
    └── Link [where-is-my-payment](/designing-breach-settlement-payment-inquiry-and-where-is-my-payment-ui-in-figma/) with WIR-* category

Domestic USD wires reuse the same WIR-* frame with domestic routing fields—do not fork unrelated UI; use corridor_enum to show fields.


CHK-* check disbursement workspace

CheckDisbursement — CHK-992-224 · pay_id · mail_to_address_id
├── Address source:
│   ├── [Saved addresses](/designing-saved-addresses-and-address-book-ui-in-figma/) · [payee correction](/designing-breach-settlement-payee-correction-and-beneficiary-update-ui-in-figma/)
│   ├── Undeliverable flag from prior CHK-UND-*
│   └── PO Box rules (program policy banner)
├── Check lifecycle:
│   ├── CHK-PRINT-* · CHK-MAIL-* · tracking optional
│   ├── CHK-CASH-* when deposited (bank file or manual)
│   ├── CHK-STOP-* · CHK-REISS-* ([stop payment patterns](/designing-breach-settlement-stop-payment-void-and-in-flight-recall-ui-in-figma/) adapted)
│   └── Stale date · escheat link [UCF](/designing-breach-settlement-unclaimed-funds-and-escheatment-ui-in-figma/)
├── Admin queue ([tables](/figma-tables-and-data-ui-rows-columns-and-handoff/)):
│   ├── Print batch · mail house export
│   ├── Exception: address failed validation · deceased [heir flow](/designing-breach-settlement-deceased-claimant-and-heir-designation-ui-in-figma/)
│   └── Link [tax 1099](/designing-breach-settlement-tax-reporting-and-1099-ui-in-figma/) when check is reportable event
└── Portal:
    ├── “Check mailed on {date}” · no check number in public API
    └── Reissue copy when CHK-UND-* after [timeline notification](/designing-breach-settlement-hold-release-notifications-and-claimant-payment-timeline-ui-in-figma/)

Checks overlap returned payment emotionally for claimants—use calm copy: “We’re sending payment by mail” not “ACH failed.”


Comparison table: ACH vs wire vs check

RailConfirmation artifactTypical delayClaimant data burden
ACHTRACE-* · NACHA1–3 business daysRouting + account
WIR-*WIR-TRACE-* · SWIFT ack1–5+ daysSWIFT/IBAN, bank docs
CHK-*CHK-MAIL-* · CHK-CASH-*Mail + depositMailing address only

Best for: Distribution schedule—split WAVE- by rail* so FILE-NACHA-* batches do not block wire rows.


Status portal timeline (multi-rail)

ClaimantTimeline — pay_id scoped
├── EVT-RSW-* “Payment method changed”
├── EVT-WIR-SUB-* / EVT-CHK-MAIL-* (rail-specific copy keys)
├── EVT-PAID-* uses generic “Payment completed” internally mapped
├── [REV-*](/designing-breach-settlement-payment-reversal-chargeback-and-unauthorized-debit-dispute-ui-in-figma/) rare on wires—show “Contact us” not chargeback jargon
└── Download [proof](/designing-breach-settlement-proof-of-payment-and-remittance-advice-ui-in-figma/) PDF variant by rail

Use progress steppers for wire (“Submitted → Sent → Received by bank”)—checks use mail-centric steps instead.


Handoff checklist (Dev Mode)

  • PaymentRailSwitch — rsw_id (RSW-*), pay_id, from_rail, to_rail, reason_enum, state_enum, requested_at.
  • WireDisbursement — wir_id (WIR-*), pay_id, corridor_enum, bene_bank_json, fee_amount, wir_trace_id, state_enum.
  • CheckDisbursement — chk_id (CHK-*), pay_id, mail_address_id, mail_date, tracking_token optional, state_enum.
  • RailSpecificProof — proof_id (PROOF-*), pay_id, rail_enum, download_url_policy, issued_at.
  • ClaimantRailPreference — pref_id (PREF-RAIL-*), claim_id, allowed_rails_json, elected_rail optional.

Common mistakes

MistakeWhy it hurtsFix
Wire UI only in ops runbookWrong BENE in prodWIR-* in product specs
Reuse ACH TRACE copy for wireSupport confusionWIR-TRACE-* labels
Mail check without address verifyFraud / lossValidation + IDV for changes
Skip SAN-* on rail switchCompliance gapRe-screen on RSW-*
Single NACHA export for mixed waveWires droppedPer-rail batch views
Show full bank details in portalAccount takeover riskAdmin-only bene_bank_json
No CHK-STOP-* linkageDouble paymentStop/recall patterns
Ignore wire fees in RES-OP-*Surprise shortfallEscrow reserve

  1. Add payment_rail_enum to pay_id header across treasury and portal.
  2. Design RSW- wizard* after ACH failures with claimant consent step.
  3. Spec WIR- and CHK- lifecycles** with distinct confirmation ids—not shared “paid” boolean.
  4. Split wave planning by rail before NACHA export.
  5. Align proof PDFs and WIMP inquiry categories per rail.

FAQ

Same as foreign claimant post?

Foreign claimant focuses on eligibility and tax W-8; this post focuses on operational WIR- / CHK- rails and ACH fallback**—cross-link, do not merge specs.

Minor claimant paid by check?

Payee must match guardian designation—CHK-* mail_to locked until guardian BENE approved.

Wire and idempotency?

New IDMP- per WIR-SUB-**—SWIFT retries are not ACH re-export duplicates.

Check reissue after REV-*?

Rare for checks—use CHK-REISS-* with new chk_id; link REV-* if check was cashed fraudulently.

Escrow replenishment for wire fees?

Deduct from award vs escrow fee bucket—disclose in portal only if plan requires.


Next steps

Share on X

§ Keep reading

Related guides.