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 signal | Admin primary action | Claimant-safe copy |
|---|---|---|
| Full SUB-ACK-* | Monitor TRACE-PEND-* | “Payment processing” |
| FILE-NACK- (format)* | Fix file · new FILE-NACHA-* vN+1 | No change |
| NACK-ROW- (account)* | Route to BENE-UPD-* | “Action needed” only if pay_id known |
| Partial accept | Accepted rows locked · patch rejects | Mixed timeline by CLM-* |
| SUB-STALE-* | Manual processor ticket | Neutral 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-*
| Path | When | Duplicate risk |
|---|---|---|
| Same SUB- retry* | Transient network only | High if processor already parsed |
| RESUB- new attempt* | After full NACK on unchanged file | Medium without ACK check |
| WAVE-REX- + FILE-NACHA- vN+1** | Row or hash fix required | Low if SKIP-REX-* honored |
| Manual wire exception | Processor bypass | High · 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
| Mistake | Why it hurts | Fix |
|---|---|---|
| “Paid” on SUB-ACK-* alone | False claimant trust | TRACE-* gate |
| Hide failed SUB-* | Audit gap | LOG-SUB-* immutable |
| Auto-resubmit same HASH-FILE-* | Duplicate debit | RESUB-* requires vN+1 or ACK proof of non-intake |
| Partial NACK without row locks | Double pay on RESUB | Lock accepted pay_ids |
| One global status for partial | Wrong CLM-* messaging | Per-claim timeline |
| NACK rows not linked to PAY-* | Orphan fixes | pay_id required on NACK-ROW-* |
| Skip reconciliation | REC-* mismatch | Expected SUB-ACK date in period |
| Processor email as only UI | Ops blind | In-app FILE-NACK-* mirror |
Recommended workflow
- Extend NACHA preview with post-submit status rail (SUB-* → ACK/NACK).
- Design FILE-NACK- detail* with NACK-ROW-* → WAVE-REX-* CTA.
- Add RESUB- modal* that checks open NACK and HASH-FILE-* version.
- Wire claimant timeline rules to SUB-ACK-* type enum.
- 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
- Design breach settlement payment file generation and NACHA preview UI in Figma — pre-submit validation
- Design breach settlement payment re-export and batch correction UI in Figma — vN+1 after NACK
- Design breach settlement bank confirmation and trace matching UI in Figma — post-ACK settlement
- Design breach settlement pre-export payment validation and exception queue UI in Figma — catch errors before SUB-*
- Design breach settlement fund reconciliation and bank matching UI in Figma — SUB-ACK dates in REC-*
§ Keep reading