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 cancelling an uncaptured payment releases the authorisation 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_
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.
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.
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.
# Set your secret key. Remember to switch to your live secret key in production. # See your keys here: https://dashboard.stripe.com/apikeys Stripe.api_key =
post "/my/webhook/url" do event_json = JSON.parse(request.body.read) event = Stripe::Event.retrieve(event_json["id"]) if event.type == 'review.closed' review = event.object if review.reason == 'approved' pi = Stripe::PaymentIntent.retrieve(review.payment_intent) pi.capture end end status 200 end'sk_test_BQokikJOvBiI2HlWgH4olfQ2'