Sending Transfers

Transfer funds received from credit cards to third-party bank accounts. If you need help, check out our answers to common questions or chat live with our developers in #stripe on freenode.

By default, Stripe automatically deposits funds in your bank account every day. This tutorial teaches you how to pay arbitrary third parties, such as sellers or vendors, using your Stripe account.

Once you’ve received payments through Stripe, you can create transfers through the API to send funds to arbitrary third-party bank accounts. This is currently only available for US Stripe accounts sending funds to third-party bank accounts in the US.

Normally, Stripe sends automatic transfers to your bank account on a seven-day rolling basis. Once you enable production transfers, though, you’ll no longer receive automatic Stripe transfers. Payments you receive will instead accumulate in your Stripe balance. These funds will be available for you to pay out to third parties (or yourself) on a seven-day rolling basis.

Collecting recipient details

To send transfers, you’ll need to collect two things: bank account details and legal name. The recipient name is required for compliance checks that Stripe performs, such as matching against the OFAC list. If the recipient is an individual, you’ll need to collect their full legal name; if they’re a business, the legal corporation name.

The easiest way to collect these is to use Stripe.js to tokenize the bank account details. On the server, grab the bank account token in the POST params (submitted by your form) and use that token to create a recipient:

Verifying recipients

It’s important that you verify the identity of anyone receiving transfers, and that the name you’re sending Stripe is the full legal name of the recipient. If a recipient receives a large volume of transfers, or if there are any anomalies, we may require further information. We’ll contact you if so.

The broader context here is that there are many laws around money transmission in order to guard against money laundering, terrorist financing, etc. Stripe does its best to make it easy for you to build great products, using simple abstractions, while handling as much of the compliance burden as possible.

Creating transfers

Once you’ve created a recipient, you can initiate a transfer with a single API call. While doing so, you can specify the description that appears on the recipient’s bank account statement.

The returned transfer object describes the status of the transfer and specifies when the transfer should be available in the destination bank account.

Transfer timeline

Unlike charging a credit card, sending a bank transfer is not synchronous. Transfers will be available in the bank account the next business day if created before 21:00 UTC (2pm PST). If the transfer fails (due to a typo in the bank details, for example), it can take up to five business days for Stripe to be notified.

Here’s what the flow looks like:

  • A transfer is created via the API. At this point, the transfer’s status is pending.
  • You receive a transfer.paid webhook when the transfer is expected to be available in the recipient’s bank account. However, this webhook does not guarantee that the transfer was actually successful.
  • If the transfer fails, you’ll receive a transfer.failed webhook within five business days (that’s unfortunately how long some banks take to return transfers) and the transfer will be marked as failed.
  • You can safely assume the transfer was successful if you don’t receive a transfer.failed webhook within five business days.

Handling transfer failures

If a transfer fails, it will most likely be because of incorrect bank account details. You should update the recipient object with the correct details and retry the transfer.

Sending transfers to yourself

Once you enable live transfers, Stripe will no longer send automatic transfers to your bank account (if we did, there’d be no funds left for you to pay others out with!). You need to explicitly create a transfer if you’d like to transfer funds from your Stripe balance to your bank account.

If you set the recipient of the transfer as self, the transfer will be sent to the bank account associated with your Stripe account. There are no fees for these transfers.

Testing

Test tax IDs

Pass in any name and one of these tax IDs (they work as both SSNs and EINs) for the desired recipient verification behavior.

Number Type
000000000Successful verification
111111111Unsuccessful verification (identity mismatch)

Test bank account numbers

There are various test routing and account numbers you can use to trigger certain events. These can only be used with test secret keys. When creating test transfers, you must use a test account number but you can use any valid US routing number.

Routing numbers

Number Type
110000000STRIPE TEST BANK US routing number

Account numbers

Number Type
000123456789Successful US account number
000111111116Failing US account number (triggers transfer.failed)

Errors

Invalid bank account

You’ll get an error when creating a recipient if the routing number does not correspond to a valid US bank account. For account numbers, we won’t know if the account exists until a successful transfer is made.

{
  "error": {
    "message": "Not a valid US routing number",
    "type": "invalid_request_error"
  }
}

Insufficient funds

If the funds in your Stripe account aren’t enough to cover a transfer, the transfer will not be created:

{
  "error": {
    "message": "Insufficient funds in Stripe account",
    "type": "invalid_request_error"
  }
}