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
StateOperator labelExport allowed?Claimant-safe copy
pendingScreening in progressNo“Reviewing payment details”
potential_matchWATCH-* openNo“Additional verification in progress”
clearedClearedYes (if other gates pass)“Processing” per timeline
confirmed_matchBlockedNo“Unable to process—contact support”
error_retryVendor/API errorNo“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 typePrimary riskRelease ownerTypical UI id
SAN-*Regulatory / OFACCompliance + counselWATCH-*
FRD-*Duplicate/fraud claimFraud opsFraud UI
LIEN-*Creditor offsetCounsel/treasuryLien offset
GATE-PAY-*Legal/appeal stayCounselPayment 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

MistakeWhy it hurtsFix
Screen only at claim intakeBENE changes after clearRe-screen on BENE-UPD-*
Wave-level “all clear” badgeMisses one SAN-*Per pay_id column
Show watchlist names to claimantsSafety + legal exposureGeneric review copy
Clear match without LOG-SAN-*Audit failureStepper decisions logged
Skip foreign wire rulesCorrespondent bank blocksPair with international payment
OVR-SAN-* without dual approvalCounsel-only bypassCompliance co-sign
Screening after SUB-*Irreversible payGate before NACHA preview
Same queue as FRD-*Wrong skill setsSeparate WATCH-* workspace

  1. Add screening_state to every pay_id row in treasury and status portal admin views.
  2. Design WATCH- review* as restricted-role page with comparison + stepper—not a spreadsheet export.
  3. Embed SAN- rollup* in NACHA preview footer with blocked-row drill-down.
  4. Wire OVR-SAN- to counsel queue* with mandatory LOG-SAN-* attachment.
  5. 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

Share on X

§ Keep reading

Related guides.