Notifications and States

When you submit an ACH or receive an ACH, those transfers go through multiple state transitions. One of the most powerful features of Column lies in our ability to notify you during each transition. This keeps you updated throughout the process and allows you to track the outcome of that transfer.

Effective Date

The effective date is the date on which funds transfer between Column and an external bank to satisfy an ACH payment. This date is determined by what is specified in the ACH Transfer API, and starts the clock on ACH Return windows. In our ACH transfer object, the effective date is the effective_on field. For same day ACH transfers, the effective date is the same day the ACH request is made. For standard ACH transfers, the effective date is typically the next banking day. For future dated / scheduled ACH transfers, the effective date is sometime in the future.

ODFI (Sending ACH payments)

When you send a new ACH payment via our ACH Transfer API, it becomes initiated. The transfer sits in this stage until right before the Federal Reserve's next settlement window (read about timing here. Your ACH payment can be canceled any time between your API call and its submission to the Federal Reserve.

Valid Characters Permitted

NACHA enforces strict rules for valid characters permitted in ACH transfers. These transfers are largely alphanumeric characters, with some additional special characters. The regular expression can be used to detect invalid characters: [^ \w!"#$%&'()*+,-.\\/:;<>=?@\[\]^_{}|~]+.

Outgoing Credit ACH Transfers

For an outgoing ACH credit transfer, funds will be deducted from the originator's bank account immediately when the transfer is initiated. If there are insufficient funds on the originator's bank account, the transfer request will fail. However, if both the originator's bank account and the transfer are configured as overdraftable by your platform, we will lock the overdrafted amount in your overdraft reserve account, and initiate the transfer. For example, assume the originator's bank account has available_balance = $20, and the request is to send $100 out. Your overdraft reserve account has available_balance = $1000 and locked_balance = $0. After this transfer request is initiated, the originator's bank account will have available_balance = -$80, and your overdraft reserve account will have available_balance = $920 and locked_balance = $80.

Outgoing Debit ACH Transfers

For an outgoing ACH debit transfer, the requested amount will be showed as pending_balance after it is initiated. Once submitted, the transfer will remain in a submitted state until Column makes funds available. Column will make funds available for this outgoing debit transfer at the opening of business on the 2nd banking day following the effective date of the transfer. Column will send the ach.outgoing_transfer.settled event when funds become available. For example, if the effective date on an outgoing debit request is on a Monday, funds will be available before 5:30am Pacific Time on Wednesday if it is not returned by the RDFI. However, if the effective date is a Thursday, funds will be available before 5:30am Pacific Time on the following Monday. Once a debit transfer settles, funds will be moved from pending_balance to available_balance, and available to withdraw immediately.

Flow of funds

Flow of funds


The effective date is different from the date on which the outgoing ACH debit will be marked as "Settled" in the Column Dashboard, and when you will receive the ach.outgoing_transfer.settled. The Settled event in the dashbaord timeline is triggered 2 business days after the effective date, and specifies when the funds move from pending_balance to available_balance.

States and Events

ACH is different than most other payments - you will not receive an explicit acknowledgement of success by the counterparty (except for some rare corporate payments). You find out the payment is successful by not receiving an error. If you receive an error, this is known as an ACH return.

There are generally two types of returns. The first type of returns are administrative returns (payment failures) - examples could be insufficient funds in the account you're trying to pull money from, the account number being wrong, or the account being closed. The counterparty (RDFI) has to send back administrative returns by the opening of business on the 2nd banking day following the effective date. If two business days from effective date has elapsed you know that the transfer was received and executed successfully. The second type of returns are unauthorized returns - examples could be fraud due to a stolen bank account or a consumer believing they were charged an incorrect amount. The counterparty (RDFI) has up to 60 calendar days from the effective date to say that a transfer was unauthorized.

In both return types, the money is automatically credited back to the sender, however, we make it easy for you to file a dispute to challenge those returns.

Below are the states and events that an outgoing transfer may go through.

StageWebhook EventDescription
Initiatedach.outgoing_transfer.initiatedColumn has received your ACH request and will submit it to the Federal Reserve at the next settlement window.
Manual Reviewach.outgoing_transfer.manual_reviewThe transfer is in manual review and will be evaluated by the Column team.
Submittedach.outgoing_transfer.submittedColumn has submitted the ACH to the Federal Reserve.
Settledach.outgoing_transfer.settledFor outgoing ACH debits this represents when funds are made available. For outgoing credits, this represents when the recipient should have access to funds.
Completedach.outgoing_transfer.completedThe 60 day return window has passed for this ACH transfer, and it is officially completed.
Returnedach.outgoing_transfer.returnedThe ACH transfer has been returned by the RDFI.
Dishonoredach.outgoing_transfer.return_dishonoredThe incoming ACH return has been dishonored by Column. Funds will be locked for ACH debit dishonored returns.
Dishonored Funds Unlockedach.outgoing_transfer.return_dishonored_funds_unlockedThe funds that were locked for the dishonored return have been unlocked.
Contestedach.outgoing_transfer.return_contestedThe dishonored return has been contested by the RDFI.
Canceledach.outgoing_transfer.canceledThe ACH transfer has been canceled per your request before it is submitted to the Federal Reserve.

Notifications of Change (NOC)

Notifications of Change are created by RDFIs to notify Column that previously valid information of counterparties have become outdated and should be changed. They usually occur when beneficiary banks of counterparties have merged or been bought by another bank, and they have changed the routing numbers or account numbers of counterparties.

Previous outgoing transfers with outdated information of counterparties have been processed by RDFIs. However, any future transfers to those counterparties should use the latest information from NOCs. When Column receives NOCs from RDFIs, counterparties of outgoing transfers will be updated with the latest information from NOCs automatically. In the meanwhile, we notify you via ach.outgoing_transfer.noc webhook events. NOC details are available in ach_transfer.notification_of_changes. Transfer statuses are not impacted by this type of events.

RDFI (Receiving ACH Payments)

When you create a bank account at Column via our Bank Account API, you have the ability to allow it to receive ACH payments. We give you full control and visibility over every aspect of incoming ACH transfers.

The moment when incoming ACH credit or debit transfer requests are received by Column for bank accounts in your platform, we immediately notify you via ach.incoming_transfer.scheduled webhook events. In the event payload, ach_transfer.effective_on specifies the effective date of an incoming ACH transfer. The receiver's bank account balances are not affected by a scheduled transfer until the effective date.

Incoming Credit ACH Transfers

At the beginning of the effective date of an incoming credit transfer request, we will process the scheduled credit transfer and post the credited amount to the receiver account. Funds are settled immediately and available to withdraw, and an ach.incoming_transfer.settled event is sent via webhook.

Incoming Debit ACH Transfers

From the beginning of the effective date of an incoming debit transfer request, we will process the scheduled debit transfer and try to settle it by deducting the requested amount from the receiver's bank account. If the available balance of the receiver's account is enough to cover the debited amount, the scheduled transfer will be settled immediately, and the balances of the receiver's account will be updated. An ach.incoming_transfer.settled event is sent to you via webhook as well.

If there are insufficient funds in the receiver's account, Column will automatically return the incoming debit request with R01 (insufficient funds) return code, and an ach.incoming_transfer.returned webhook event will be sent to you.

After an incoming debit transfer is settled, you can still return it by calling our ACH Return API. Please refer to ACH Returns for more details.

Note on Processing

When Column receives a batch of ACH transfers from the Fed, we will automatically process incoming credits before debits.

States and Events

Below are the states and events that an incoming transfer may go through.

StageWebhook EventDescription
Scheduledach.incoming_transfer.scheduledColumn has received an incoming ACH credit/debit transfer request, and it is scheduled to process it on its effective date.
Settledach.incoming_transfer.settledColumn has processed an incoming ACH credit/debit transfer request, and settled it successfully.
NSFach.incoming_transfer.nsfColumn attempted to process an incoming ACH credit/debit transfer request, but their were insufficient funds in the account. This is usually followed by a returned event.
Completedach.incoming_transfer.completed The return window has passed for this incoming ACH transfer, and it is deemed officially completed.
Returnedach.incoming_transfer.returnedThe incoming ACH transfer has been returned by Column.
Dishonoredach.incoming_transfer.returned_dishonoredThe outgoing ACH return has been returned by the RDFI.
Contestedach.incoming_transfer.return_contestedThe ACH return has been contested by Column.