Skip to content
Create account
or
Sign in
The Stripe Docs logo
/
Ask AI
Create account
Sign in
Get started
Payments
Revenue
Platforms and marketplaces
Money management
Developer resources
APIs & SDKsHelp
Overview
About Stripe payments
Upgrade your integration
Payments analytics
Online payments
OverviewFind your use caseUse Managed Payments
Use Payment Links
Use a pre-built checkout page
Build a custom integration with Elements
Build an in-app integration
Payment Methods
Add payment methods
Manage payment methods
Faster checkout with Link
Payment interfaces
Payment Links
Checkout
Web Elements
In-app payments
Payment scenarios
Handle multiple currencies
Custom payment flows
Flexible acquiring
Orchestration
In-person payments
Terminal
Beyond payments
Incorporate your company
Crypto
Agentic commerce
Financial Connections
Climate
Understand fraud
Radar fraud protection
    Overview
    Optimize fraud signals
    Radar Session
    Risk evaluation
    Multi-processor Radar scores
    Risk settings
    Reviews
      Risk insights
      Uncaptured payments
    Lists
    Rules
    Local payment methods
    Radar analytics
    Radar for Platforms
Manage disputes
Verify identities
HomePaymentsRadar fraud protectionReviews

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_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.

Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
# 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 =
'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
# Get the credit card details submitted by the form # Create a PaymentIntent with manual capture payment_intent = Stripe::PaymentIntent.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 payment_intent.capture 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.

# 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 =
'sk_test_BQokikJOvBiI2HlWgH4olfQ2'
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
Was this page helpful?
YesNo
  • Need help? Contact Support.
  • Check out our changelog.
  • Questions? Contact Sales.
  • LLM? Read llms.txt.
  • Powered by Markdoc