figma guide

Designing breach settlement payment submission acknowledgment and processor NACK remediation UI in Figma: SUB-ACK-*, FILE-NACK-*, and resubmit gates

Design breach settlement payment submission ACK/NACK UI in Figma with SUB-ACK-* processor receipts, FILE-NACK-* rejections, row-level fix queues, and safe resubmit without duplicate bank legs.

Published
Updated
Sep 24, 2026
Read time
5 min
Level
Intermediate

Quick answer

Submission ACK/NACK UI closes the gap between “we clicked submit” and “the bank accepted the file”—without guessing whether money moved. Design SUB-ACK- processor receipts* tied to immutable FILE-NACHA-* artifacts, FILE-NACK- rejection bundles* with row-level error codes, and RESUB- gates* that block duplicate SUB-* until NACK is resolved or superseded by WAVE-REX-*. Operators see intake status (received · parsing · accepted · rejected · partial); claimants only see timeline updates when SUB-ACK-* confirms accept or when payment inquiry rules allow “processing” copy. Link partial accepts to bank confirmation TRACE-* rows and full rejects to ROW-PATCH-* or payee correction. Start from the Figma guides hub and pair with tables, progress indicators, and Dev Mode handoff.


Who this is for

  • Product designers on treasury consoles where processor portals return opaque “file rejected” emails with no row context.
  • Disbursement ops reconciling SUB-ACK-* timestamps to fund reconciliation REC-* periods.
  • Auditors proving SUB-* attempts, NACK reasons, and RESUB-* lineage never double-credited escrow.

SUB-ACK-* and FILE-NACK-* lifecycle

SubmissionOutcome — SUB-ACK-992-014 · file: FILE-NACHA-992-002 · Status: Accepted (full)
├── Pre-submit (from [NACHA preview](/designing-breach-settlement-payment-file-generation-and-nacha-preview-ui-in-figma/)):
│   ├── HASH-FILE-* checksum shown to operator
│   ├── SUB-* id assigned at click (immutable attempt id)
│   └── Counsel / [GATE-PAY-*](/designing-breach-settlement-disbursement-hold-release-and-payment-gate-ui-in-figma/) cleared
├── Processor intake states (operator UI):
│   ├── submitted → transmitted → received
│   ├── parsing → validated → accepted | rejected | partial
│   └── SLA timer · retry policy · support ticket link
├── ID namespace:
│   ├── SUB-* (submit attempt) · SUB-ACK-* (positive receipt)
│   ├── FILE-NACK-* (rejection bundle) · NACK-ROW-* (line errors)
│   ├── RESUB-* (follow-up attempt) · LOG-SUB-* (audit)
│   └── TRACE-PEND-* (awaiting [bank confirm](/designing-breach-settlement-bank-confirmation-and-trace-matching-ui-in-figma/))
├── Outcomes:
│   ├── Full ACK → unlock TRACE-PEND-* · update [status portal](/designing-breach-settlement-claim-status-portal-and-claimant-dashboard-ui-in-figma/) “processing”
│   ├── Full NACK → no PAY-* settle flags · queue NACK-ROW-*
│   ├── Partial ACK → accepted pay_ids vs rejected · split WAVE-REX-* plan
│   └── Timeout → SUB-STALE-* · escalate without auto-resubmit
└── Claimant rule: No “paid” until TRACE-* or [proof of payment](/designing-breach-settlement-proof-of-payment-and-remittance-advice-ui-in-figma/)
Processor signalAdmin primary actionClaimant-safe copy
Full SUB-ACK-*Monitor TRACE-PEND-*“Payment processing”
FILE-NACK- (format)*Fix file · new FILE-NACHA-* vN+1No change
NACK-ROW- (account)*Route to BENE-UPD-*“Action needed” only if pay_id known
Partial acceptAccepted rows locked · patch rejectsMixed timeline by CLM-*
SUB-STALE-*Manual processor ticketNeutral delay banner

Verdict: Treat SUB- as an attempt, SUB-ACK- as proof of intake—not proof of settlement.** Settlement remains TRACE-* and REC-* domain.


FILE-NACK-* remediation workspace

NackRemediation — FILE-NACK-992-003 · parent SUB-992-011 · linked FILE-NACHA-992-002
├── Summary header:
│   ├── rejection_class (schema · business · duplicate file · cutoff)
│   ├── rejected_at · processor_reference · raw message (expand)
│   ├── row_error_count · dollar_at_risk
│   └── Recommended path: REX · BENE · cancel SUB · escalate
├── NACK-ROW-* table:
│   ├── line_number · pay_id · clm_id · nacha_field
│   ├── error_code · fix_hint_enum
│   ├── linked ROW-PATCH-* / BENE-UPD-* draft
│   └── include_in_rex_bool (default true for fixable)
├── Actions (gated):
│   ├── Create WAVE-REX-* from NACK-ROW-* selection
│   ├── Open [void/recall](/designing-breach-settlement-stop-payment-void-and-in-flight-recall-ui-in-figma/) if SUB-ACK partial sent
│   ├── Mark RESUB-* blocked until HASH-FILE-* vN+1 ready
│   └── Export NACK manifest for [post-disbursement QA](/designing-breach-settlement-post-disbursement-qa-and-audit-sampling-ui-in-figma/)
└── Timeline panel:
    ├── SUB-* → NACK → REX → SUB-RESUB-* chain
    └── Never hide failed SUB-* from LOG-SUB-*

Use badges for rejection_class and inline alerts when duplicate SUB-* is attempted while NACK is open.


Comparison: resubmit vs re-export vs new SUB-*

PathWhenDuplicate risk
Same SUB- retry*Transient network onlyHigh if processor already parsed
RESUB- new attempt*After full NACK on unchanged fileMedium without ACK check
WAVE-REX- + FILE-NACHA- vN+1**Row or hash fix requiredLow if SKIP-REX-* honored
Manual wire exceptionProcessor bypassHigh · needs counsel flag

Best for: Schema NACK on ≤50 NACK-ROW-* after payee correction already approved.


Claimant timeline integration

Keep hold release notifications honest:

  • SUB-ACK- full:* advance timeline to “Sent to bank” (not “Deposited”).
  • FILE-NACK-*: revert only premature steps; never delete history—append correction event.
  • Partial: per-CLM-* branches; avoid global “payment delayed” if one subclass failed validation.

Pair with returned payment when SUB-ACK-* succeeded but ACH later returns—different RET-* path, same PAY-* anchor.


Handoff checklist (Dev Mode)

  • PaymentSubmission — sub_id (SUB-), file_id (FILE-NACHA-), hash_file_id, submitted_at, status_enum.
  • SubmissionAcknowledgment — sub_ack_id (SUB-ACK-*), sub_id, ack_type_enum (full · partial · reject), processor_ref.
  • FileNack — file_nack_id (FILE-NACK-*), sub_id, rejection_class_enum, row_error_count.
  • NackRow — nack_row_id (NACK-ROW-*), pay_id, error_code, fix_hint_enum.
  • ResubmitGate — resub_id (RESUB-*), blocked_reason_enum, parent_nack_id.

Common mistakes

MistakeWhy it hurtsFix
“Paid” on SUB-ACK-* aloneFalse claimant trustTRACE-* gate
Hide failed SUB-*Audit gapLOG-SUB-* immutable
Auto-resubmit same HASH-FILE-*Duplicate debitRESUB-* requires vN+1 or ACK proof of non-intake
Partial NACK without row locksDouble pay on RESUBLock accepted pay_ids
One global status for partialWrong CLM-* messagingPer-claim timeline
NACK rows not linked to PAY-*Orphan fixespay_id required on NACK-ROW-*
Skip reconciliationREC-* mismatchExpected SUB-ACK date in period
Processor email as only UIOps blindIn-app FILE-NACK-* mirror

  1. Extend NACHA preview with post-submit status rail (SUB-* → ACK/NACK).
  2. Design FILE-NACK- detail* with NACK-ROW-* → WAVE-REX-* CTA.
  3. Add RESUB- modal* that checks open NACK and HASH-FILE-* version.
  4. Wire claimant timeline rules to SUB-ACK-* type enum.
  5. Document partial accept handoff to bank confirm TRACE-*.

FAQ

SUB-ACK-* vs bank confirmation TRACE-*?

ACK is processor file intake · TRACE-* is settlement-level match to bank ledger.

Processor accepts file but rejects one row later?

Use partial SUB-ACK-* · NACK-ROW-* for post-intake rejects · may overlap returned payment RET-*.

Duplicate SUB-* click?

Second SUB- blocked* · show existing SUB-ACK-* or FILE-NACK-* · LOG-SUB-* records attempt.

NACK during appeal stay?

RESUB- disabled for stayed subclass* · draft REX only.

Full file duplicate NACK?

New FILE-NACHA- with new SUB-** · never reuse SUB-* id · link superseded_by on file artifact.


Next steps

Share on X

§ Keep reading

Related guides.