> Documentation index: [Saleor](/llms.txt) · [This section](/developer/llms.txt)
> Source: https://docs.saleor.io/developer/checkout/troubleshooting

# Checkout Troubleshooting

<a id="missing-shipping-methods"></a>

### Missing Shipping Methods

1.  Shipping methods are contextual to channels and need to be enabled in the channel the checkout is created.
2.  Shipping methods can be available only for specific countries. If checkout does not contain shipping country, the default country of the channel will be used.

<a id="variantproduct-is-not-available"></a>

### Variant/Product is not available

Make sure product is available in the channel the checkout is created. See [Product Troubleshooting](/developer/products/troubleshooting.md).

<a id="resolving-paid-checkouts-not-converting-to-orders"></a>

### Resolving Paid Checkouts Not Converting to Orders

Sometimes, a `Checkout` that has been paid might not convert into an `Order`. This can happen for various reasons, such as the customer closing the browser before the `checkoutComplete` mutation was called. To ensure that fully paid checkouts are reliably converted into orders, consider implementing one of the following solutions:

<a id="solution-1-enable-automatic-checkout-completion-recommended"></a>

#### Solution 1: Enable Automatic Checkout Completion \[Recommended\]

Enable [automatic checkout completion](/developer/payments/transactions.md#automatic-checkout-completion) to automatically convert a `Checkout` into an `Order` once it is fully paid.

A checkout is considered fully paid when `Checkout.authorizeStatus` is set to `FULL`, meaning the associated `TransactionItems` cover the `checkout.totalPrice`.

<a id="solution-2-use-a-webhook-to-complete-checkouts"></a>

#### Solution 2: Use a Webhook to Complete Checkouts

Set up the `CHECKOUT_FULLY_PAID` webhook, and create an app to call the `checkoutComplete` mutation when this webhook is triggered. • For more information on setting up webhooks, refer to the [webhook overview](/developer/extending/webhooks/overview.md). • You can find guidance on app development [here](/developer/extending/apps/overview.md).

Note: This approach only works when the `CHARGE` is used as the default transaction flow strategy.

<a id="solution-3-periodically-query-uncompleted-fully-paid-checkouts"></a>

#### Solution 3: Periodically Query Uncompleted Fully Paid Checkouts

Implement a periodic check to query for fully paid checkouts that have not been completed, then complete them manually. To retrieve uncompleted checkouts, use the `checkouts` query with a filter for `authorizeStatus: FULL`, as shown below:

**Mutation**

```graphql
query checkouts($first: Int, $filter: CheckoutFilterInput) {
  checkouts(first: $first, filter: $filter) {
    totalCount
    edges {
      node {
        id
        totalBalance {
          amount
        }
      }
    }
  }
}
```

**Variables**

```json
{
  "first": 2,
  "filter": {
    "authorizeStatus": [
      "FULL"
    ]
  }
}
```

note

These solutions do not apply to partially paid checkouts, which require additional handling. For example, you may choose to send payment reminders or adjust the `Periodically Query Uncompleted Fully Paid Checkouts` approach to filter out checkouts that are not yet fully paid.

note

If the channel has `releaseFundsForExpiredCheckouts` enabled, funds for abandoned checkouts in that channel are automatically released after a specified time (default is 6 hours). This is disabled by default and configured per channel. More information on this process is available [here](/developer/checkout/lifecycle.md#releasing-funds-for-abandoned-checkouts).
