Sign in
Create account
Sign in
Home
Payments
Business operations
Financial services
Developer tools
Security
All products
Home
Payments
Business operations
Home
Payments
Business operations
Financial services
Developer tools
Support
Overview
Overview
Customers
Products and Prices
Invoice customers
How invoicing works
Create an invoice
Integrate with Invoicing
Customize invoices
Hosted invoice page
Additional features
Taxes
Automatic reconciliation
Automatic collection and dunning
Charging automatically
Credit notes
Pay by mailed check
Testing
invoicing
·
HomePaymentsInvoicingAdditional features

Automatic reconciliation

Allow customers to pay invoices using credit transfer payment methods, while Stripe handles the cash reconciliation.

Transfers vs. debits

A stored credit card or bank account is a debit payment method: charges are made by debiting funds into Stripe. By contrast, transfer payments involve money being pushed into Stripe; examples are wire or bank transfers.

​​Businesses often use credit transfer payments for large deals or new business relationships, and they can generate a lot of manual work for your team. Stripe facilitates accepting transfers that pay open invoices.

For each of your customers, Stripe auto-generates a U.S. virtual bank account number that can be paid in USD with ACH credit or wires. When your customer sees an invoice with this virtual bank account, they can send payment to it. ​​Stripe automatically reconciles the payment with the virtual bank account and the invoice. Stripe then marks the invoice as paid.

Using automatic reconciliation means that you don’t need to expose your sensitive bank account details to users or manually reconcile open invoices with your bank.

With auto-reconciliation for invoices, Stripe can:

  • Match incoming payments with invoice amounts
  • Manage overpayment or underpayment, when the amount paid doesn’t match the invoice
  • Reduce the number of API calls required to transfer funds into Stripe
  • Manage payment retries on open invoices

To create an invoice that supports transfer payments, use the flow outlined in Create an invoice.

Paying an invoice

​​ACH credit transfers only support USD.

Stripe creates an ach_credit_transfer​ for every invoice if the customer doesn’t already have one. ​​Every invoice includes instructions on where to send payment. Each customer has a unique payment address that’s shared across all of their invoices. They can then transfer funds through either the U.S. ACH system or domestic wire, and include the invoice number in the memo field.

As soon as a customer makes a transfer, Stripe matches the payment to an invoice by checking for an invoice number in the memo field of the transfer. We fulfill any invoices that we find a match for. If we can’t find a match, we fulfill the oldest outstanding invoice of the same amount. When an invoice is fulfilled, an invoice.paid event occurs—you can receive this event using webhooks.

You can inspect the status of any ACH credit transfer by viewing the list of payment methods for the customer, either in the Dashboard or viewing the sources in the API:

Terminal
curl https://api.stripe.com/v1/customers/cus_9jWC3097MQwYwF/sources \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:

Stripe returns a list of sources attached to that customer. The source type for ACH Credit Transfer has a value of ach_credit_transfer.

{ "object": "list", "data": [ { "id": "src_19Q3AILlRB0eXbMt81RVDnM9", "object": "source", "amount": null, "client_secret": "src_client_secret_Z0zPIgnR0BVafiMLaJcxI3HS", "created": 1481585102, "currency": "usd", "customer": "cus_9jWC3097MQwYwF", "flow": "receiver", "livemode": false, "metadata": {}, "owner": { "address": null, "email": "jenny.rosen@example.com", "name": null, "phone": null, "verified_address": null,

That particular response shows the ACH credit transfer receiver is awaiting payment from the customer.

In some cases, customers might want to pay with payment methods outside of Stripe, such as paper checks. In these situations, Stripe still allows you to keep track of the payment status of your invoices. After you receive an invoice payment from a customer outside of Stripe, you can manually mark their invoice as paid.

Terminal
curl https://api.stripe.com/v1/invoices/in_18jwqyLlRB0eXbMtrUQ97YBw/pay \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
: \ -d "paid_out_of_band"=true

Handling exceptions

If your customer pays an amount that doesn’t match an invoice amount, the funds aren’t charged and remain in the Source​ object. If you want to use these funds to fulfill your invoice, you have a few options:

  • Overpayment: If a user sends more funds than the invoice requests, Stripe automatically marks the invoice as paid, using the funds that match the open invoice. The remaining funds stay in the Source receiver. You can manually apply these funds to an invoice. If you have multiple matching open invoices, Stripe applies the funds to the oldest invoice.
  • Underpayment: In the Dashboard’s Automatic collection settings section, you can specify rules around underpayment. You can specify that within a certain margin of error, Stripe auto-reconciles invoices and credits the difference.

A typical scenario for underpayment might be that a customer’s bank takes funds from the total amount sent by them. For example, ​​if they send 100 USD to pay their 100 USD invoice, the customer’s bank might take 20 USD, leaving you with 80 USD. If this difference (which is usually within 20 USD) is acceptable, you can ​​specify this margin ahead of time, to minimize any manual effort.

For any other exceptions:

  • ​If the receiver has enough money to pay your invoice, you can claim those funds in the Dashboard by clicking the Charge customer button on the invoice, or by calling the pay invoice endpoint and specifying the ACH credit transfer object as the source.
  • ​​If the funds to pay the invoice are insufficient and you don’t forgive the difference, you can ask your customer to send the remaining amount. Or you can void the old invoice, open a new one for the lesser amount, and immediately click Charge customer on it.

If your customer has an ACH credit transfer source with sufficient funds, or a credit card or bank account on file, you can use those sources to pay the invoice by calling the pay invoice endpoint with the source you want to use.

Refunding payments

You can refund ACH credit transfer and Check payments through either the Dashboard or the API. However, the customer must specify the account to return the funds to. Stripe automatically contacts the customer at the email address provided. As soon as the customer provides us with their account information, we process the refund automatically.

The initial status of the refund is pending. If the refund fails, ​​you’ll receive the charge.refund.updated​ event, and the status of the refund transitions to failed. This means that ​​we couldn’t process the refund, and you must return the funds to your customer outside of Stripe. This is a rare occurrence, which can happen if the refund is sent to an account that has been frozen. Refunds that have been completed have the status succeeded.

Testing payment

If ​​you’re in test mode, you can simulate transferring money into the receiver by updating the owner email on the source to amount_XXXX@any_domain.com, where XXXX is the amount of money you want to simulate transferring. ​​The payment won’t be associated with the invoice unless the invoice has been frozen from editing. This happens either one hour after webhooks have been delivered, or when an email for the invoice has been sent to the customer. In the Dashboard, you can initiate immediately sending an email by clicking the invoice’s Send invoice button.

Terminal
curl https://api.stripe.com/v1/sources/src_19Q3AILlRB0eXbMt81RVDnM9 \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
: \ -d "owner[email]"="amount_1000@example.com"

A few moments after the update request, you can retrieve your receiver:

Terminal
curl https://api.stripe.com/v1/sources/src_19Q3AILlRB0eXbMt81RVDnM9 \ -u
sk_test_4eC39HqLyjWDarjtT1zdp7dc
:

You should see it fill up with funds:

{ "object": "list", "data": [ { "id": "src_19Q3AILlRB0eXbMt81RVDnM9", "object": "source", "amount": null, "client_secret": "src_client_secret_Z0zPIgnR0BVafiMLaJcxI3HS", "created": 1481585102, "currency": "usd", "customer": "cus_4fdAW5ftNQow1a", "flow": "receiver", "livemode": false, "metadata": {}, "owner": { "address": null, "email": "amount_1000@test.com", "name": null, "phone": null, "verified_address": null, "verified_email": null, "verified_name": null, "verified_phone": null }, "receiver": { "address": "110000000-test_12e2b7d44ea6", "amount_charged": 1000, "amount_received": 1000, "amount_returned": 0, "refund_attributes_method": "email", "refund_attributes_status": "missing" }, "status": "chargeable", "type": "ach_credit_transfer", "usage": "reusable", "ach_credit_transfer": { "account_number": "test_12e2b7d44ea6", "fingerprint": "3eoX8Ufbxh0oVDim", "routing_number": 110000000 } } ], "has_more": false, "url": "/v1/customers/cus_4fdAW5ftNQow1a/sources" }

You should also see the customer’s open invoice (of the same amount) transition to paid, with a corresponding payment object displaying the details of the payment.

Was this page helpful?
Questions? Contact us.
Developer tutorials on YouTube.
You can unsubscribe at any time. Read our privacy policy.
On this page
Paying an invoice
Handling exceptions
Refunding payments
Testing payment