/cancel moves a cancellable outgoing entry to canceled, and /return starts the return chain. Incoming and outgoing entries have different lifecycles.
Statuses
The table lists each status.Incoming entries
The diagram shows the incoming lifecycle. An incoming entry starts inscheduled, or in under_review if a validation rule holds it, and moves to posted on settlement. You return a posted incoming entry with POST /v2/ach/{ach_id}/return. The entry moves to pending_return and then to returned when the return posts.
Outgoing entries
The diagram shows the outgoing lifecycle. A successfulPOST /v2/ach returns the entry in scheduled. An entry that passes validation moves from scheduled to processing, submitted, and posted. An entry that fails a validation rule goes to under_review, then to approved or rejected. You can cancel while the entry is scheduled, under_review, or approved. After it is processing, it can’t be canceled.
When a requested action is rejected
When an action on a posted entry goes to manual review and is rejected, the entry returns to the status it held before the action. For example, a return request on a posted entry moves it to pending_return. If Lead rejects the return, the entry moves back to posted. No new ach.posted webhook is sent.
Where core transactions are created
Each posting creates one core transaction, and the ACH object records which event it belongs to.
Every other transition changes
status only. A rejected or canceled entry never has a core transaction.
Observing changes
Status changes emit webhook events namedach.<status>. The payload is the ACH object.
processing, canceled, pending_return, pending_dishonored_return, and pending_contested_return don’t emit events. GET /v2/ach/{ach_id} returns the current status. What to do on each event is covered on Sending ACH and Receiving ACH.

