Transfer's Legacy Flow of Funds
Understand how the Transfer legacy funds flow moves money
This page applies only to customers who are not using Plaid Ledger. To request access to Plaid Ledger, contact your Account Manager or file a support ticket via the Dashboard.
Money movement in the US
To understand the Transfer legacy flow of funds, it's important to understand how money functionally moves in the United States. Let's take the following example: Alice's Donut shop (at "Plaidypus First National Bank") wants to receive a $10 payment from Bob (at "Plaidypus Second National Bank").
In this example, it would be simplest if Plaid Transfer could just tell "Plaidypus Second National Bank" to send $10 from Bob's account directly to "Alice's Donut shop" account at "Plaidypus First National Bank". However, this is not possible in the American banking system today. ACH processors cannot tell arbitrary banks to send money to other arbitrary banks.
Instead, Plaid must withdraw $10 from Bob's account at "Plaidypus Second National Bank." Once that succeeds, Plaid can then send $10 to Alice's Donut Shop at "Plaidypus First National Bank." In other words, Plaid must sit in the middle of the process.
Receiving payments
Issuing ACH debits to your customers
In order to receive payments from your customers, you will create a transfer with type=debit
. The status
property of this transfer will be pending
until the transfer is relayed to the payment network to pull funds from your customer, at which point it becomes posted
and emits a corresponding event. From there, the status will transition to settled
via the schedule defined by the Federal Reserve, signaling to you that the settlement window has begun. At this point, it is generally safe to assume the ACH debit has shown up as pending in the user's bank account.
Receiving incoming funds to your bank account
Once a transfer status is transitioned to settled
, Plaid begins the clock for a 5 business day internal hold period. This hold period mitigates your risk and ensures money is available to pay for any incoming returns. At the end of the hold period, the funds become eligible to be included in a payout sweep. Reducing this 5 day hold period requires additional due diligence and reserves to be held with Plaid; for more details, contact your Plaid Account Manager.
Your daily payout will be the sum total of debits whose hold time has elapsed, minus any funds that need to be sent back to the network (such as refunds you issued or ACH returns received that day).
Note that if the daily payout amount calculation results in a negative value (i.e. the sum of funds that need to be returned to the network is greater than the sum total of debits whose hold time has elapsed), Plaid will attempt to pull funds from your business checking account instead of depositing funds.
Handling returns
If a transfer experiences a return before the funds were released to you via a payout sweep, then the status of the transfer will transition to returned
and the sweep_status
will stay unswept
. If a return is encountered after the funds have already been swept, the funds will be taken back, and the sweep_status
will be transitioned to returned_swept
.
Issuing payouts to your customers
When calling /transfer/authorization/create
, provide the funding_account_id
of the business checking account you'd like to use. You can find your list of funding_account_id
s in the Accounts page of your Plaid Dashboard under the Account ID column.
When you call /transfer/authorization/create
with type=credit
and a funding_account_id
defined, the transfer will be created with status=pending
and sweep_status=unswept
. When using the legacy flow of funds method, you must specify ach
as the payment rail for these transfers; Same Day ACH and RTP payouts are only supported with Plaid Ledger.
At the end of each business day (at 3:30pm EST time for Same-Day Transfers, or 5:30pm EST for standard ACH transfers), Plaid will sum up all ACH credit transfers you created that day and issue a sweep to the specified funding_account_id
in order to withdraw funds from your business checking account. This action will move the sweep_status
to be swept
and emit a corresponding event.
The amount that will be withdrawn from your account is calculated as the sum of ACH credits initiated before the business day cutoff, minus the ACH returns received that day. If the sum of the returns are greater than the amount needing to be withdrawn, Plaid will issue an ACH Credit sweep to your business checking account for the difference.
These funds will then be held for 3 business days to reduce risk of returns on the withdrawal. At the end of the last day of the 3 day hold period, Plaid will issue an ACH credit to the payment network in order to initiate a payout to your customer. This will move the status to be posted and emit a corresponding event.
If the transfer is returned (for example, due to the customer's bank account being closed), the funds will automatically be returned to you.
You must ensure that your accounting department does not reject these withdrawals from Plaid. Contact your bank to ensure you accept incoming ACH debits from the following company or Originator ID: 1460820571. If the withdrawals are rejected, Plaid may cancel your credit transfers.
Transfer event monitoring
Plaid creates a transfer event any time the transfer.status
or transfer.sweep_status
changes. For example, when a transfer is sent to the payment network, the transfer.status
moves to posted
and a posted
event is emitted. Likewise, when an ACH return is received, a returned
event will be emitted as the transfer.status
is updated. By monitoring transfer events, you can stay informed about their current status and notify customers in case of a canceled or returned transfer. When a transfer gets settled, you can alert customers or release goods and services.
There are two types of statuses: transfer.status
and transfer.sweep_status
. transfer.status
indicates the transfer's movement through the network from your consumer's perspective. transfer.sweep_status
reflects whether Plaid has swept the amount to your own business account (if this is a debit, this means depositing funds to your final account; in case of a credit, this means collecting funds from your final account).
The transfer status settled
indicates that the funds have either been taken from or arrived into the customer account. Similarly, the sweep status swept_settled
indicates that the funds have arrived into or been taken from your account. You can view the events fired for a given transfer in the dashboard under a transfer's "Activity Log" in the Dashboard.
Reconciling transfers with sweeps to/from bank account
As Plaid moves money in and out of your business account as you process transfers, you might want to match the account activity in your bank account with the associated transfers.
Plaid will deposit or draw money from your business checking account in the form of a sweep. This means that any time you are interacting with your bank statement, you are viewing sweeps, not specific transfers.
To match a sweep in your bank account to the set of transfers included in that sweep, Plaid ensures the first 8 characters of the sweep's sweep_id
will show up on your bank statements. For example, consider the following entries in your bank account from Plaid:
Entry | Amount | Date |
---|---|---|
PLAID 6c036ea0 CCD | -$5,264.62 | November 18, 2022 |
PLAID ae42c210 CCD | $2,367.80 | November 16, 2022 |
PLAID 550c85fc CCD | $6,007.49 | November 10, 2022 |
You can use this 8 character string from your bank statement to search for the sweep in your Plaid Transfer dashboard. On your dashboard, you can view the sweep details as well as the associated transfers in that sweep.
You can also do the same lookup via API. Once you identify and isolate the sweep prefix (such as 6c036ea0
), pass it to /transfer/sweep/list
to obtain the full sweep_id
, then use that sweep_id
to query /transfer/event/list
and retrieve all the associated transfer_id
s in that sweep.
1curl -X POST https://production.plaid.com/transfer/sweep/list \2 -H 'Content-Type: application/json' \3 -d '{4 "sweep_id": "6c036ea0"5 }'
1{2 "sweeps": [3 {4 "id": "6c036ea0-911a-43e8-9848-ba531d6dc39a",5 "amount": "-5264.62",6 "created": "2022-11-18T07:10.824Z"7 },8 ],9 "request_id": "saKrIBuEB9qJZno"10}
Now, take the sweep_id
and find all transfers bundled into that sweep.
1curl -X POST https://production.plaid.com/transfer/event/list \2 -H 'content-type: application/json' \3 -d '{4 "sweep_id": "6c036ea0-911a-43e8-9848-ba531d6dc39a"5 }'
1{2 "transfer_events": [3 {4 "account_id": "AgbZBPQPWwT15dZnyEzLs1dLWlK4XrF1awz1m",5 "event_id": "1002",6 "event_type": "swept",7 "sweep_amount": "5.00",8 "sweep_id": "6c036ea0-911a-43e8-9848-ba531d6dc39a",9 "timestamp": "2022-11-18T02:25.436Z",10 "transfer_amount": "5.00",11 "transfer_id": "a574f217-6963-49d3-84f3-c3b83975ced5",12 "transfer_type": "debit"13 },14 {15 "account_id": "vQJblmka1Vt5pabdlZnmHwG4RpV5VMhWlLrXm",16 "event_id": "1001",17 "event_type": "return_swept",18 "sweep_amount": "-2348.00",19 "sweep_id": "6c036ea0-911a-43e8-9848-ba531d6dc39a",20 "timestamp": "2022-11-18T02:25.436Z",21 "transfer_amount": "2348.00",22 "transfer_id": "945bcfaf-3047-4b98-b4f6-f96dfa63fae2",23 "transfer_type": "debit"24 },25 ...26 ],27 "request_id": "saKrIBuEB9qJZno"28}