figma guide
Designing breach settlement sanctions screening and OFAC payment hold UI in Figma: SAN-*, WATCH-*, and export-safe release gates
Design breach settlement sanctions screening UI in Figma with SAN-* holds, WATCH-* match review, beneficiary screening states, and counsel-safe release before NACHA export and wire disbursement.
- Published
- Updated
- Sep 26, 2026
- Read time
- 6 min
- Level
- Intermediate
Quick answer
Sanctions screening UI prevents the worst compliance failure: paying a blocked beneficiary while the rest of the wave looks “green.” Design SAN- holds* on pay_id and BENE-* records, WATCH- match review workspaces* with false-positive workflows, and export gates that block FILE-NACHA-* generation until screening_state=cleared or counsel-approved OVR-SAN-* exists. Treasury should never rely on a single batch checkbox—show per-pay_id screening badges on pre-export validation, counsel approval, and GATE-PAY-* rows. Claimants on foreign payment paths need plain-language “additional review” copy—not list names or screening vendor jargon. Pair with payee correction, idempotency, and fund reconciliation. Start from the Figma guides hub and use tables, modals, and Dev Mode handoff.
Who this is for
- Product designers wiring disbursement exports where compliance is “handled by the bank” until an OFAC hit stops the whole program.
- Compliance ops who need auditable false-positive decisions without exposing raw watchlist data to every claims adjuster.
- Counsel reviewing whether OVR-SAN-* releases are defensible in final accounting and external auditor samples.
SAN-* hold model
SanctionsHold — SAN-992-771 · pay_id: PAY-992-4412 · bene_id: BENE-992-118
├── Trigger points:
│ ├── BENE create/update · [payee correction](/designing-breach-settlement-payee-correction-and-beneficiary-update-ui-in-figma/)
│ ├── Pre-export VAL-PASS-* · [validation queue](/designing-breach-settlement-pre-export-payment-validation-and-exception-queue-ui-in-figma/)
│ ├── WAVE planning · [distribution schedule](/designing-breach-settlement-distribution-schedule-and-tranche-disbursement-planning-ui-in-figma/)
│ └── Re-screen on name/address change after prior clear
├── Screening states:
│ ├── pending → cleared | potential_match | confirmed_match | error_retry
│ ├── SAN-HOLD-* blocks SUB-* · WAVE-REX-* · REISSUE-*
│ └── OVR-SAN-* rare · counsel + compliance dual approval
├── Linked artifacts:
│ ├── WATCH-* match case · LOG-SAN-* audit
│ ├── GATE-PAY-* (cannot release while SAN-HOLD-*)
│ └── IDMP-* submit blocked with reason_code=sanctions ([idempotency](/designing-breach-settlement-payment-idempotency-and-duplicate-submission-prevention-ui-in-figma/))
└── Claimant portal:
├── status=review (no OFAC acronyms)
└── action_needed only when BENE fix required
| State | Operator label | Export allowed? | Claimant-safe copy |
|---|---|---|---|
| pending | Screening in progress | No | “Reviewing payment details” |
| potential_match | WATCH-* open | No | “Additional verification in progress” |
| cleared | Cleared | Yes (if other gates pass) | “Processing” per timeline |
| confirmed_match | Blocked | No | “Unable to process—contact support” |
| error_retry | Vendor/API error | No | “Temporary delay” |
Verdict: Screening is per beneficiary identity, not per wave mood—one uncleared SAN-* should not hide inside a 10k-row export.
WATCH-* match review workspace
WatchlistMatch — WATCH-992-044 · san_hold_id: SAN-992-771 · match_score: 0.82
├── Header ([inline alert](/designing-inline-alerts-and-banners-in-figma/)):
│ ├── severity=warning · “Potential sanctions match—do not export”
│ ├── pay_id · claim_id · dollar (need-to-know RBAC)
│ └── Screening vendor ref (admin only—not in claimant UI)
├── Comparison panel (restricted):
│ ├── Beneficiary fields submitted vs watchlist candidate
│ ├── Highlight diff: name token · DOB · country · address
│ └── Attachments: gov ID redacted preview · [document upload](/designing-breach-settlement-claim-document-upload-and-evidence-management-ui-in-figma/)
├── Decision workflow ([stepper](/designing-progress-indicators-and-steppers-in-figma/)):
│ ├── 1. Analyst: false_positive | escalate | request_info
│ ├── 2. Compliance lead: confirm false_positive | confirm_block
│ ├── 3. Counsel: OVR-SAN-* if edge case (dual national, transliteration)
│ └── LOG-SAN-* immutable on each transition
├── Safe actions:
│ ├── Open BENE-UPD-* for typo fix (re-triggers screen)
│ ├── Route to [call center script](/designing-breach-call-center-and-agent-script-ui-in-figma/) for claimant outreach
│ └── Link [IDV step-up](/designing-breach-settlement-claimant-identity-reverification-and-step-up-ui-in-figma/) when identity doubt—not same as sanctions clear
└── Blocked actions:
├── Force include in NACHA preview
└── Bulk “clear all matches” without row-level LOG-SAN-*
False-positive rate matters: design bulk queue filters (country, match score band, rescreen age) so analysts are not clicking through thousands of benign foreign claimant transliterations without audit trail.
Export and GATE-PAY integration
SanctionsExportGate — embedded in FILE-NACHA-* preview and GATE-PAY release
├── Pre-flight table column: screening_state badge per pay_id
├── Block reasons rollup:
│ ├── SAN-HOLD-* count · WATCH-* open count · error_retry count
│ ├── CTA: Open sanctions queue · Export excluded-only (policy gated)
│ └── Cannot proceed if any included row ≠ cleared
├── Counsel APR-PAY-* row annotation:
│ ├── “Includes OVR-SAN-*” chip with link to LOG-SAN-*
│ └── Separate from fraud FRD-* and [lien offset](/designing-breach-settlement-lien-and-third-party-creditor-offset-ui-in-figma/)
└── Post-export:
├── Re-screen on BENE change → new SAN-* even if TRACE-* exists
└── [Void/recall](/designing-breach-settlement-stop-payment-void-and-in-flight-recall-ui-in-figma/) if match confirmed after SUB-*
Integration with pre-export validation: VAL-EXC-SAN-* rows sit beside routing/TIN exceptions—operators fix in one queue, not three tabs.
Comparison: sanctions hold vs fraud hold vs lien hold
| Hold type | Primary risk | Release owner | Typical UI id |
|---|---|---|---|
| SAN-* | Regulatory / OFAC | Compliance + counsel | WATCH-* |
| FRD-* | Duplicate/fraud claim | Fraud ops | Fraud UI |
| LIEN-* | Creditor offset | Counsel/treasury | Lien offset |
| GATE-PAY-* | Legal/appeal stay | Counsel | Payment gate |
Best for: Training analysts—stacked holds need ordered release checklist, not one “approve payment” button.
Handoff checklist (Dev Mode)
- SanctionsHold — san_id (SAN-*), pay_id, bene_id, screening_state_enum, vendor_ref optional, opened_at, cleared_at optional.
- WatchlistMatch — watch_id (WATCH-*), san_id, match_score, analyst_decision_enum, restricted_payload_ref.
- SanctionsOverride — ovr_san_id (OVR-SAN-*), san_id, counsel_user_id, compliance_user_id, reason_text, court_doc_id optional.
- SanctionsAuditLog — log_san_id (LOG-SAN-*), event_enum, actor, before_state, after_state.
- ExportSanctionsSummary — blocked_count, ovr_san_count, last_rescreen_at.
Use role-based field visibility in specs: claimant components omit watchlist candidate names entirely.
Common mistakes
| Mistake | Why it hurts | Fix |
|---|---|---|
| Screen only at claim intake | BENE changes after clear | Re-screen on BENE-UPD-* |
| Wave-level “all clear” badge | Misses one SAN-* | Per pay_id column |
| Show watchlist names to claimants | Safety + legal exposure | Generic review copy |
| Clear match without LOG-SAN-* | Audit failure | Stepper decisions logged |
| Skip foreign wire rules | Correspondent bank blocks | Pair with international payment |
| OVR-SAN-* without dual approval | Counsel-only bypass | Compliance co-sign |
| Screening after SUB-* | Irreversible pay | Gate before NACHA preview |
| Same queue as FRD-* | Wrong skill sets | Separate WATCH-* workspace |
Recommended workflow
- Add screening_state to every pay_id row in treasury and status portal admin views.
- Design WATCH- review* as restricted-role page with comparison + stepper—not a spreadsheet export.
- Embed SAN- rollup* in NACHA preview footer with blocked-row drill-down.
- Wire OVR-SAN- to counsel queue* with mandatory LOG-SAN-* attachment.
- Document claimant copy keys for review vs action-needed vs blocked terminal states.
FAQ
Screen claimants or only beneficiaries?
Screen payment beneficiaries (BENE-*)—including heirs and guardian payees; claimants may differ from payees.
Rescreen entire wave on list update?
Policy-driven—UI shows RESCREEN-BATCH-* job progress; do not silently flip cleared rows without LOG-SAN-*.
SAN-* and escrow interest wires?
Screen inbound defendant wires and outbound alloc—separate SAN-* scope on entity, not just claimants.
Match after proof of payment?
Open RECOVERY- + clawback path*—portal may need to revert “paid” per policy.
Vendor outage (error_retry)?
Block export · show SLA-style retry timer · manual fallback procedure link for ops—not fake “cleared.”
Next steps
- Design breach settlement pre-export payment validation and exception queue UI in Figma — VAL-EXC-SAN-* alongside routing errors
- Design breach settlement payee correction and beneficiary update UI in Figma — re-screen triggers
- Design breach settlement foreign claimant and international payment UI in Figma — higher false-positive volume
- Design breach settlement disbursement hold release and payment gate UI in Figma — stacked holds
- Design breach settlement payment file generation and NACHA preview UI in Figma — export block UX
§ Keep reading