No merchant KYC · Customers pay fiat, you get stablecoins · Onboarding is openApply now →

Docs / Payment statuses

Payment statuses: OPEN, PARTIALLY_FILLED, FILLED, OVER_FILLED and CANCELLED

A payment goes through a few states between creation and completion. Knowing what each means tells you when to ship and when to refund.

The short version: a PayRam payment has just five states. FILLED means paid in full, so ship. PARTIALLY_FILLED is an underpayment, so do not ship yet. OVER_FILLED is an overpayment: ship, and decide what to do with the excess. OPEN is still waiting for payment. CANCELLED means cancelled or expired.

1. The five states at a glance

StateMeaningWhat you do
OPENThe payment was created and no deposit has been detected yet (or the filled amount is zero)Keep waiting. The order stays "awaiting payment"
PARTIALLY_FILLEDA deposit was detected, but the filled amount is less than the requested amountDo not ship. Ask the customer to top up, or follow your own policy, see below
FILLEDThe filled amount equals the requested amountFulfil the order or activate the service as normal
OVER_FILLEDThe filled amount is greater than the requested amountYou can ship, and you decide what to do with the excess
CANCELLEDThe payment was cancelled, usually because the payment link expiredClose the order. Let the customer start again if they still want to buy

In the dashboard's payment link list you will see a simplified display: Pending, Successful and Cancelled. The API and webhooks use the five values above.

2. How states change

OPEN  →  (deposit detected → confirming: 1/N, 2/N … N/N)  →  FILLED
                                                           or PARTIALLY_FILLED
                                                           or OVER_FILLED
OPEN  →  CANCELLED (the payment link expired or was cancelled)

A payment link expires after 24 hours by default, after which its state becomes CANCELLED. You can set a different window with expire when creating the payment.

3. Confirmation progress: the stage before it settles

An on-chain payment is not instant. It has to wait for block confirmations. During that time webhooks carry two numbers: confirmation_current (confirmations so far) and confirmation_required (confirmations needed), for example 3 / 12 or 5 / 12. You can use them to show "confirming 5 / 12" so the customer knows nothing is stuck.

On the final closed or cancelled notification both numbers are 0. Until the required confirmations are reached, the payment is not treated as settled.

4. How to handle each state

What follows is our suggested approach. Set the exact rules according to your own business policy.

FILLED: paid in full

This is the signal to ship. On receiving the notification, verify the signature and de-duplicate by reference_id, then mark the order paid. For important orders, double-check with the status endpoint. See the webhook guide.

PARTIALLY_FILLED: underpaid

According to the official documentation, an underpaid payment stays incomplete until the full amount is received. Common practice:

  • Tell the customer how much is missing and ask them to top up before the payment link expires.
  • If it is still short at expiry, you decide: close the order and refund what was received, or agree a top-up with the customer.
  • A refund is a new payout sent from the hot wallet. See refunds and payouts.

OVER_FILLED: overpaid

The excess is clearly shown in the dashboard, and you decide: refund the extra to the customer, or record it as a customer credit against future invoices. Whichever you choose, keep a record and note it on the order.

CANCELLED: cancelled or expired

Close the order. If the customer still wants to buy, create a new payment rather than reusing the expired link. If a customer pays after the link has expired, first look up the payment record in the dashboard and then decide whether to refund or reinstate the order. Do not act on assumptions.

5. Ways to reduce underpayments and overpayments

  • Warn customers about exchange withdrawal fees. Some exchanges deduct the network fee from the withdrawn amount, so the customer's payment arrives short. Ask customers to choose "fee on top" when withdrawing, or to send slightly more.
  • Restrict the coin and network. Use currency and network when creating a payment to narrow the choice, for example USDC on Base only. That leaves less room for choosing the wrong network.
  • State the amount and network clearly on the payment page. Sending on the wrong network or the wrong coin may make funds unrecoverable.
  • Use stablecoins. With USDT or USDC the amount due is barely affected by price swings, so customers are less likely to come up short because the price moved.

6. Keep your order status in sync with webhooks and the status endpoint

We recommend using both together:

  1. Webhooks: they tell you the moment the state changes and are your main source.
  2. The status endpoint: query with the stored reference_id. The paymentState in the response is the current state. Use it to double-check and as a fallback.
curl --location 'https://pay.payramhost.com/api/v1/payment/reference/<reference_id>' \
  --header 'API-Key: <your_api_key>'

The full integration flow is in the API integration guide.

7. FAQ

After PARTIALLY_FILLED the customer tops up. Does the state change?

Yes. According to the official documentation an underpaid payment stays incomplete until the full amount arrives. Once the total reaches the requested amount the state becomes FILLED, and you will normally get a new notification. So your handler must not assume "one notification and done". Update on each change of state.

Can the state go backwards, for example from FILLED to OPEN?

In the normal flow states only move forward. To be safe, your handler should accept only a "later" state and ignore stale duplicates.

I received a notification with status OPEN. Is something wrong?

No. OPEN means the payment has been created and no deposit has been detected yet. Keep waiting. Once a deposit is detected, notifications carry the confirmation progress described above.

Can a customer still pay after CANCELLED?

You should not allow it. Treat a cancelled payment as finished and have the customer start a new one.

  • Webhook guide: How to receive PayRam webhooks: register an endpoint, verify X-Payram-Signature, understand retry rules and payment states, handle duplicates, with Node.js and Python examples.
  • Create payments via API: Add crypto payments to your own site with the PayRam API: create a payment and get a payment link, send the customer to the payment page, confirm receipt with webhooks and the status endpoint, and reconcile by order number. With curl, Node.js and Python examples.
  • Refunds and payouts: On-chain payments have no chargeback, so refunds are manual. How PayRam payouts work: address book, approvals and one-time codes, limits, status meanings, and what to check before you refund.