Stripe | Financial Infrastructure to Grow Your Revenue

Stripe | Financial Infrastructure to Grow Your Revenue

4466 articles

Review uncaptured payments


Review uncaptured payments

Learn how to use reviews if your Stripe integration uses auth and capture.

By default, you create payments in one step. You don’t need to do anything else to send funds to your bank account. Stripe also supports two-step payments, often called auth and capture. If your integration uses this method, approving a review and capturing a payment are separate actions.

Your capture window for approved payments varies by card brand, potential extended holds, and payment method type.

Review uncaptured payments in the Dashboard

When we place an uncaptured payment in review, the Stripe Dashboard shows a Capture button alongside buttons to approve or cancel the review. Uncaptured payments show a Cancel button instead of a Refund button because canceling an uncaptured payment releases the authorization without creating a Refund object.

Note

Approving the review doesn’t automatically capture the charge. You still need to click Capture.

Use the API to automatically capture approved payments

Through the API, you can set up your integration to:

  • Immediately capture payments not placed in review .
  • Leave payments placed in review uncaptured.
  • When the review is approved, capture the payment.

Immediately capture payments not placed in review

Set the capture_method in your API request to create an uncaptured payment. After a successful request, check the review attribute on the PaymentIntent. If it’s empty, capture the charge.

Select a language

Ruby

Python

PHP

Java

Node.js

Go

.NET

No results

# Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
# Find your keys at https://dashboard.stripe.com/apikeys.
client = Stripe::StripeClient.new('sk_test_BQokikJOvBiI2HlWgH4olfQ2')

# Get the credit card details submitted by the form
# Create a PaymentIntent with manual capture
payment_intent = client.v1.payment_intents.create({
 amount: 1000,
 currency: 'usd',
 payment_method: '{{PAYMENT_METHOD_ID}}',
 description: 'Example charge',
 confirm: true,
 capture_method: 'manual',
})

# Check if the payment is in review. If not, capture it.
if !payment_intent.review
 client.v1.payment_intents.capture(payment_intent.id)
end

Capture a payment after a review is approved

In the previous step, you left payments in review and uncaptured. Use webhooks to automatically capture these payments after approval.

Configure your webhooks to listen for the review.closed event. The event includes the Review object, and its reason attribute indicates whether the review was approved or closed for another reason (for example, the payment was refunded).

// Review object included in review.closed event webhook.
{
 "id": "prv_08voh1589O8KAxCGPcIQpmkz",
 "object": "review",
 "payment_intent": "pi_1D0CsEITpIrAk4QYdrWDnbRS",
 "created": 1474379631,
 "livemode": false,
 "open": false,
 "reason": "approved"
}

If reason is approved, capture the charge.

Last verified 2026-09-24

Is this helpful?