← Files MollieARCHIVED FILE

skills/mollie-payments/references/operations/captures.md

4.46 KB · Oct 6, 2026 · 00:02 UTC

↓ Download file

# Captures (authorize-then-capture)

Before writing any capture code, read `<references/operations/write-action-safety.md>`.

Only relevant for methods that support authorize-then-capture: **credit cards**
(with `captureMode: manual`), **Klarna Pay Later**, **Klarna Slice It**, **Billie**,
and **Riverty**. Every other method captures automatically at payment time — skip
this file for those.

## When to use manual capture

Use it when you can't fulfil the order immediately — e.g. made-to-order goods, or
anything that takes more than 24 hours to ship. Authorize at checkout, capture once
the order actually ships.

## 1. Create the payment with `captureMode: manual`

```javascript
const payment = await mollie.payments.create({
  method: 'creditcard',
  captureMode: 'manual',
  amount: { currency: 'EUR', value: '99.00' },
  description: 'Order #4567',
  redirectUrl: 'https://example.com/orders/4567/complete',
  webhookUrl: 'https://example.com/webhooks/mollie',
});
```

If the customer completes the payment with a method that doesn't support manual
capture, the payment goes straight to `paid` — check the resulting `status`, don't
assume `authorized`.

**Klarna Pay Later / Slice It need more than this.** Unlike credit cards, Klarna
requires order lines and address data on the payment for its own credit
evaluation — creating a `klarnapaylater`/`klarnaslicit` payment with only the
fields above will fail validation, not just silently skip manual capture:

```javascript
const payment = await mollie.payments.create({
  method: 'klarnapaylater',
  captureMode: 'manual',
  amount: { currency: 'EUR', value: '99.00' },
  description: 'Order #4567',
  redirectUrl: 'https://example.com/orders/4567/complete',
  webhookUrl: 'https://example.com/webhooks/mollie',
  lines: [
    {
      description: 'Product name',
      quantity: 1,
      unitPrice: { currency: 'EUR', value: '99.00' },
      totalAmount: { currency: 'EUR', value: '99.00' },
      vatRate: '21.00',
      vatAmount: { currency: 'EUR', value: '17.19' },
    },
  ],
  billingAddress: {
    givenName: 'Jane',
    familyName: 'Doe',
    email: 'jane@example.com',
    streetAndNumber: 'Main St 1',
    postalCode: '1234AB',
    city: 'Amsterdam',
    country: 'NL',
  },
  // See Klarna-specific docs for the full required/optional field set
  // (shippingAddress, per-line vatRate rules, etc.) before shipping this.
});
```

## 2. Wait for `authorized` status

The payment reaches `authorized` after the customer completes checkout. It stays
`authorized` until you capture it or the authorization expires — check the current
authorization window for your method before relying on it:

- **Klarna**: 28 days at time of writing, but confirm against current docs before
  shipping.
- **Credit cards**: capped at up to 7 days in practice — the exact window depends
  on the card's issuer and isn't known upfront, so don't assume the full 7 days is
  guaranteed. Confirm against current docs before shipping.

Once an authorization expires, the reserved funds are released and the payment
moves to `expired` — capture is no longer possible after that point.

## 3. Capture when ready to fulfil

```javascript
const capture = await mollie.paymentCaptures.create({
  paymentId: 'tr_7UhSN1zuXS',
  amount: { currency: 'EUR', value: '99.00' },  // omit to capture the full authorized amount
});
```

- Requires `payments.write` scope (API key, advanced access token, or OAuth token) —
  Mollie has no separate scope for captures; confirm against current docs before
  shipping.
- Some methods support **multiple partial captures** — after a partial capture
  succeeds, the remaining authorized amount stays available and the payment remains
  `authorized`. Once the full amount is captured, status moves to `paid`.
- If you decide not to fulfil the order, release the hold instead of capturing —
  cancel the payment while it's in `authorized` status rather than leaving it to
  expire.

## Common mistakes

| Mistake | Fix |
|---|---|
| Setting `captureMode: manual` on a method that doesn't support it | Check the method supports authorize-then-capture first; it silently goes straight to `paid` otherwise |
| Assuming capture is synchronous with shipping | Capture explicitly via the API when you ship — it does not happen automatically |
| Letting an authorization silently expire when the order won't ship | Explicitly cancel the payment to release the hold |
| Capturing more than the authorized amount | Capture amount must be ≤ the remaining authorized amount |

SHA-256: 441709b5a2ce282ba061246e8a7a74bfd45cb2b95fd22dc7cb0850cf5e8f1a6f