# Pending refunds

By default, refunds are submitted immediately when created. A merchant may also be configured to have refunds withheld until the merchant's settlement balance can cover them.

This guide explains the held refund lifecycle, how Finix funds pending refunds, and what happens if a refund cannot be covered before it expires.

## Merchant pending refund strategies

On the Merchant resource, the `pending_refunds_strategy` field indicates whether refunds are held.

### No strategy

When `pending_refunds_strategy` is set to `NONE` (the default), refunds are submitted on creation and are not held.

### Delayed or same-day adjustment strategies

When a merchant's `pending_refunds_strategy` is set to `SEVEN_DAY_DELAYED_ADJUSTMENT` or `SAME_DAY_ADJUSTMENT`, refunds enter a `PENDING` state while Finix verifies that there are sufficient funds in the merchant's settlement to cover them.

The following are the possible held refund strategies:

- `SEVEN_DAY_DELAYED_ADJUSTMENT`: Refunds are held in `state: PENDING` for up to 7 days to be covered by settlement funds. After 7 days, Finix debits the merchant's bank account to cover the refund.
- `SAME_DAY_ADJUSTMENT`: Finix issues a debit adjustment near settlement close if the settlement can't cover the refund.


Only users with `ROLE_PARTNER` credentials can only set this value to `SEVEN_DAY_DELAYED_ADJUSTMENT` or `SAME_DAY_ADJUSTMENT`.

## Refund hold lifecycle

### 1. Refund created

If a Merchant has a `pending_refunds_strategy` other than `NONE`, refunds are not processed immediately.

In the response, the Transfer reversal (i.e., refund) contains `state: PENDING` and an `expires_at` datetime 45 days after creation.

If the refund is not funded by the expiration, it expires.

Refund - held

```json Refund - held
{
  "id": "TR7PRhJjcz1RZdeXXifNVZ5E",
  "created_at": "2026-09-10T16:47:23.74Z",
  "updated_at": "2026-09-10T16:47:23.77Z",
  "additional_buyer_charges": null,
  "additional_healthcare_data": null,
  "additional_lodging_data": null,
  "additional_motor_vehicle_rental_data": null,
  "additional_purchase_data": null,
  "address_verification": null,
  "amount": 10000,
  "amount_requested": 10000,
  "application": "APc9vhYcPsRuTSpKD9KpMtPe",
  "created_via": "UNKNOWN",
  "currency": "USD",
  "destination": "PI6iQcTtJNCS8GZAVKYi5Ueb",
  "expires_at": "2026-10-25T16:47:23.74Z", // [!code highlight]
  "externally_funded": "UNKNOWN",
  "failure_code": null,
  "failure_message": null,
  "fee": 0,
  "fee_profile": "FPuizPqrhzYLbmJm88u7aqfj",
  "idempotency_id": null,
  "ip_address_details": null,
  "merchant": "MUmfEGv5bMpSJ9k5TFRUjkmm",
  "merchant_identity": "ID6UfSm1d4WPiWgLYmbyeo3H",
  "messages": [],
  "network_details": null,
  "operation_key": "CARD_NOT_PRESENT_REFUND",
  "parent_transfer": "TR6XtdbGFs8P98TAFgLFPXzE", // [!code highlight]
  "parent_transfer_trace_id": null,
  "processed_at": null,
  "raw": null,
  "ready_to_settle_at": null,
  "receipt_last_printed_at": null,
  "security_code_verification": null,
  "source": null,
  "split_transfers": [],
  "state": "PENDING", // [!code highlight]
  "statement_descriptor": "FLX*FINIX FLOWERS",
  "subtype": "API",
  "supplemental_fee": null,
  "tags": {},
  "third_party_details": null,
  "tip_amount": null,
  "trace_id": "5f358a23-302f-4018-8f27-ea9bb6f0a9fa",
  "type": "REVERSAL", // [!code highlight]
  "_links": {
    "application": {
      "href": "https://finix.sandbox-payments-api.com/applications/APc9vhYcPsRuTSpKD9KpMtPe"
    },
    "self": {
      "href": "https://finix.sandbox-payments-api.com/transfers/TR7PRhJjcz1RZdeXXifNVZ5E"
    },
    "parent": {
      "href": "https://finix.sandbox-payments-api.com/transfers/TR6XtdbGFs8P98TAFgLFPXzE"
    },
    "destination": {
      "href": "https://finix.sandbox-payments-api.com/payment_instruments/PI6iQcTtJNCS8GZAVKYi5Ueb"
    },
    "merchant_identity": {
      "href": "https://finix.sandbox-payments-api.com/identities/ID6UfSm1d4WPiWgLYmbyeo3H"
    },
    "payment_instruments": {
      "href": "https://finix.sandbox-payments-api.com/transfers/TR7PRhJjcz1RZdeXXifNVZ5E/payment_instruments"
    },
    "fee_profile": {
      "href": "https://finix.sandbox-payments-api.com/fee_profiles/FPuizPqrhzYLbmJm88u7aqfj"
    }
  }
}
```

### 2. Daily funding check

Before a Settlement belonging to a Merchant moves to `status: AWAITING_APPROVAL`:

1. Finix checks whether the Settlement balance covers each pending refund, starting with the oldest pending refund.
2. If it does, Finix submits the refund, moves the refund `state` to `SUCCEEDED`, and deducts it from the Settlement.
3. If the balance cannot cover a refund, the refund `state` stays `PENDING` and is checked again the next day.


Held refunds are processed in the order they were created. If the oldest pending refund cannot be covered, the refunds behind it wait, even if they are smaller.

### 3. Finix collects the refund

If incoming sales cannot cover the refund and it reaches the maximum days allowed in `state: PENDING`, as set by the [pending_refunds_strategy](#merchant-pending-refund-strategies), Finix debits the Merchant's bank account for the refund amount.

To collect the refund, Finix:

1. Creates a debit adjustment Transfer for the amount of the refund which will be deducted from the next Settlement.
2. Submits the refund 3 business days after the debit clears and creates an offsetting credit adjustment Transfer so the two adjustments net to zero for the merchant.


For more information, see [Refund Adjustments](#refund-adjustments).

### 4. Refund expiration

If the bank account debit fails and the refund still cannot be covered by the `expires_at` datetime, the refund's `state` is set to `FAILED` with a `failure_code` of `REFUND_EXPIRED`.


```json Refund - Expired
{
    "id": "TR8fezr4xCMFJvH5rzCqrUkF",
    "created_at": "2026-10-24T17:38:19.09Z",
    "updated_at": "2026-12-08T17:38:19.09Z",
    ...
    "expires_at": "2026-12-08T17:38:19.09Z",
    "failure_code": "REFUND_EXPIRED",
    "failure_message": "The refund has expired.",
    "state": "FAILED",
    "type": "REVERSAL"
}
```

## Refund adjustments

If necessary to collect funds, Finix may create adjustment Transfers with two possible `operation_key` values. These adjustments are system-generated and are always in `state: SUCCEEDED`.

| Subtype | Type | Description |
|  --- | --- | --- |
| `REFUND_MERCHANT_DEBIT_ADJUSTMENT` | `DEBIT` | Deducts the refund amount from the merchant's settlement. |
| `REFUND_MERCHANT_CREDIT_ADJUSTMENT` | `CREDIT` | Offsets the refund amount when the refund is submitted, or returns held funds if the refund expires. |



```json Refund adjustment
{
    "id": "TRaB91xboyy8mfFxZNFWf1F",
    ...
    "parent_transfer": "TR8fezr4xCMFJvH5rzCqrUkF",
    "state": "SUCCEEDED",
    "operation_key": "REFUND_MERCHANT_DEBIT_ADJUSTMENT",
    "type": "DEBIT"
}
```

Both adjustments reference the held refund in the `parent_transfer` field.

On the Settlement Entry:

- `subtype` matches the adjustment `operation_key`.
- The `parent_entity_id` field matches the adjustment `parent_transfer`.


## Webhooks

Finix sends [Transfer webhooks](/additional-resources/developers/webhooks/webhook-events#refund-debit) each time a held refund changes state:

- `PENDING` to `SUCCEEDED`: The refund was submitted.
- `PENDING` to `FAILED`: The refund expired before it could be funded.