ACH Money Movement
The ACH system is a federally regulated electronic network for financial payments in the United States. You can use ACH to move money between banks using an account number and bank routing number. Common examples include transfers between accounts, and electronic payments such as direct deposit for salaries, bill pay, or tax refunds.
ACH transaction speeds
There are two speeds for ACH, standard and same-day. You are able to set the speed in your Initiate ACH Transfer Request API call. Consult your Productfy pricing schedule to understand the differences in prices between the two.
ACH transactions are sent daily to Productfy’s partner banks for processing. The following table summarizes ACH cutoff times for requests to get to Productfy, and when they will settle. This gives Productfy enough time to generate the ACH file and get it processed by our bank partner. Files missing the cutoff time or not marked for same-day processing are processed as standard files. All times are shown in Pacific Standard Time, and files are only processed on business days (Mon.-Fri., and not on Federal Reserve holidays).
|Processing Eligibility||ACH Cutoff (business days)||When ACH Files are Settled (business days)|
|Same Day||6:30AM PST||2:00PM PST|
|Same Day||8:30AM PST||3:00PM PST|
|Standard||12:30PM PST||Next Day|
Types of money movement
Use Productfy with ACH integration to set up your own electronic transfer of funds in the following ways:
- Move money between a bank and a Productfy virtual account that holds your customers funds.
- Move money between two third-party banks.
Move money between a bank and a Productfy virtual account
Productfy virtual accounts allow your customers to store money in an account that lives on the Productfy system and is backed by our banking partner. ACH allows you to move money into and out of the virtual account.
Move money between two third party banks
You can also use ACH to move money between two third party banks, as shown in the following example. This two-leg ACH transaction pulls money from one bank and pushes the funds to a second bank:
Get help from Productfy if you need it, and make sure you disclose terms and conditions for your users.
Send an email to Productfy support if you need help at any time while configuring ACH integration.
ACH disclosures and compliance
See our Compliance Guide for sample disclosures and requirements for your app to be in compliance.
ACH transaction limits
Productfy enforces limits on ACH transfers initiated via our ACH APIs to control for risk. We do NOT enforce limits on incoming ACH transfers originated at other banks (e.g. direct deposit transactions). Here are some specifics about how these limits work:
- Consumer limits apply to ACH transfers initiated by Person IDs on Productfy, Business limits apply to ACH transfers initiated by Organization IDs on Productfy.
- Limits apply at the customer-level (Person ID or OrganizationID) regardless of how many virtual accounts they have.
- Limits apply to both ACH debits and credits, in other words, we look at the absolute value of all ACH activity and compare that against the limit.
- Daily limits look at activity from 12:00 AM PST to 11:59:59 PM PST every day.
- If a transfer puts a customer over the limit, the API will return an error in real-time. In other words, the ACH request will not even be created if it is over the limit.
Standard ACH transaction limits are as follows:
|Account Type||Daily Limits||30-day Rolling Limit|
|Consumer||$5k per day per Person ID||$10k per rolling 30 days|
|Business||$100k per day per Organization ID||$1 million per rolling 30 days|
Step 1 - Initiate ACH transfer
Once a user’s external bank account is linked you are ready to initiate ACH transfers. See the Account Linking guide for account linking instructions.
Present the user with input boxes to enter the following information:
- Account they are transferring money from
- Account they are transferring money to
- Amount of money being transferred
For transfers between external bank accounts and Productfy virtual accounts:
Call the Initiate Funds Transfer API to submit the ACH transfer request. The API will automatically create the transaction on the virtual account, and transition it from pending to settled status.
For transfers between two external bank accounts (2-leg ACH):
Call the Initiate ACH Transfer API to submit the ACH transfer request. The fundsFlow field will dictate whether you are creating a 2-legged ACH transfer (between two externally-linked accounts), or a 1-leg ACH (with your tenant operating account).
When the form is submitted, an ACH file is created and sent to Productfy’s bank partner for processing. See ACH transaction speeds for information about when ACH files are generated, processed, and settled.
If you are testing in a test environment, any transfers where the last non-zero digit is an odd number (ex. 1, 2.21, 10, 20.01) will end in a failed ACH state whereas if the last non-zero digit is an even number (ex. 2, 1.02, 5.12) will succeed. This only occurs in simulation mode and only after the normal validation rules are applied.
Step 2 - Display and Store ACH Authorization
To abide by ACH regulations, be sure to display the following ACH/EFT disclosures on the screen where customers are initiating 1-time ACH transactions:
By pressing the “accept and complete” button below, I hereby authorize [Fintech partner legal name] (Fintech partner name if different) to initiate an ACH transfer from the account listed above. I certify that I am authorized to initiate this transfer and that it complies with applicable laws. This authorization is to remain in full force and effect until I notify [Fintech partner name] at [Insert contact email] that I wish to revoke it. I understand that [Fintech partner name] must be provided sufficient time to have a reasonable opportunity to act upon my notice to revoke this authorization.
If you have built the mechanism to send recurring or future-dated ACH transactions to Productfy, you’ll need to include the text below on the screen where your customers first create these transactions. Additionally, the log of the customer ‘accepting’ this text must be submitted to Productfy (see Tracking Disclosure Data for more info).
By pressing the “accept and complete” button below, I hereby authorize [Fintech partner legal name] (Fintech partner name if different) to initiate an ACH transfer from the account listed above. I certify that I am authorized to initiate this transfer and that it complies with applicable laws. This authorization is to remain in full force and effect until I notify [Fintech partner name] at [Insert contact email] that I wish to revoke it. I understand that [Fintech partner name] must be provided sufficient time to have a reasonable opportunity to act upon my notice to revoke this authorization. I understand that this authorization will remain in full force and effect until I notify FINTECH PARTNER NAME by email that I wish to revoke this authorization. I understand that FINTECH PARTNER NAME requires at least three (3) days prior notice in order to cancel this authorization.
Additionally, bank auditors require that Productfy store record of customers accepting the ACH authorization language above at the time the transfer is initiated. There is a disclosureAcceptance object within the Initiate Funds Transfer or Initiate ACH Transfer APIs with the following fields that need to be filled out:
|acceptanceTime||The current date/time (in PST)|
|disclosureId||Enter ‘ACH’ for the ACH authorization|
|disclosureType||The disclosure type associated with the disclosure ID|
|ipAddress||The IP address of the customer|
|organizationId or personId||The ID associated with the organization or person on Productfy|
Step 3 - Monitor ACH request status
Listen to Productfy's ACH webhooks to stay informed on the status of an ACH transfer.
ACH transfer requests can have the following states:
- When an ACH transfer request is first created, its status is CREATED ("C").
- The ACH transfer then goes through a series of validation checks and watchlists and is assigned a status of VALIDATION_FAILED ("VF") or VALIDATION_SUCCESSFUL ("VS") depending on the outcome of the validation checks.
- If the ACH transfer passes the validation checks, a NACHA file is created and submitted to the originating bank for processing. At this point, the ACH transfer is assigned the status SUBMITTED_TO_FINANCIAL_INSTITUTION ("SI"). Once the ACH transfer is in the "SI" status, the window for canceling the ACH transfer is closed.
- If the transfer is not returned by the bank within 2 business days, it is automatically moved to a status of COMPLETED_SUCCESSFULLY (“S”). If the ACH transfer was returned by the bank for any reason, it is assigned the status FAILED ("F").
Note that in some cases, an ACH request could initially be marked as “COMPLETED_SUCCESSFULLY” but later changed to “FAILED”. For example, the ACH transfer could be returned if it was reported as unauthorized within 60 days from the initial settlement date.
For a 2-legged ACH transfer, Productfy will begin the second leg of the ACH transfer once the first leg moves to COMPLETED_SUCCESSFULLY status (usually within 2 business days).
If a submitted ACH gets returned by the receiving bank, Productfy will trigger the ACH Transfer Failed webhook.
For a 2-legged ACH, if the first leg is returned, Productfy will not initiate the second leg. If the second leg gets returned, a webhook will be triggered and Productfy will reverse the first leg of the transaction.
To check on the status of a submitted ACH transaction, call the
Get ACH Transfer Requests API.
To view the rules that may cause an ACH transaction to fail, pass in the parameter
achTransferRequestIds and ask for
approvalRuleEvaluationResults in the response returns to display all the details pertaining to the failure.
Step 4 - View transfers
View Virtual Account transactions
For clients using Productfy Virtual Accounts, you can display transactions (from step 3) on the account by using our general-purpose Finsight Proflie API.
View ACH transfer requests
For clients wanting to show users a list of their ACH requests and the status, use the Retrieve ACH Transfer Requests API.
Step 5 - View ACH data
You can monitor your ACH activity through the ACH Transfers Report link on your client portal.
Step 6 - ACH Certification
During your implementation project with Productfy, you will be required to go through a certification phase to ensure your app is working correctly end-to-end with the Productfy system for both successful and error scenarios.
For each test scenario below you will need to be prepared to gather the following information and provide it to us:
- Transaction ID
- Date and time
- Descriptions of the tests being performed (i.e.. MDV, account funding (ACH), etc.)
- Documentation (screenshots should be sufficient) substantiating you can view ACH status information and ACH transfers for the end-user
ACH Test Cases
The following test cases must be performed and verified before we can consider ACH Certification completed and move you into Alpha.
- Multi-Factor Authentication - Ensure that you have implemented a MFA solution in your app.
- MDV (Micro Deposit Verification) - We need to test the function of MDV in the event IAV (Instant Account Verification) is not available or fails.
- Account Funding - From your end-user perspective, an ACH transaction would be initiated to move money to the customers account from an external linked account (with funds settling in your FBO account)
- Account Withdrawal - From your end-user perspective, an ACH transaction would be initiated to move money from their account to their externally linked bank account (funds movement from FBO to external account).
- Returned ACH - From your end-user perspective, you will need to initiate an ACH transfer that you know will be returned (this is similar to a check being returned or bouncing). Triggering an NSF (R01) or Stop Payment (R08) are the two best scenarios. This will ensure the end to end flow between your application, Productfy, the bank partner and the FED is working correctly, as well as to ensure you can see returns reflected in your tenant portal (ACH Return Summary) and that the metrics are reported correctly.
- Same-Day ACH - If you intend to support and provide your customers with a same-day ACH, we need a test initiated to confirm the configuration within your application and verify the resulting transaction is produced within the appropriate time window.