capture_method: manual when creating a payment session. If omitted, capture_method defaults to automatic, which settles funds immediately upon authorisation (standard sale behaviour).
capture_method is a best-effort, card-specific option. If the customer pays with a non-card payment method, the payment falls back to automatic capture regardless of the setting.When to Use Authorisation and Capture
Pre-order or backorder scenarios
Pre-order or backorder scenarios
Reserve funds when a customer places an order, then capture when the item ships. If the item becomes unavailable, void the authorisation instead.
Variable final amounts
Variable final amounts
Authorise the estimated amount (e.g. hotel stay), then capture the actual final amount. Void the remaining authorisation.For example, authorise R1 500.00 for a 3-night hotel stay. If the guest checks out after 2 nights (R1 000.00), capture R1 000.00 and void the remaining authorisation.
Fraud review
Fraud review
Authorise immediately, then review the transaction asynchronously. This gives your fraud team a window to review high-value or suspicious transactions before funds are settled. Capture after approval or void if flagged.
Partial fulfillment
Partial fulfillment
Authorise the full order amount, then capture per shipment as items become available. Void the remaining authorisation for any unshipped items.For example, a customer orders 3 items totalling R3 000.00. Ship item 1 (R1 200.00) and capture that amount. Ship item 2 (R800.00) and capture again. If item 3 is out of stock, void the remaining authorisation.
Tip or gratuity adjustment
Tip or gratuity adjustment
Authorise the base amount (e.g. a restaurant bill), then capture the final amount including the tip. Void the difference if the tip is less than the authorised buffer.For example, authorise R500.00 for a meal. The customer adds a R75.00 tip, so you capture R575.00 (if within the authorised amount) or capture R500.00 and process the tip separately.
Rental deposits
Rental deposits
Authorise a deposit amount when a customer begins a rental (e.g. car hire, equipment rental), then capture only the actual usage charges and void the remainder.For example, authorise R5 000.00 for a weekend car rental. The customer returns the car with no damage, so you capture R2 500.00 for the rental fee and void the remaining R2 500.00 deposit.
capture_method: automatic.
Payment Lifecycle
Create a Payment Session with capture_method: manual
Pass
payment_method_options.card.capture_method: manual inside the session options:Customer completes authorisation
The customer is redirected to the checkout page (Webhook fired:
session_url) and completes the card payment. On success, the underlying payment object transitions to status: succeeded, meaning funds are reserved but not yet settled.The payment object at this stage:payment.succeededFlow Diagram
Capture Scenarios
Full capture
Capture the entire authorised amount. Omit theamount field:
payment.captured
Partial capture
Capture less than the full authorised amount by specifyingamount:
Void
Full void
Release the entire remaining authorised amount:payment.voided
Void after partial capture
After a partial capture, void the remaining authorisation to close the payment:Authorisation Expiry
Authorisations have a limited validity period, indicated by theauthorisation_expires_at field on the payment object. After this time:
- The authorisation can no longer be captured
- Reserved funds are automatically released back to the customer by the card network
- Attempting to capture returns a
409 Conflicterror:
Authorisation validity periods vary by payment method and issuing bank, typically ranging from 5 to 30 days for card payments. Plan your capture workflow accordingly.
Error Handling
Conflict scenarios (409)
Captures and voids return409 Conflict when the payment is not in a valid state for the requested operation:
| Operation | Scenario | Error detail |
|---|---|---|
| Capture | Payment not authorised | "The payment is not in an authorised state and cannot be captured." |
| Capture | Amount exceeds remaining | "The capture amount exceeds the remaining authorised amount." |
| Capture | Authorisation expired | "The authorisation has expired and can no longer be captured." |
| Void | Payment not authorised | "The payment is not in an authorised state and cannot be voided." |
| Void | Already fully voided | "The payment has already been fully voided." |
| Void | No remaining authorisation | "There is no remaining authorised amount to void." |
Common Examples
E-commerce: authorise at checkout, capture at shipment
Hotel: authorise estimated stay, capture actual amount
Pre-order: authorise, void if unavailable
Partial fulfillment: capture per shipment
Fraud review: authorise, review, then decide
Tip adjustment: authorise base amount, capture with gratuity
Rental deposit: authorise deposit, capture actual charges
Complete End-to-End Example
A merchant selling electronics wants to authorise at checkout and capture at shipment. Step 1: Create payment sessionWebhooks
The following webhook events are emitted during the authorisation and capture lifecycle:-
payment.succeededFired when the authorisation succeeds. The paymentstatusissucceeded,authorised_amountis set, andpaid_amountis0. Seepayment.succeededEvent -
payment.capturedFired when a capture succeeds (full or partial). Thepaid_amountfield reflects the newly captured total. Seepayment.capturedEvent -
payment.voidedFired when a void succeeds. Thevoided_amountfield is incremented by the released amount whileauthorised_amountremains unchanged. Seepayment.voidedEvent -
payment.attempt_failedFired when an authorisation attempt fails. Thelast_payment_errorfield contains error details. Seepayment.attempt_failedEvent -
payment.failedFired when all payment attempts are exhausted and the payment has failed terminally. Thelast_payment_errorfield contains details of the final failed attempt. Seepayment.failedEvent

