> ## 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.

# Receiving payments

> What happens between a customer paying and your balance going up.

## The path

```mermaid theme={null}
flowchart TD
    A[Customer pays] --> B{Which rail?}
    B -->|Connect| C[Straight into your pool]
    B -->|Deposit| D[One-time address]
    D --> E[We deploy and sweep]
    E --> C
    C --> F[Balance available to claim]
    style F fill:#064e3b,stroke:#10B981,color:#fff
```

## Timing

| Step                          | Typical                                                   |
| ----------------------------- | --------------------------------------------------------- |
| Customer sends                | Seconds to minutes, depending on their wallet or exchange |
| Confirmations                 | Seconds on L2s, minutes on Ethereum, \~1 minute on TRON   |
| Our sweep (deposit rail only) | Automatic, shortly after confirmation                     |
| `payment_confirmed` webhook   | Immediately once final                                    |

An exchange withdrawal can take hours — that's the exchange's processing, not the chain. The address stays valid, so it arrives whenever it arrives.

## What you receive

You receive the **settlement token you chose**, in your pool, on the chain the customer paid on.

<Note>
  Amounts are stored and reported in token base units. On most chains USDC, USDT, and EURC use 6 decimals, so `49000000` is 49.00.

  **Do not hardcode 6.** Token decimals vary by chain — on BNB Chain these tokens are 18-decimal. Always scale by the `tokenDecimals` returned with the payment.
</Note>

## Cross-token and cross-chain arrivals

The deposit rail accepts **value**, not one exact token on one exact chain. A customer who pays the right value in a different enabled stablecoin, or on a different enabled chain, is reconciled rather than rejected.

Something you haven't enabled surfaces as `wrong_token` for you to handle. [Edge cases](/money/edge-cases).

## Tolerance

Quotes carry a small tolerance band, because exchange withdrawals often deduct a network fee from the amount sent. A customer who intended to send exactly right can land slightly under through no fault of their own.

Inside the band, the payment settles as `paid`. Outside it, `underpaid` or `overpaid`.

## Watching it

<Columns cols={3}>
  <Card title="Webhooks" icon="webhook" href="/webhooks/overview">
    Push. The one to build against.
  </Card>

  <Card title="Status API" icon="code" href="/api/payment-status">
    Pull. Good for reconciliation.
  </Card>

  <Card title="Dashboard" icon="table" href="/dashboard/payments">
    Human view, with CSV export.
  </Card>
</Columns>

## What can go wrong

<AccordionGroup>
  <Accordion title="Nothing arrives" icon="clock">
    Usually the customer hasn't sent yet, or their exchange is slow. The address stays valid indefinitely — there's nothing to reissue.
  </Accordion>

  <Accordion title="Less arrives than expected" icon="circle-half-stroke">
    Often an exchange fee deducted from the send. Inside tolerance it settles normally; outside it becomes `underpaid`. [Edge cases](/money/edge-cases).
  </Accordion>

  <Accordion title="It arrives after expiry" icon="hourglass-end">
    Still credited, flagged as paid late. You decide whether to honour the original price.
  </Accordion>

  <Accordion title="A payment arrives with no matching order" icon="circle-question">
    Someone reused an old address. The money is safe, but matching it to a customer is manual — it appears in Payments without a matching order. A dedicated Unsettled view is coming.
  </Accordion>
</AccordionGroup>
