Plaid logo
Docs
ALL DOCS

Transfer

  • Transfer Overview
  • Transfer Application
  • Creating transfers
  • Monitoring transfers
  • Plaid Ledger flow of funds
  • Transfer Dashboard
  • Refunds
  • Recurring transfers
  • Transfer UI
  • Platform Payments
  • Errors and troubleshooting
  • Testing in Sandbox
  • Legacy Flow of funds
Plaid logo
Docs
Close search modal
Ask Bill!
Ask Bill!
Hi! I'm Bill! You can ask me all about the Plaid API. Try asking questions like:
    Note: Bill isn't perfect. He's just a robot platypus that reads our docs for fun. You should treat his answers with the same healthy skepticism you might treat any other answer on the internet. This chat may be logged for quality and training purposes. Please don't send Bill any PII -- he's scared of intimacy. All chats with Bill are subject to Plaid's Privacy Policy.
    Plaid.com
    Log in
    Get API Keys
    Open nav

    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.

    Industry example of money movement.
    Industry example of money movement.

    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.

    Example schedule for a Same-Day ACH debit.
    Example schedule for a Same-Day ACH debit.
    Example schedule for a Standard ACH debit.
    Example schedule for a Standard ACH debit.

    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.

    Overview of state changes for an ACH return.
    Overview of state changes for an ACH return.
    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_ids 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.

    Overview of status and sweep status updates
    Overview of status and sweep status updates

    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:

    EntryAmountDate
    PLAID 6c036ea0 CCD-$5,264.62November 18, 2022
    PLAID ae42c210 CCD$2,367.80November 16, 2022
    PLAID 550c85fc CCD$6,007.49November 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_ids in that sweep.

    Select Language
    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.

    Select Language
    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}
    Was this helpful?
    Developer community
    GitHub
    GitHub
    Stack Overflow
    Stack Overflow
    YouTube
    YouTube
    Discord
    Discord