ACH overview

Create payments that directly involve external bank accounts using the Automated Clearing House (ACH) network.

Payment methods

Before initiating a transfer, you will need to set appropriate payment method types for debits (money in) and credits (money out).

Money in

Moov pulls funds into the Moov platform using ACH debits. ACH debits can be created using a payment method with one of the following types:

  • ach-debit-fund: Represents a “push” flow (for example, payout or disbursement, topping up a wallet)
  • ach-debit-collect: Represents the first stage of a “pull” flow (for example,collections or billing)
A bank account must be verified using instant micro-deposit verification, or one of Moov’s verification partners before it can be debited.

Money out

Funds leave the Moov platform with ACH credits. You can specify the processing speed using a payment method with one of the following types:

  • ach-credit-same-day: Payment is processed with “same-day” ACH processing
  • ach-credit-standard: Payment is processed with standard “next-day” ACH processing

Moov processes in all same-day windows listed below:

Processing speed Cutoff time Expected time posted to bank
Same-day window 1 10:00 AM ET Early afternoon
Same-day window 2 2:15 PM ET End of day
Same-day window 3 4:15 PM ET End of day
Standard 5:30 PM ET Next day
A source account will see Moov on their statement, and a destination account will see the source’s displayName on their bank statement. You can customize the name and description an account sees by using the achDetails fields. See the customized ACH statement descriptors section for more information.

ACH processing and holds

Moov offers both standard ACH processing and faster ACH processing. Three main factors determine the processing speed of a transfer:

  • The type of transfer (for example, bank-to-bank)
  • ACH payment method type (for example, ach-credit-same-day)
  • Cutoff times

For standard bank-to-bank transfers, Moov holds funds that enter the platform via an ACH debit for two to three banking days before making the funds available, even when using “same-day” processing. The purpose of the hold is to account for the lag in time it takes to hear back about returns or processing issues.

For faster bank-to-bank transfers, Moov removes the hold on ACH debits. The ACH credit process starts within hours of the transfer being initiated, allowing for transfers to fully complete within one day as long as the transfer is initiated before certain cutoff times. Accounts must be approved by Moov to use faster ACH processing.

ACH payments are processed in batches and must be uploaded to Moov’s partner financial institutions before certain cutoff times. See the processing speed document for more information on processing speed, cutoff timetables, and examples of transfer timelines.

For information on how to see transfer details and status information, see the ACH details document.

Transfer limits

The current limit for ACH transfers with Moov is $100,000. The Moov team must qualify each customer for any exceptions to these limits. If you have a question with regards to your account’s specific limits, please connect with your Moov account manager.

Customized ACH statement descriptors

You have the option to override the default Nacha file entries that appear on bank statements. To do this, set custom ACH statement descriptors when creating a transfer. Use the following fields on the source, destination, or both, to provide more clarity or context for an individual transfer:

  • achDetails.companyEntryDescription: Describe the purpose of the transaction
  • achDetails.originatingCompanyName: Set the name how you’d like it to appear on the statement

Customizing these fields on the source will update the information on the bank statement where the debit occurs. Customizing these fields on the destination will update the information on the bank statement where the credit occurs.

For example, in a transfer where the source and destination are the same Moov account, your account’s ACH company name would be used as the default originating company name unless a customization was set. The example below sets custom descriptors for both the source and destination.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
curl -X POST "https://api.moov.io/transfers" \
  -H "Authorization: Bearer {token}" \
  -H "X-Idempotency-Key: UUID" \
  -H "X-Wait-For: rail-response" \
  --data-raw '{
    "amount": {
      "value": 100,
      "currency": "USD"
    },
    "destination": {
      "paymentMethodID": "UUID",
      "achDetails": {
        "companyEntryDescription" : "Gym dues",
        "originatingCompanyName" : "Whole Body Fit"
      }
    },
    "source": {
      "paymentMethodID": "UUID",
      "achDetails": {
        "companyEntryDescription" : "Gym dues",
        "originatingCompanyName" : "Whole Body Fit"
      }
    }
  }'\
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
mc, _ := moov.NewClient()

mc.CreateTransfer(ctx, moov.CreateTransfer{
  Amount: moov.Amount{
    Currency: "usd",
    Value:    100, // $1.00
  },
  Destination: moov.CreateTransfer_Destination{
    PaymentMethodID: "UUID",
    AchDetails: &moov.CreateTransfer_AchDetailsBase{
      CompanyEntryDescription : "Gym dues",
      OriginatingCompanyName : "Whole Body Fit",
    },
  },
  Source: moov.CreateTransfer_Source{
    PaymentMethodID: "UUID",
    AchDetails: &moov.CreateTransfer_AchDetailsSource{
      CompanyEntryDescription : "Gym dues",
      OriginatingCompanyName : "Whole Body Fit",
    },
  },
})
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
const moov = new Moov(credentialsObject);

const transfer = await moov.transfers.create({
  amount: {
    value: 100,
    currency: "USD"
  },
  destination: {
    paymentMethodID: "UUID",
    achDetails: {
      companyEntryDescription : "Gym dues",
      originatingCompanyName : "Whole Body Fit"
    }
  },
  source: {
    paymentMethodID: "UUID",
    achDetails: {
      companyEntryDescription : "Gym dues",
      originatingCompanyName : "Whole Body Fit"
    }
  }
});

SEC codes

You have the option of specifying an SEC code in certain ACH transfer request scenarios. If none is provided, Moov will handle the SEC code on your behalf.

SEC code Authorization type Description
CCD         Corporate credit or debit An ACH debit between two business accounts, such as vendor payments or funding payroll.
PPD Prearranged payment and deposit An ACH transaction involving an individual account to make or collect a payment.
WEB Internet initiated/mobile entries Moov allows WEB transactions for debit entries from an individual to a business account. Authorization is obtained via the internet or a wireless network (not including oral authorization over a telephone).
TEL Telephone initiated entries An ACH debit from an individual to a business account with authorization obtained orally through a telephone, and recorded. See Nacha’s TEL guidance for use-cases and authorization requirements.

Individual to business transactions

You have the option of specifying an SEC code on an ACH transaction that has an individual account as the source and a business account as the destination. The following SEC codes can be provided in source.achDetails when making a transfer POST request: WEB, TEL, PPD. If no SEC code is provided, the SEC code will be set as WEB.

Other transaction scenarios

If the source and destination of an ACH transaction are both business accounts, the SEC code will be set as CCD. If the source is a business account and the destination is an individual account, the SEC code will be set as PPD.

Summary Beta