Payments & Money APIs · Charging Safely
Authorize, Capture, Void & Partial Captures
Separating authorization from capture for shipping, marketplaces and holds.
Manual capture lets you authorize at checkout and capture later — when goods ship, when the final amount is known (hotels, ride-hailing, groceries with substitutions) or after fraud review. Captures can be partial (capture less than authorized; the rest is released), and uncaptured authorizations should be voided/cancelled to release the customer's funds promptly. Authorizations expire (commonly ~7 days for online card payments; varies by network and PSP), so schedule captures and handle expiry by re-authorizing.
Capture strategies
| Criterion | Automatic capture | Manual capture |
|---|---|---|
| Customer charged | Immediately | When you capture |
| Amount can change | Refund difference | Capture less (partial) |
| Cancel before fulfilment | Refund (fees may apply) | Void (no settlement) |
| Risk | Refund volume | Authorization expiry |
| Best for | Digital goods, instant delivery | Physical goods, variable amounts, fraud review |
intent = stripe.PaymentIntent.create(amount=12000, currency="usd", capture_method="manual",
payment_method=pm_id, confirm=True, idempotency_key=f"auth:{order.id}")
# When the shipment leaves the warehouse (final amount known after substitutions):
stripe.PaymentIntent.capture(intent.id, amount_to_capture=10850, idempotency_key=f"capture:{order.id}")
# Order cancelled before shipping:
stripe.PaymentIntent.cancel(intent.id, idempotency_key=f"void:{order.id}")
// Nightly: capture or alert on authorizations approaching expiry.
for (const p of await payments.uncapturedOlderThan({ days: 5 })) {
if (await orders.isShippable(p.orderId)) await captureNow(p);
else await alerts.raise("auth-expiring", { orderId: p.orderId });
}
Common pitfalls
- Forgetting to void (customer's funds held for days).
- Captures after authorization expiry failing silently.
- Capturing more than authorized.
Key points
- Manual capture for physical/variable orders
- Partial capture and voids
- Track authorization expiry
Further reading: Stripe: Place a hold on a payment method
Practice questions
When is manual capture preferable to automatic capture?
Answer
When fulfilment happens later or the final amount may change — physical shipments, hotels, rides, grocery substitutions — or when fraud review must finish first.
Why void an authorization instead of capturing and refunding?
Answer
A void releases the hold without moving money, avoiding settlement, refund delays and potentially fees.
Open in the app to mark lessons complete, take notes and track your progress.