# Underpaid payment

> A crypto payment that arrives short of the amount due. How CryptoLike keeps the address open for a top-up and what remaining_amount tells you.

Source: https://cryptolike.net/glossary/underpaid-payment
Updated: 2026-09-24

A crypto payment whose confirmed transfers add up to less than the amount due, so the order is not covered yet and the payer still owes the difference.

## How it works in CryptoLike

CryptoLike marks a payment `underpaid` when a confirmed transfer covers less than `payer_amount` and the shortfall is outside your account's underpayment tolerance. The payment stays open: the payer can send the missing part to the same address until `ttl_expires_at`, and `remaining_amount` says exactly how much is missing. A top-up that completes the amount turns the payment into `paid`.

You receive `invoice.underpaid` with `paid_amount` and `remaining_amount`. The checkout page shows how much was received and asks the payer to send the rest to the same address; its QR code and payment URI carry the remaining amount, not the original one. Even before confirmation the page compares the detected amount with the amount due, so the payer sees a short transfer at once.

When the TTL passes, `underpaid` becomes final (`is_final: true`, `expired_at` set) and the page tells the payer to contact the merchant about the partial amount. The received part stays on your balance. Decide with the customer: accept it, ask for the rest in a new payment, or return it with a payout. Funds that arrive later are credited as a late payment (`invoice.late_payment`). A small shortfall within the tolerance counts as `paid`. A common cause is an exchange that deducts its withdrawal fee from the amount sent — see [underpaid crypto payments](https://cryptolike.net/blog/underpaid-crypto-payments).

## Example

A CryptoLike `invoice.underpaid` webhook carries the full current state of the payment, so your handler can show the customer the missing amount and the deadline without another API call. The values below are illustrative; the field names are the contract:

```json
{
  "type": "invoice.underpaid",
  "data": {
    "invoice": {
      "status": "underpaid",
      "ticker": "USDT",
      "payer_amount": "25",
      "paid_amount": "20",
      "remaining_amount": "5",
      "ttl_expires_at": "2026-09-16T12:30:00Z"
    }
  }
}
```
