> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cryptocheckout.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Edge cases

> Underpayment, overpayment, wrong token, late arrivals — what each one means and what to do.

Real crypto payments go sideways in a handful of predictable ways. Each has a status rather than silently disappearing.

## Underpayment

<Columns cols={2}>
  <Card title="What happened" icon="circle-half-stroke">
    Less arrived than quoted, beyond the tolerance band. Usually an exchange deducted its withdrawal fee from the amount sent.
  </Card>

  <Card title="Status" icon="tag">
    `underpaid`, with `confirmed_amount` against `expected_amount`.
  </Card>
</Columns>

Your options:

<Steps>
  <Step title="Ask for a top-up">
    The address stays valid, and a second transfer to it is picked up and added.

    This is a manual conversation today — there is no automatic prompt to the customer. One is designed and coming.
  </Step>

  <Step title="Fulfil anyway">
    For a shortfall of a few cents, usually cheaper than the support conversation.
  </Step>

  <Step title="Refund what arrived">
    To an address the customer supplies. [Refunds](/money/refunds).
  </Step>
</Steps>

<Warning>
  Set a policy in advance — for example, honour anything within 1%, contact the customer above that. Deciding case by case is slow and inconsistent.
</Warning>

## Overpayment

More arrived than quoted. The full amount lands in your pool.

Fulfil the order and refund the difference, or credit it, depending on what you sell. Nothing is stuck.

## Wrong token

The customer sent a token you haven't enabled — often USDT when you accept USDC, on the right chain.

The funds reach the address and surface as `wrong_token`. They're recoverable, but not automatically converted. Contact the customer and either refund from your own wallet in that token, or arrange a correct payment.

<Tip>
  Most common cause is a customer copying an address from one context and paying from another. Showing the token name prominently at the payment step reduces it.
</Tip>

## Late payment

The quote expired, then the money arrived.

<Info>
  **The payment still counts.** Expiry locks the price, not the address. The chain is the source of truth, not our timer.
</Info>

Status is `expired_paid_late`. What you decide depends on how far the price moved — for stablecoin pricing, usually nothing has changed and you simply fulfil.

## Payment with no matching order

Someone paid an address from an old order, or reused one they had saved.

The funds aren't lost — they sit at an address that can only pay your pool — but working out which customer they belong to needs a human.

<Warning>
  There is no dedicated surface for these yet. Today they appear in **Payments** without a matching order, so spotting one means noticing it there. A dedicated Unsettled view is designed and coming. [Roadmap](/reference/roadmap).
</Warning>

<Tip>
  Put a weekly scan of Payments for unmatched arrivals in someone's routine. It's usually empty, and when it isn't, it's a customer waiting.
</Tip>

## Held for compliance

If you've enabled payer screening and a payment trips it, it shows as `held_sanctioned` pending review rather than settling silently. [Sanctions](/compliance/sanctions).

## Quick reference

| Status              | Money safe | Needs you | Typical response          |
| ------------------- | :--------: | :-------: | ------------------------- |
| `underpaid`         |     Yes    |    Yes    | Top-up, absorb, or refund |
| `overpaid`          |     Yes    |    Yes    | Fulfil, refund difference |
| `wrong_token`       |     Yes    |    Yes    | Contact customer          |
| `expired_paid_late` |     Yes    |   Maybe   | Usually just fulfil       |
| `held_sanctioned`   |     Yes    |    Yes    | Compliance review         |
| Unmatched           |     Yes    |    Yes    | Identify the customer     |

<Note>
  In every row the money is safe. These are attribution and policy problems, not loss events. The forwarder address commits to your pool, so funds sent to it can only ever reach you.
</Note>
