> ## Documentation Index
> Fetch the complete documentation index at: https://developers.dwolla.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Transfer Money Me-to-Me

> Move funds between two different bank accounts belonging to a single Verified Customer, e.g. for savings applications that move funds between a Customer's checking and savings accounts.

## Overview

This guide is designed to get you up and running quickly through creating a bank to bank transfer between a verified Customer's two bank accounts. In this guide we'll cover the basics of integrating this payment flow by walking through the steps needed to onboard your end user as a verified Customer and create the bank to bank transfer.

<img src="https://mintcdn.com/dwolla/C9LuhBlLWlq2MFvM/assets/images/content-images/funds-flow-me-to-me.gif?s=c661db713b49d683c3a960f8f058f72c" alt="Funds Flow Me-to-Me" width="1750" height="900" data-path="assets/images/content-images/funds-flow-me-to-me.gif" />

In this quickstart guide, you'll learn the key concepts involved with sending money between a Customer's bank accounts.

<Steps>
  <Step title="Choose a Customer type and create a verified Customer record">
    Select the appropriate Customer type and create a verified Customer in your application.
  </Step>

  <Step title="Attach a source and destination funding source to the Customer record">
    Link both a source and a destination bank account to the Customer's profile for account-to-account transfers.
  </Step>

  <Step title="Fetch the available funding sources">
    Retrieve the list of all funding sources associated with the Customer.
  </Step>

  <Step title="Send funds from the Customer's checking account to the Customer's savings account">
    Initiate a transfer from the Customer's checking account to their savings account using the Dwolla API.
  </Step>
</Steps>

## Before you begin

We encourage you to create a <Tooltip tip="A testing environment that mimics the production environment but uses test data instead of real money">Sandbox</Tooltip> account, if you haven't already. This will allow you to follow along with the steps outlined in this guide. Check out our [Sandbox guide](/docs/testing) to learn more.

After creating a sandbox account, you'll obtain your API Key and Secret, which are used to obtain an OAuth access token. An access token is required in order to authenticate against the Dwolla API. Learn more about how to [obtain an access token in our guide](/docs/auth/).

Lastly, in this sandbox walkthrough, we recommend having an active webhook subscription. This will help notify your application of various events that occur within Dwolla. [Check out our guide to learn more](/docs/working-with-webhooks).

**Let's get started!**

# Step 1 - Creating your Customer

#### Choose the Customer Type for Your Funds Flow

Before your end user can send or receive funds to their connected bank account, they must be created as a Customer via the Dwolla API. With this funds flow, however, the only eligible Customer types are:

* Verified Personal Customers
* Verified Business Customers

To learn more on the differences between personal and business verified Customers and the capabilities of each, [check out our developer resource article.](/docs/customer-types)

<Info>
  Verified Customers must go through the identity verification process and have
  a <code>verified</code> status in order to be eligible to transact. In order
  to verify the identity of the individual or business creating a Dwolla
  Customer account, you will need to pass information including, but not limited
  to, social security number (SSN), address, date of birth, and/or Employer
  Identification Number (EIN).
</Info>

### Create the Customer

While both the Personal and Business verified Customer types are valid in this funds flow, we will be creating a Personal verified Customer in this guide.

##### Request Parameters - Personal Verified Customer

| Parameter   | Required | Type   | Description                                                                          |
| ----------- | -------- | ------ | ------------------------------------------------------------------------------------ |
| firstName   | yes      | string | Individual's legal first name.                                                       |
| lastName    | yes      | string | Individual's legal last name.                                                        |
| email       | yes      | string | Customer's email address.                                                            |
| type        | yes      | string | Type of identity verified Customer. Value of `personal` for individual.              |
| address1    | yes      | string | Street number, street name of individual's physical address.                         |
| address2    | no       | string | Apartment, floor, suite, bldg # of individual's physical address.                    |
| city        | yes      | string | City of individual's physical address.                                               |
| state       | yes      | string | Two-letter US state or territory abbreviation code of individual's physical address. |
| postalCode  | yes      | string | Customer's US five-digit ZIP or ZIP + 4 code.                                        |
| dateOfBirth | yes      | string | Customer's date of birth. Must be 18 years of age with format of `YYYY-MM-DD`.       |
| ssn         | yes      | string | Last four-digits of individual's social security number.                             |

##### Request and response

<CodeGroup>
  ```bash HTTP theme={"dark"}
  POST https://api-sandbox.dwolla.com/customers
  Content-Type: application/vnd.dwolla.v1.hal+json
  Accept: application/vnd.dwolla.v1.hal+json
  Authorization: Bearer pBA9fVDBEyYZCEsLf/wKehyh1RTpzjUj5KzIRfDi0wKTii7DqY

  {
    "firstName": "John",
    "lastName": "Doe",
    "email": "johndoe@nomail.net",
    "ipAddress": "10.10.10.10",
    "type": "personal",
    "address1": "99-99 33rd St",
    "city": "Some City",
    "state": "NY",
    "postalCode": "11101",
    "dateOfBirth": "1970-01-01",
    "ssn": "1234"
  }

  HTTP/1.1 201 Created
  Location: https://api.dwolla.com/customers/FC451A7A-AE30-4404-AB95-E3553FCD733F
  ```

  ```php create_personal_verified_customer.php theme={"dark"}
  <?php
  $customersApi = new DwollaSwagger\CustomersApi($apiClient);

  $customer = $customersApi->create([
    'firstName' => 'John',
    'lastName' => 'Doe',
    'email' => 'jdoe@nomail.net',
    'type' => 'personal',
    'address1' => '99-99 33rd St',
    'city' => 'Some City',
    'state' => 'NY',
    'postalCode' => '11101',
    'dateOfBirth' => '1970-01-01',

    # For the first attempt, only the
    # last 4 digits of SSN required

    # If the entire SSN is provided,
    # it will still be accepted
    'ssn' => '1234'
  ]);

  $customer; # => "https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C"
  ?>
  ```

  ```ruby create_personal_verified_customer.rb theme={"dark"}
  # Using DwollaV2 - https://github.com/Dwolla/dwolla-v2-ruby
  request_body = {
    :firstName => 'John',
    :lastName => 'Doe',
    :email => 'jdoe@nomail.net',
    :type => 'personal',
    :address1 => '99-99 33rd St',
    :city => 'Some City',
    :state => 'NY',
    :postalCode => '11101',
    :dateOfBirth => '1970-01-01',

    # For the first attempt, only the
    # last 4 digits of SSN required

    # If the entire SSN is provided,
    # it will still be accepted

    :ssn => '1234'
  }

  customer = app_token.post "customers", request_body
  customer.response_headers[:location] # => "https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C"
  ```

  ```python create_personal_verified_customer.py theme={"dark"}
  # Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python
  request_body = {
    'firstName': 'John',
    'lastName': 'Doe',
    'email': 'jdoe@nomail.net',
    'type': 'personal',
    'address1': '99-99 33rd St',
    'city': 'Some City',
    'state': 'NY',
    'postalCode': '11101',
    'dateOfBirth': '1970-01-01',
    # For the first attempt, only the
    # last 4 digits of SSN required
    # If the entire SSN is provided,
    # it will still be accepted
    'ssn': '1234'
  }

  customer = app_token.post('customers', request_body)
  customer.headers['location'] # => 'https://api-sandbox.dwolla.com/customers/AB443D36-3757-44C1-A1B4-29727FB3111C'
  ```

  ```javascript create_personal_verified_customer.js theme={"dark"}
  var requestBody = {
    firstName: "John",
    lastName: "Doe",
    email: "jdoe@nomail.net",
    type: "personal",
    address1: "99-99 33rd St",
    city: "Some City",
    state: "NY",
    postalCode: "11101",
    dateOfBirth: "1970-01-01",
    // For the first attempt, only the
    // last 4 digits of SSN required
    // If the entire SSN is provided,
    // it will still be accepted
    ssn: "1234",
  };

  dwolla
    .post("customers", requestBody)
    .then((res) => res.headers.get("location")); // => 'https://api-sandbox.dwolla.com/customers/FC451A7A-AE30-4404-AB95-E3553FCD733F'
  ```
</CodeGroup>

When the Customer is successfully created on your application, you will receive a `201` HTTP response with an empty response body. You can reference the Location header to retrieve a link that represents the created Customer resource. We recommend storing the full URL for future use, as it will be needed for actions such as attaching a bank or correlating <Tooltip tip="Webhooks are automated notifications sent to your application when specific events occur in the Dwolla system">webhooks</Tooltip> that are triggered for the user in the Dwolla system.

<Info>
  Providing the IP address of the end user accessing your application as the
  <code>ipAddress</code> parameter. This enhances fraud detection and tracking.
</Info>

### Handle Webhooks

If you have an active webhook subscription, you will receive the `customer_created` and `customer_verified` webhook immediately after the resource has been created.

### Additional expected behavior

#### Customer Statuses

Not all Customers will have a `verified` status upon initial Customer creation. In production, you may run into an instance where more information is needed from your end user in order for Dwolla to fully verify their identity. Other statuses your Customer may be placed in include, `retry`, `document`, `deactivated`, or `suspended`. For more information on these statuses, refer to our developer resource article.

#### Balance Funding Source

On successful Customer verification, Dwolla will also create a [Balance Funding Source](/docs/balance-funding-source) for this Customer.

<Info>
  There are two types of Funding Sources available within the Dwolla Platform
  which include a bank or a balance. A bank account is commonly used as the
  source or destination for ACH transfers. A <code>balance</code> is a Funding
  Source that can be utilized like a "wallet" for holding a stored value of
  funds. The Dwolla balance is made available for Customers that have fully
  <code>verified</code> their identity within Dwolla.
</Info>

# Step 2 - Adding Funding Sources

Within Dwolla, the sending party must always verify their bank account in order to be eligible to create a transfer.

#### Bank Addition and Verification Methods

There are multiple ways of adding a bank to a Customer with the Dwolla API. A simplified table below outlines the similarities and differences of each method.

| Bank Addition Method                                       | Will the bank be verified?    | Required Information            |
| ---------------------------------------------------------- | ----------------------------- | ------------------------------- |
| API - Account & Routing Number                             | Optional - With Microdeposits | Bank Account and Routing Number |
| [Dwolla + Open Banking](/docs/open-banking#overview)       | Yes                           | Online banking credentials      |
| [Drop-in components](/docs/drop-in-components)             | Optional - With Microdeposits | Bank Account and Routing Number |
| [Dwolla + Secure Exchange solution](/docs/secure-exchange) | Yes                           | Online banking credentials      |
| Other Approved Third-party Provider                        | Yes                           | Variable                        |

<Info>
  For more information on securely submitting a user's bank details directly to
  Dwolla from the client-side of your application, reference our
  <a href="/docs/drop-in-components#create-a-funding-source">Drop-in components
  </a>.
</Info>

### Add a Bank to a Verified Personal Customer

In this step, we will create and attach a verified funding source to your Customer using Dwolla's Open Banking solution with Plaid, a leading Open Banking service provider that Dwolla partners with. This method will give your Customers the ability to add and verify their bank account in a matter of seconds by authenticating using their online banking credentials.

Once your Customer reaches the page in your application to add a bank account, you will use Open Banking with Plaid to authenticate the user's bank account. This involves initiating an <Tooltip tip="A secure session created to facilitate the exchange of data between Dwolla and a third-party provider">Exchange Session</Tooltip> with Dwolla, guiding the user through the verification process with their bank, and then using the <Tooltip tip="A secure method of exchanging data between Dwolla and a third-party provider">Exchange</Tooltip> details to create a funding source in Dwolla.

To integrate Open Banking with Plaid, we recommend checking out our [integration guide](/docs/open-banking/plaid). Additionally, if you would like to see a working example that verifies a bank using Open Banking with Plaid and attaches it as a verified funding source to a Dwolla Customer, please check out our [open-banking/plaid](https://github.com/Dwolla/integration-examples/tree/main/packages/open-banking/plaid) integration example on our GitHub profile.

<Card title="Step-by-step guide on implementing Open Banking with Plaid" icon="book-open" href="/docs/open-banking/plaid" />

### Handle Webhooks

If you have an active webhook subscription, you should receive both the `customer_funding_source_added` and `customer_funding_source_verified` <Tooltip tip="Webhooks are automated notifications sent to your application when specific events occur in the Dwolla system">webhooks</Tooltip> immediately following the request to Dwolla to add a funding source using Open Banking.

### Add a Savings Account

Once you have implemented Dwolla's Open Banking solution with Plaid, and you have attached a customer's `checking` account, you will want to repeat the same steps outlined above to add the customer's `savings` account as a funding source as well.

# Step 3 - Retrieve Funding Sources

In order to find your Customer's available bank and balance funding sources, you will need to first retrieve the funding sources from your Customer, via the API.

##### Request and response

<CodeGroup>
  ```bash HTTP [expandable] theme={"dark"}
  GET https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733/funding-sources
  Accept: application/vnd.dwolla.v1.hal+json
  Authorization: Bearer pBA9fVDBEyYZCEsLf/wKehyh1RTpzjUj5KzIRfDi0wKTii7DqY
  ...

  {
    "_links": {
      "self": {
        "href": "https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733/funding-sources"
      },
      "customer": {
        "href": "https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733"
      }
    },
    "_embedded": {
      "funding-sources": [
        {
          "_links": {
            "self": {
              "href": "https://api-sandbox.dwolla.com/funding-sources/ab9cd5de-9435-47af-96fb-8d2fa5db51e8"
            },
            "customer": {
              "href": "https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733"
            },
            "with-available-balance": {
              "href": "https://api-sandbox.dwolla.com/funding-sources/ab9cd5de-9435-47af-96fb-8d2fa5db51e8"
            }
          },
          "id": "ab9cd5de-9435-47af-96fb-8d2fa5db51e8",
          "status": "verified",
          "type": "balance",
          "name": "Balance",
          "created": "2015-10-02T21:00:28.153Z",
          "removed": false,
          "channels": []
        },
        {
          "_links": {
            "self": {
              "href": "https://api-sandbox.dwolla.com/funding-sources/98c209d3-02d6-4bee-bc0f-61e18acf0e33"
            },
            "customer": {
              "href": "https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733"
            }
          },
          "id": "98c209d3-02d6-4bee-bc0f-61e18acf0e33",
          "status": "verified",
          "type": "bank",
          "bankAccountType": "checking",
          "name": "Jane Doe's Checking",
          "created": "2015-10-02T22:03:45.537Z",
          "removed": false,
          "channels": [
              "ach"
          ],
          "fingerprint": "4cf31392f678cb26c62b75096e1a09d4465a801798b3d5c3729de44a4f54c794"
        },
        {
          "_links": {
            "self": {
              "href": "https://api-sandbox.dwolla.com/funding-sources/32eb2e53-d1e8-4b4d-bfc7-9ae7c553969d"
            },
            "customer": {
              "href": "https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733"
            }
          },
          "id": "98c209d3-02d6-4bee-bc0f-61e18acf0e33",
          "status": "verified",
          "type": "bank",
          "bankAccountType": "savings",
          "name": "Jane Doe's Savings",
          "created": "2015-10-02T22:03:45.537Z",
          "removed": false,
          "channels": [
              "ach"
          ]
        }
      ]
    }
  }
  ```

  ```php get_funding_sources.php theme={"dark"}
  <?php
  $customerUrl = 'https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733';

  $fsApi = new DwollaSwagger\FundingsourcesApi($apiClient);

  $fundingSources = $fsApi->getCustomerFundingSources($customerUrl);
  $fundingSources->_embedded->{'funding-sources'}[0]->name; # => "Jane Doe's Checking"
  ?>
  ```

  ```ruby get_funding_sources.rb theme={"dark"}
  # Using DwollaV2 - https://github.com/Dwolla/dwolla-v2-ruby
  customer_url = 'https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733'

  funding_sources = app_token.get "#{customer_url}/funding-sources"
  funding_sources._embedded['funding-sources'][0].name # => "Jane Doe's Checking"
  ```

  ```python get_funding_sources.py theme={"dark"}
  # Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python
  customer_url = 'https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733'

  funding_sources = app_token.get('%s/funding-sources' % customer_url)
  funding_sources.body['_embedded']['funding-sources'][0]['name'] # => 'Jane Doe's Checking'
  ```

  ```javascript get_funding_sources.js theme={"dark"}
  var customerUrl =
    "https://api-sandbox.dwolla.com/customers/5b29279d-6359-4c87-a318-e09095532733";

  dwolla
    .get(`${customerUrl}/funding-sources`)
    .then((res) => res.body._embedded["funding-sources"][0].name); // => 'Jane Doe's Checking'
  ```
</CodeGroup>

When the funding sources are successfully retrieved, you will receive a `200` HTTP response with the details of the funding sources. After retrieving the funding sources, we recommend storing the full URL for future use as it will be referenced when creating the transfer to this user's bank account.

# Step 4 - Initiating a Transfer

Sending funds from the Customer's checking account to their savings account.

#### Identify Source and Destination For Transfer

The first step is to determine where the funds are being sourced from and where the funds are going to.

* `Source` - Your Customer's Checking Bank Funding Source
* `Destination` - Your Customer's Savings Bank Funding Source

Since you are utilizing a `me-to-me` funds flow, you will need to know that there are two parts to a transfer,

* Source funding source to Balance funding source
* Balance funding source to Destination funding source

### Initiate a Transfer

To initiate a transfer, we will need to specify the source and destination funding source URLs in the `_links` parameter.

##### Request Parameters

| Parameter | Required | Type   | Description                                                                                                                                                                                                                     |
| --------- | -------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| \_links   | yes      | object | A \_links JSON object describing the desired source and destination of a transfer. [Reference the Source and Destination object](/docs/api-reference/transfers) to learn more about possible values for source and destination. |
| amount    | yes      | object | An amount JSON object. [Reference the amount JSON object](/docs/api-reference/transfers) to learn more.                                                                                                                         |

<Info>
  Within a transfer request, Dwolla supports additional optional parameters.
  These can range from <code>clearing</code> to specify the processing timing
  for the transfer, or <code>correlationId</code> to help correlate transfers
  from end-to-end. The object <code>facilitator-fee</code> isn't supported for
  this funds flow. For more information on all available transfer request
  parameters, check out our <a href="/docs/api-reference/transfers/initiate-a-transfer">API reference documentation.</a>
</Info>

##### Request and response

<CodeGroup>
  ```bash HTTP theme={"dark"}
  POST https://api-sandbox.dwolla.com/transfers
  Accept: application/vnd.dwolla.v1.hal+json
  Content-Type: application/vnd.dwolla.v1.hal+json
  Authorization: Bearer pBA9fVDBEyYZCEsLf/wKehyh1RTpzjUj5KzIRfDi0wKTii7DqY
  Idempotency-Key: 19051a62-3403-11e6-ac61-9e71128cae77

  {
     "_links": {
         "source": {
             "href": "https://api-sandbox.dwolla.com/funding-sources/707177c3-bf15-4e7e-b37c-55c3898d9bf4"
         },
         "destination": {
             "href": "https://api-sandbox.dwolla.com/funding-sources/3152c22b-3d72-442d-a83b-e575df3a043e"
         }
     },
     "amount": {
         "currency": "USD",
         "value": "10.00"
      },
  }

  ...

  HTTP/1.1 201 Created
  Location: https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3
  ```

  ```php initiate_transfer.php theme={"dark"}
  <?php
  $transfer_request = array (
    '_links' =>
    array (
      'source' =>
      array (
        'href' => 'https://api-sandbox.dwolla.com/funding-sources/707177c3-bf15-4e7e-b37c-55c3898d9bf4',
      ),
      'destination' =>
      array (
        'href' => 'https://api-sandbox.dwolla.com/funding-sources/3152c22b-3d72-442d-a83b-e575df3a043e',
      ),
    ),
    'amount' =>
    array (
      'currency' => 'USD',
      'value' => '225.00',
    )
  );

  $transferApi = new DwollaSwagger\TransfersApi($apiClient);
  $transfer = $transferApi->create($transfer_request);

  print($transfer); # => https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3
  ?>
  ```

  ```ruby initiate_transfer.rb theme={"dark"}
  transfer_request = {
    :_links => {
      :source => {
        :href => "https://api-sandbox.dwolla.com/funding-sources/707177c3-bf15-4e7e-b37c-55c3898d9bf4"
      },
      :destination => {
        :href => "https://api-sandbox.dwolla.com/funding-sources/3152c22b-3d72-442d-a83b-e575df3a043e"
      }
    },
    :amount => {
      :currency => "USD",
      :value => "225.00"
    }
  }

  # Using DwollaV2 - https://github.com/Dwolla/dwolla-v2-ruby (Recommended)
  transfer = app_token.post "transfers", transfer_request
  transfer.response_headers[:location] # => "https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3"
  ```

  ```python initiate_transfer.py theme={"dark"}
  transfer_request = {
    '_links': {
      'source': {
        'href': 'https://api-sandbox.dwolla.com/funding-sources/707177c3-bf15-4e7e-b37c-55c3898d9bf4'
      },
      'destination': {
        'href': 'https://api-sandbox.dwolla.com/funding-sources/3152c22b-3d72-442d-a83b-e575df3a043e'
      }
    },
    'amount': {
      'currency': 'USD',
      'value': '225.00'
    }
  }

  # Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python (Recommended)
  transfer = app_token.post('transfers', transfer_request)
  transfer.headers['location'] # => 'https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3'
  ```

  ```javascript initiate_transfer.js theme={"dark"}
  var transferRequest = {
    _links: {
      source: {
        href: "https://api-sandbox.dwolla.com/funding-sources/707177c3-bf15-4e7e-b37c-55c3898d9bf4",
      },
      destination: {
        href: "https://api-sandbox.dwolla.com/funding-sources/3152c22b-3d72-442d-a83b-e575df3a043e",
      },
    },
    amount: {
      currency: "USD",
      value: "225.00",
    },
  };

  dwolla.post("transfers", transferRequest).then(function (res) {
    res.headers.get("location"); // => 'https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3'
  });
  ```
</CodeGroup>

### Handle Webhooks

If you have an active webhook subscription (required in production & optional in <Tooltip tip="A testing environment that mimics the production environment but uses test data instead of real money">Sandbox</Tooltip>), you will receive the `customer_bank_transfer_created` <Tooltip tip="Webhooks are automated notifications sent to your application when specific events occur in the Dwolla system">webhook</Tooltip> immediately after the transfer resource has been created. This denotes that the first part of the transfer has been initiated from the checking bank funding source to the Balance funding source.

### Simulate Bank Transfer Processing

To simulate bank transfer processing in the Dwolla Sandbox environment, navigate to the Sandbox Dashboard. From here, you will want to click the "Process Bank Transfers" button on the top of the screen. Your Sandbox transfer will be moved out of a pending status and moved to a processed status.

<img src="https://mintcdn.com/dwolla/C9LuhBlLWlq2MFvM/assets/images/content-images/process-bank-transfers.png?fit=max&auto=format&n=C9LuhBlLWlq2MFvM&q=85&s=426cbc7eb4ae78023b2aa82efffd4872" alt="process bank transfers" width="246" height="164" data-path="assets/images/content-images/process-bank-transfers.png" />

**Production bank transfer processing timing**

While pending bank transfers can be processed at any time in the Sandbox, behavior will vary in production depending on if your application has access to expedited transfers versus standard ACH transfer times. Refer to our [developer resource article](/docs/transfer-processing-times) to learn more on transfer timing in production.

### Handle Webhooks

If you have an active webhook subscription (required in production & optional in Sandbox), you will receive the `customer_bank_transfer_completed` webhook when the status of the first part of the transfer has changed from `pending` to `processed`. The second part of the transfer is then automatically initiated from the Balance funding source to the savings bank funding-source which triggers another `customer_bank_transfer_created` webhook. Repeat [simulate bank transfer processing](#simulate-bank-transfer-processing) to simulate bank transfer processing again. Once the transfer has cleared into the final destination bank funding source, you will receive another `customer_bank_transfer_completed` webhook denoting that the transfer is now complete.

### Verify Status of Transfer

Since ACH transfers in production can take a few days to complete, webhooks are an efficient way to notify you of when a transfer's status has been updated from `pending` to `processed` to a destination funding source. However, if you want to verify the status of a transfer at any given point in time, you can make a call to the API to retrieve the transfer by its unique id.

##### Example response - Transfer 1

```json theme={"dark"}
{
  "_links": {
    "self": {
      "href": "https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "transfer"
    },
    "source": {
      "href": "https://api-sandbox.dwolla.com/funding-sources/707177c3-bf15-4e7e-b37c-55c3898d9bf4",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "funding-source"
    },
    "destination": {
      "href": "https://api-sandbox.dwolla.com/customers/cf3f1ad4-fc48-45d3-8aff-0ef5577b8a17",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "customer"
    },
    "funded-transfer": {
      "href": "https://api-sandbox.dwolla.com/transfers/a00ff82d-73b4-e911-811b-f08aa77f5aa3",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "transfer"
    }
  },
  "id": "81643da1-b1b3-e911-811b-f08aa77f5aa3",
  "created": "2019-08-01T15:32:05.620Z",
  "status": "processed",
  "amount": {
    "value": "225.00",
    "currency": "USD"
  },
  "individualAchId": "IQ8M922R"
}
```

##### Example response - Transfer 2

```json theme={"dark"}
{
  "_links": {
    "self": {
      "href": "https://api-sandbox.dwolla.com/transfers/a00ff82d-73b4-e911-811b-f08aa77f5aa3",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "transfer"
    },
    "source": {
      "href": "https://api-sandbox.dwolla.com/customers/cf3f1ad4-fc48-45d3-8aff-0ef5577b8a17",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "customer"
    },
    "destination": {
      "href": "https://api-sandbox.dwolla.com/funding-sources/3152c22b-3d72-442d-a83b-e575df3a043e",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "funding-source"
    },
    "funding-transfer": {
      "href": "https://api-sandbox.dwolla.com/transfers/81643da1-b1b3-e911-811b-f08aa77f5aa3",
      "type": "application/vnd.dwolla.v1.hal+json",
      "resource-type": "transfer"
    }
  },
  "id": "a00ff82d-73b4-e911-811b-f08aa77f5aa3",
  "created": "2019-08-01T15:44:06.290Z",
  "status": "processed",
  "amount": {
    "value": "225.00",
    "currency": "USD"
  },
  "individualAchId": "IQKBPJAY"
}
```
