> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.coinflow.cash/guides/developer-resources/webhooks/checkout-webhooks/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.coinflow.cash/_mcp/server.
# Checkout / Subscription Webhooks
> **Note**
>
> ## Webhooks may be sent more than once—add deduplication logic to prevent duplicate events.
## ✅ Event Types
|
Event Type
|
Description
|
|
Settled
|
Payment completed and funds have been sent to the merchant's settlement location. The merchant now has possession of the funds.
|
|
Disbursed Funds
|
Funds were successfully disbursed (USDC or Credits) and the disbursement transaction signature is now available. Always includes the `signature`.
|
|
Card Payment Authorized
|
Card issuer authorized the payer's credit card.
|
|
Card Payment Declined
|
Card issuer declined the payer's credit card.
|
|
Card Payment Suspected Fraud
|
Chargeback protection provider rejected the payment due to suspicion of fraud.
|
|
Payment Pending Review
|
Chargeback protection provider rejected the payment; Payment is under review, awaiting merchant reviewal and approval. (Only applicable to Merchants with
[Pending Review feature enabled](/guides/checkout/payment-security-risk-management/fraud-protection/overriding-chargeback-protection#3-overriding-with-pending-manual-reviews)
).
|
|
Card Payment Chargeback Opened
|
A chargeback investigation had been initiated for a payment.
|
|
Card Payment Chargeback Won
|
Chargeback resolved in favor of the merchant for the card payment.
|
|
Card Payment Chargeback Lost
|
Chargeback resolved in favor of the cardholder for the card payment.
|
|
ACH Initiated
|
An ACH payment has been started.
|
|
ACH Batched
|
ACH payment accepted by the bank and is being processed.
|
|
ACH Returned
|
The bank has marked the ACH payment as returned.
|
|
ACH Failed
|
An ACH payment was denied by the bank.
|
|
PIX Failed
|
PIX payment failed during processing.
|
|
PIX Expiration
|
Payment window expired before PIX transaction was completed.
|
|
Payment Expiration
|
Payment window expired before transaction was completed (Applicable for PIX payin, SEPA Payin)
|
|
Subscription Created
|
A subscription was purchased and activated.
|
|
Subscription Canceled
|
A subscription was cancelled by the customer.
|
|
Subscription Expired
|
The subscription plan is no longer active because it cannot be renewed.
|
|
Subscription Failure
|
Payment failed causing subscription to not be created or renewed.
|
|
Subscription Concluded
|
The duration of the subscription has run its course.
|
|
Refund
|
A payment has been refunded
|
|
Unknown Wire Payment Received
|
An incoming wire could not be matched to a pending payment and was recorded as an unknown wire on your account. Use this event to reconcile or return the wire from your own systems.
|
> **Note**
>
> Stablecoin pay-ins fire a separate set of webhook events — see the **Advanced: Stablecoin Payment Events** section below.
---
## Sample Webhook Payloads
Below are example webhook events that your system can listen to. Each tab represents a different event type, organized by payment method. These events are sent to your configured webhook endpoint and follow a consistent data structure. You can opt in to receive any combination of these events based on your integration needs.
For each event, you’ll see:
* `eventType` – the type of event triggered (e.g., Settled, Card Payment Declined)
* `category` – the type of transaction, such as Purchase
* `created` – the UTC datetime event was sent
* `data` – the details of the transaction, including amounts, fees, customer information, and metadata
## Total & Fee Breakdown Currencies
Every payment event carries two complete breakdowns, so you never have to infer
which currency an amount is in:
* `presentmentTotals` – the breakdown in the currency you priced the payment in,
i.e. whatever you passed as `subtotal.currency` at checkout.
* `settlementTotals` – the breakdown in USD, the currency you are settled in.
Both objects use the same field names as the top-level breakdown (`subtotal`,
`fees`, `gasFees`, `chargebackProtectionFees`, `fxFees`, `networkFees`,
`payInFees`, `total`, `rebate`, the `merchantPaid*` fields and the `invoiced*`
fields), and each amount states its own `currency`. For a payment priced in USD
the two objects are identical.
> **Note**
>
> The **top-level** breakdown fields — `subtotal`, `fees`, `total` and the rest,
> which sit beside the two objects above — do not all use the same currency for
> non-USD payments. Which currency you get depends on the event and on when it
> fired:
>
> * `Card Payment Declined` reports them in your presentment currency when the
> card is declined during checkout, and in USD when the payment had already
> been recorded before the failure.
> * `Payment Pending Review` reports them in USD.
> * `Card Payment Authorized`, `Settled`, `Card Payment Voided` and the
> chargeback events report them in USD.
>
> This is permanent, supported behavior: these fields will keep working exactly
> as they do today, and there is no plan to change or remove them. Existing
> integrations need no changes. If you price payments in a currency other than
> USD and want one currency across every event type, read `presentmentTotals`
> and `settlementTotals`.
> **Note**
>
> `presentmentTotals` carries every fee leg on events that fire during checkout
> (`Card Payment Declined`, `Payment Pending Review`). On events raised from a
> stored payment (`Card Payment Authorized`, `Settled`, `Card Payment Voided`,
> the chargeback events) its `payInFees` and `reserve` are always absent,
> because the stored presentment record does not keep those two legs. Both are
> always present on `settlementTotals`. Read either as optional.
### Credit / Debit Card, Apple / Google Pay Events
**`Settled`**
```json Settled
// Sent when credit card payment is complete; Funds have been taken from payer and are in your merchant settlement wallet
{
"eventType": "Settled",
"category": "Purchase",
"created": "2025-04-28T20:11:07.608Z",
"data": {
"id": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"signature": "3zP3VcWM6rKF1izpnWn5rJ7XJucoEicwncQ9hvGR7Q7FuGvDPenfBrfLUVc4fjbYghnzauTDfY4c8Jc2Nb5y1AWm",
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"cents": 500,
"currency": "USD"
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"payInFees": {
"cents": 50,
"currency": "USD"
},
"rebate": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"presentmentTotals": {
"subtotal": { "cents": 700, "currency": "CAD" },
"fees": { "cents": 64, "currency": "CAD" },
"gasFees": { "cents": 0, "currency": "CAD" },
"chargebackProtectionFees": { "cents": 0, "currency": "CAD" },
"total": { "cents": 764, "currency": "CAD" }
},
"settlementTotals": {
"subtotal": { "cents": 500, "currency": "USD" },
"fees": { "cents": 46, "currency": "USD" },
"gasFees": { "cents": 0, "currency": "USD" },
"chargebackProtectionFees": { "cents": 0, "currency": "USD" },
"payInFees": { "cents": 50, "currency": "USD" },
"total": { "cents": 546, "currency": "USD" }
},
"merchantId": "testtest",
"customerId": "customer1",
"rawCustomerId": "customer1",
"cardToken": "tok_abc123",
"last4": "1111",
"bin": "411111"
}
}
```
**`Card Payment Authorized`**
```json Card Payment Authorized
// Sent when a customers card has been authorized for the payment but payment has not been captured
{
"eventType": "Card Payment Authorized",
"category": "Purchase",
"created": "2025-04-28T20:11:04.046Z",
"data": {
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"currency": "USD",
"cents": 500
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"payInFees": {
"cents": 50,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"merchantId": "testtest",
"id": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"customerId": "customer1",
"rawCustomerId": "customer1",
"cardToken": "tok_abc123",
"last4": "1111",
"bin": "411111"
}
}
```
**`Card Payment Declined`**
```json Card Payment Declined
// Sent when a customers card has failed authorized for the payment. This typically comes from the issuing bank.
{
"eventType": "Card Payment Declined",
"category": "Purchase",
"created": "2025-04-28T20:21:50.163Z",
"data": {
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"currency": "USD",
"cents": 500
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"merchantId": "testtest",
"id": "bce7ca59-4bcc-43c3-95f1-51f2858b0bd2",
"declineCode": "59",
"declineDescription": "The transaction is suspected of fraud.",
"customerId": "customer1",
"rawCustomerId": "customer1",
"cardToken": "tok_abc123",
"last4": "1111",
"bin": "411111"
}
}
```
**`Payment Pending Review`**
```json Payment Pending Review
// Sent when a payment has been rejected by payment and is awaiting for merchant to review. This is only valid for merchants who have pending review feature enabled.
{
"eventType": "Payment Pending Review",
"category": "Purchase",
"created": "2025-04-11T22:40:26.465Z",
"data": {
"webhookInfo": {
"example": "{\"platformId\":\"1234\"}"
},
"subtotal": {
"currency": "USD",
"cents": 1000
},
"fees": {
"cents": 61,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 1061,
"currency": "USD"
},
"merchantId": "testtest",
"id": "386b9884-8d32-471f-b059-126cb5cd5abf",
"customerId": "payer123",
"cardToken": "tok_abc123",
"last4": "4242",
"bin": "424242"
}
}
```
**`Refund`**
```Text Refund
{
"eventType": "Refund",
"category": "Purchase",
"created": "2025-04-28T20:11:04.046Z",
"data":
{
"totals":
{
"subtotal":
{
"currency": "USD",
"cents": 500
},
"fees":
{
"cents": 46,
"currency": "USD"
},
"gasFees":
{
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees":
{
"cents": 0,
"currency": "USD"
},
"total":
{
"cents": 546,
"currency": "USD"
}
},
"refundId": "6a7cc65f370f0694677d656d",
"paymentId": "0197a7e7-54e4-74c9-b708-1632923c1bf0",
"wallet": "0197a7e8-b63f-7118-81ef-b5f091466ae6"
}
}
```
> **Note**
>
> `refundId` uniquely identifies the refund itself, while `paymentId` identifies the payment being
> refunded. A payment can have several partial refunds, so use `refundId` to tell them apart and to
> process refund webhooks idempotently. It matches the `id` returned by the
> [View Refund Information for Payment](/api-reference/api-reference/refund/get-refund-via-payment-id)
> endpoint. The same field is present on the `Refund Complete`, `Refund Failure`, and
> `Refund Returned` events.
### Advanced: Disbursement Events
Coinflow decouples **disbursement** (sending the funds to the merchant on-chain) from **settlement**. The `Disbursed Funds` event fires as soon as a USDC or Credits disbursement transaction succeeds and a transaction signature is available — which may be before or independent of the `Settled` event.
> **Tip**
>
> Use `Disbursed Funds` when you need the on-chain transaction `signature` for every disbursement. Unlike `Settled`, this event **always** includes the `signature`.
**`Disbursed Funds`**
```json Disbursed Funds
// Sent when funds are successfully disbursed on-chain (USDC or Credits) and the transaction signature is available
{
"eventType": "Disbursed Funds",
"category": "Purchase",
"created": "2025-04-28T20:11:07.608Z",
"data": {
"id": "0197a7e7-54e4-74c9-b708-1632923c1bf0",
"merchantId": "testtest",
"signature": "3zP3VcWM6rKF1izpnWn5rJ7XJucoEicwncQ9hvGR7Q7FuGvDPenfBrfLUVc4fjbYghnzauTDfY4c8Jc2Nb5y1AWm",
"settlementType": "USDC",
"blockchain": "solana",
"amount": {
"cents": 546,
"currency": "USD"
},
"disbursedAt": "2025-04-28T20:11:07.608Z"
}
}
```
The fields in the `data` object are:
|
`id`
|
The unique identifier of the payment that was disbursed.
|
|
`merchantId`
|
The identifier of the merchant receiving the disbursement.
|
|
`signature`
|
The on-chain transaction signature for the disbursement. Always present on this event.
|
|
`settlementType`
|
How the funds were disbursed — `USDC` or `Credits`.
|
|
`blockchain`
|
The network the disbursement settled on (for example `solana`, `eth`, `polygon`, `base`, or `stellar`).
|
|
`amount`
|
The disbursed amount, expressed in `cents` with its `currency`.
|
|
`disbursedAt`
|
The UTC datetime the funds were disbursed.
|
> **Note**
>
> The example values above (such as `signature`, `id`, and `merchantId`) are illustrative only and do not reflect real production values.
### Chargeback Events
See our guide: [How to Test Chargeback Events](/guides/developer-resources/webhooks/checkout-webhooks/how-to-test-chargeback-events) to learn how to force chargeback events on sandbox.
**`Chargeback Opened`**
```json Chargeback Opened
{
"eventType": "Card Payment Chargeback Opened",
"category": "Purchase",
"created": "2025-06-18T05:00:27.949Z",
"data": {
"id": "c10d7ac6-cca8-436b-b99f-2c7418f1cbe1",
"webhookInfo": {
"orderId": 123abc
},
"subtotal": {
"cents": 2500,
"currency": "USD"
},
"fees": {
"cents": 169,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 68,
"currency": "USD"
},
"total": {
"cents": 2737,
"currency": "USD"
},
"merchantId": "testtest",
"chargebackId": "11111111111111111111111",
"reasonCode": "4853",
"reasonDescription": "Merchandise/Services Not as Described",
"respondByDate": "2025-07-01T00:00:00.000Z",
"customerId": "user123",
"rawCustomerId": "user123"
}
}
```
**`Chargeback Lost`**
```json Chargeback Lost
{
"eventType": "Card Payment Chargeback Lost",
"category": "Purchase",
"created": "2025-05-16T11:00:04.990Z",
"data": {
"id": "c10d7ac6-cca8-436b-b99f-2c7418f1cbe1",
"webhookInfo": {
"orderId": 123abc,
},
"subtotal": {
"cents": 3000,
"currency": "USD"
},
"fees": {
"cents": 195,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 74,
"currency": "USD"
},
"total": {
"cents": 3269,
"currency": "USD"
},
"merchantId": "testtest",
"chargebackId": "11111111111111111111111",
"reasonCode": "4853",
"reasonDescription": "(old) Cardholder Dispute Defective/Not as Described",
"respondByDate": "2025-05-06T00:00:00.000Z"
}
}
```
**`Chargeback Won`**
```json Chargeback Won
{
"eventType": "Card Payment Chargeback Won",
"category": "Purchase",
"created": "2025-05-18T11:00:08.370Z",
"data": {
"id": "c10d7ac6-cca8-436b-b99f-2c7418f1cbe1",
"webhookInfo": {
"orderID": "123abc"
},
"subtotal": {
"cents": 499,
"currency": "USD"
},
"fees": {
"cents": 0,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 499,
"currency": "USD"
},
"merchantId": "testtest",
"chargebackId": "11111111111111111111111",
"reasonCode": "13.1",
"reasonDescription": "VCR Merchandise/Services Not Received",
"respondByDate": "2025-05-01T00:00:00.000Z"
}
}
```
\
### ACH Events
**`Settled`**
```json Settled
// Sent when ACH payment is complete; Funds have been taken from payer and are in your merchant settlement wallet
{
"eventType": "Settled",
"category": "Purchase",
"created": "2025-04-17T14:16:09.112Z",
"data": {
"id": "gppstl08os-x211-sckkkweycuvpimd216ye7zxp",
"signature": "4oUoUooodnytPPtazQghV8VH2BuvQUDWLEwrEHyzwJFomKHVNhYo0CQiB3rKLmHooooWdWrWDXuw0Uy0tReSwZXo",
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"cents": 100,
"currency": "USD"
},
"fees": {
"cents": 1,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 101,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "customer1",
"rawCustomerId": "customer1"
}
}
```
**`ACH Initiated`**
```json ACH Initiated
//Sent when customerfirst submits an ACH payment
{
"eventType": "ACH Initiated",
"category": "Purchase",
"created": "2025-04-16T17:44:10.415Z",
"data": {
"id": "3dac0993-ecec-4843-8f07-a47c7f3389dc",
"webhookInfo": {
"item": "sword",
"email": "tester@test.com"
},
"subtotal": {
"cents": 300,
"currency": "USD"
},
"fees": {
"cents": 0,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 300,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "customer1"
}
}
```
**`ACH Batched`**
```json ACH Batched
//Sent when ACH system has picked up the payment to begin processing
{
"eventType": "ACH Batched",
"category": "Purchase",
"created": "2025-04-16T17:46:05.311Z",
"data": {
"id": "3dac0993-ecec-4843-8f07-a47c7f3389dc",
"webhookInfo": {
"item": "sword",
"email": "tester@test.com"
},
"subtotal": {
"cents": 300,
"currency": "USD"
},
"fees": {
"cents": 0,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 300,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "customer1"
}
}
```
**`ACH Returned`**
```json ACH Returned
//Sent when funds are sent back to the bank acount
{
"eventType": "ACH Returned",
"category": "Purchase",
"created": "2025-04-17T14:16:02.111Z",
"data": {
"id": "3dac0993-ecec-4843-8f07-a47c7f3389dc",
"webhookInfo": {
"item": "sword",
"email": "tester@test.com"
},
"subtotal": {
"cents": 300,
"currency": "USD"
},
"fees": {
"cents": 0,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 300,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "customer1"
}
}
```
**`ACH Failed`**
```json ACH Failed
//Sent when the ACH payment was unsuccessfully processed
{
"eventType": "ACH Failed",
"category": "Purchase",
"created": "2025-04-16T22:53:02.052Z",
"data": {
"id": "nhrpa02zhq-x301-xyyc53bxepm0rnp8rbbffykd",
"webhookInfo": {
"item": "sword",
"email": "tester@test.com"
},
"subtotal": {
"cents": 1000,
"currency": "USD"
},
"fees": {
"cents": 0,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 1000,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "customer1"
}
}
```
### PayPal / Venmo Events
`paymentMethodToken` is the vaulted payment method token for the payment. It is present on the `PayPal Payment Authorized`, `Venmo Payment Authorized`, and `Settled` events when a token exists on the payment.
`payerName`, `payerFirstName`, and `payerLastName` identify the PayPal/Venmo account holder. They are present on the `PayPal Payment Authorized`, `Venmo Payment Authorized`, and `Settled` events when the payer identity was captured on the payment.
`payerId` is the payer's stable account id at the payment provider. It is present on the `PayPal Payment Authorized`, `Venmo Payment Authorized`, and `Settled` events when the provider returned one.
> **Warning**
>
> `payerId` is optional. Both PayPal and Venmo pay-ins can carry it — they share the same PayPal application and pay-in webhook — but the provider only returns it on some approvals, and when it is missing the field is omitted from the payload rather than sent empty. Always treat it as optional and fall back to `payerName` or the payer's email.
>
> Availability on a **payout destination** is narrower and follows a different rule: see the `Payout Account Linked` event in [Withdraw Webhooks](/guides/developer-resources/webhooks/withdraw-webhooks). All example values on this page, `payerId` included, are placeholders rather than real identifiers.
**`PayPal Payment Authorized`**
```json PayPal Payment Authorized
// Sent when a PayPal payment has been authorized but not yet captured
{
"eventType": "PayPal Payment Authorized",
"category": "Purchase",
"created": "2025-04-28T20:11:04.046Z",
"data": {
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"cents": 500,
"currency": "USD"
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"merchantId": "testtest",
"id": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"customerId": "customer1",
"paymentMethod": "paypal",
"paymentMethodToken": "tok_paypal_abc123",
"payerId": "EXAMPLEPAYER1",
"payerName": "John Doe",
"payerFirstName": "John",
"payerLastName": "Doe"
}
}
```
**`Venmo Payment Authorized`**
```json Venmo Payment Authorized
// Sent when a Venmo payment has been authorized but not yet captured
{
"eventType": "Venmo Payment Authorized",
"category": "Purchase",
"created": "2025-04-28T20:11:04.046Z",
"data": {
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"cents": 500,
"currency": "USD"
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"merchantId": "testtest",
"id": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"customerId": "customer1",
"paymentMethod": "venmo",
"paymentMethodToken": "tok_venmo_abc123",
"payerId": "EXAMPLEPAYER1",
"payerName": "John Doe",
"payerFirstName": "John",
"payerLastName": "Doe"
}
}
```
**`Settled`**
```json Settled
// Sent when a PayPal or Venmo payment is complete; Funds are in your merchant settlement wallet
{
"eventType": "Settled",
"category": "Purchase",
"created": "2025-04-28T20:11:07.608Z",
"data": {
"id": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"signature": "3zP3VcWM6rKF1izpnWn5rJ7XJucoEicwncQ9hvGR7Q7FuGvDPenfBrfLUVc4fjbYghnzauTDfY4c8Jc2Nb5y1AWm",
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"cents": 500,
"currency": "USD"
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "customer1",
"rawCustomerId": "customer1",
"paymentMethod": "paypal",
"paymentMethodToken": "tok_paypal_abc123",
"payerId": "EXAMPLEPAYER1",
"payerName": "John Doe",
"payerFirstName": "John",
"payerLastName": "Doe"
}
}
```
\
### PIX Events
**`Settled`**
```json Settled
// Sent when PIX payment is complete; Funds have been taken from payer and are in your merchant settlement wallet
{
"eventType": "Settled",
"category": "Purchase",
"created": "2025-04-21T23:20:12.114Z",
"data": {
"id": "m22rp5miieczp7ap6p",
"signature": "77f07ff4bc3db65517p2fp31",
"webhookInfo": {
"example": "{\"purchaseId\":\"123abc\"}"
},
"subtotal": {
"cents": 1000,
"currency": "USD"
},
"fees": {
"cents": 117,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 1117,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "8zdj6f58ZfNDxDy6bArCDjVhWJ7Mwtigqh2M7VZYv9Qm"
}
}
```
**`PIX Expiration`**
```json PIX Expiration
// Sent when the timeframe to send pix payment has ended and payer has not sent the funds
{
"eventType": "PIX Expiration",
"category": "Purchase",
"created": "2025-04-21T22:20:00.154Z",
"data": {
"id": "f1626226-0de0-4242-8ab9-7d8d18d79787",
"subtotal": {
"cents": 200,
"currency": "USD"
},
"fees": {
"cents": 4,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 204,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "8zdj6f58ZfNDxDy6bArCDjVhWJ7Mwtigqh2M7VZYv9Qm"
}
}
```
**`PIX Failed`**
```json PIX Failed
// Sent when the PIX payment was unsuccessful and funds were not sent
{
"eventType": "PIX Failed",
"category": "Purchase",
"created": "2025-04-21T22:22:00.154Z",
"data": {
"id": "m34qr5dpopksr56nrz",
"subtotal": {
"cents": 200,
"currency": "USD"
},
"fees": {
"cents": 4,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 204,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "8zdj6f58ZfNDxDy6bArCDjVhWJ7Mwtigqh2M7VZYv9Qm"
}
}
```
### Subscription Events
**`Settled`**
```json Settled
// Sent when payment for a subscription is complete; Funds have been taken from payer and are in your merchant settlement wallet
{
"eventType": "Settled",
"category": "Purchase",
"created": "2025-04-28T20:28:10.894Z",
"data": {
"id": "db746ccf-6dce-4019-b34b-b35a957cb5aa",
"signature": "5utLY7sWhJiXtRiw8jQ3thqyubcmsPh9rN9rWpsU4i3jw9mwwbkYchDpEEoZ3sTF8DosiwffQHbEXP5Zk5RE1fQo",
"webhookInfo": {
"item": "sword"
},
"subtotal": {
"cents": 500,
"currency": "USD"
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"subscription": {
"_id": "680fe4d832ddccc1ee91885e",
"customer": "66ce47a1e487adc8f4ab0d46",
"merchant": "66311727a26b3cb28faaf97d",
"plan": {
"amount": {
"cents": 500,
"currency": "USD"
},
"_id": "67bf86d03716ba82ce5cd096",
"merchant": "66311727a26b3cb28faaf97d",
"name": "creator1234",
"code": "music_access",
"interval": "Monthly",
"duration": 12,
"description": "Monthly subscription for fans to gain access to listen to Creator 1234 songs",
"active": true,
"__v": 0
},
"cardProcessor": "mock",
"reference": "f008bb21-f6a1-4947-b271-90e78638f379",
"nextPaymentAt": "2025-05-28T20:28:08.164Z",
"status": "Active",
"webhookInfo": {
"item": "sword"
},
"createdAt": "2025-04-28T20:28:08.169Z",
"updatedAt": "2025-04-28T20:28:08.169Z",
"__v": 0
},
"merchantId": "testtest",
"customerId": "78C3dn4yUJST9pcX9GtA3yWBcKUCjDw1RWqw1MLpoUDh",
"rawCustomerId": "78C3dn4yUJST9pcX9GtA3yWBcKUCjDw1RWqw1MLpoUDh"
}
}
```
**`Card Payment Authorized`**
```json Card Payment Authorized
// Sent when a customers card gets re-charged for their monthly/yearly subscription plan and the card has been authorized for the payment but not yet captured
{
"eventType": "Card Payment Authorized",
"category": "Purchase",
"created": "2025-04-28T20:31:19.543Z",
"data": {
"webhookInfo": {
"item": "sword",
"email": ""
},
"subtotal": {
"cents": 500,
"currency": "USD"
},
"fees": {
"cents": 46,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 546,
"currency": "USD"
},
"merchantId": "testtest",
"id": "39ffc711-8023-46cf-b6ad-5dac81afec88",
"subscription": {
"_id": "67d07938a899c293e0ae2147",
"customer": "67d07935a899c293e0ae2132",
"merchant": "66311727a26b3cb28faaf97d",
"plan": {
"amount": {
"cents": 500,
"currency": "USD"
},
"_id": "67bf86d03716ba82ce5cd096",
"merchant": "66311727a26b3cb28faaf97d",
"name": "creator1234",
"code": "music_access",
"interval": "Monthly",
"duration": 12,
"description": "Monthly subscription for fans to gain access to listen to Creator 1234 songs",
"active": true,
"__v": 0
},
"cardProcessor": "mock",
"reference": "148a2d77-c025-4c48-bccb-f8474ffcf903",
"nextPaymentAt": "2025-05-11T17:56:08.261Z",
"status": "Active",
"webhookInfo": {
"item": "sword",
"email": ""
},
"createdAt": "2025-03-11T17:56:08.262Z",
"updatedAt": "2025-04-11T20:30:00.146Z",
"__v": 0
},
"customerId": "67Lj6ZcTRDtWT3Rx4KWAdLUrHKeLcycBzwvhzGowrHjx",
"rawCustomerId": "67Lj6ZcTRDtWT3Rx4KWAdLUrHKeLcycBzwvhzGowrHjx"
}
}
```
**`Subscription Created`**
```json Subscription Created
// Sent when a new customer pays for a subscription for the first time
{
"eventType": "Subscription Created",
"category": "Subscription",
"created": "2025-04-28T20:28:08.289Z",
"data": {
"planCode": "music_access",
"planName": "creator1234",
"subscriptionId": "680fe4d832ddccc1ee91885e",
"customerId": "78C3dn4yUJST9pcX9GtA3yWBcKUCjDw1RWqw1MLpoUDh",
"amount": {
"cents": 500,
"currency": "USD"
},
"interval": "Monthly",
"fundingMethod": "Card",
"webhookInfo": {
"item": "sword"
}
}
}
```
**`Subscription Cancelled`**
```json Subscription Cancelled
// Sent when a customer cancels their subscription plan
{
"eventType": "Subscription Canceled",
"category": "Subscription",
"created": "2025-04-28T20:33:05.322Z",
"data": {
"planCode": "music_access",
"planName": "creator1234",
"subscriptionId": "67d07938a899c293e0ae2147",
"customerId": "67Lj6ZcTRDtWT3Rx4KWAdLUrHKeLcycBzwvhzGowrHjx",
"amount": {
"cents": 500,
"currency": "USD"
},
"interval": "Monthly",
"fundingMethod": "Card",
"webhookInfo": {
"item": "sword",
"email": ""
},
"reason": "Customer has canceled subscription"
}
}
```
### SEPA/ UK Faster Payin Events
**`Settled`**
```json Settled
// Sent when SEPA or UK FP payment is complete; Funds have been taken from payer and are in your merchant settlement wallet
{
"eventType": "Settled",
"category": "Purchase",
"created": "2025-05-22T00:00:00.000Z",
"data": {
"id": "8b6f0b0c-92d2-4224-b8ad-f2983dc64e94",
"webhookInfo": {
"item": "sword",
"email": ""
},
"subtotal": {
"cents": 100,
"currency": "USD"
},
"fees": {
"cents": 245,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 345,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "9rpv2W6qyShwcwTgZXpiFuC5kFGYpzhYugmpKK5Ls4Kt",
"rawCustomerId": "9rpv2W6qyShwcwTgZXpiFuC5kFGYpzhYugmpKK5Ls4Kt"
}
}
```
**`Payment Expiration`**
```json Payment Expiration
// Sent when the timeframe to send SEPA / UK FP payment has ended and payer has not sent the funds
{
"eventType": "Payment Expiration",
"category": "Purchase",
"created": "2025-05-22T22:14:00.128Z",
"data": {
"id": "3423fa99-cca2-410c-b6b4-78546d57baf5",
"webhookInfo": {
"item": "sword",
"email": ""
},
"subtotal": {
"cents": 200,
"currency": "USD"
},
"fees": {
"cents": 226,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 426,
"currency": "USD"
},
"merchantId": "testtest",
"customerId": "9rpv2W6qyShwcwTgZXpiFuC5kFGYpzhYugmpKK5Ls4Kt",
"rawCustomerId": "9rpv2W6qyShwcwTgZXpiFuC5kFGYpzhYugmpKK5Ls4Kt"
}
}
```
### Unknown Wire Payment Events
An `Unknown Wire Payment Received` event fires exactly once when an incoming wire cannot be matched to a pending payment (token, memo, and fuzzy match all fail) and is recorded as an unknown wire on your account. The payload includes enough detail for you to look up the wire in your own systems and initiate reconciliation or a return.
**`Unknown Wire Payment Received`**
```json Unknown Wire Payment Received
// Sent when an incoming wire could not be matched to a pending payment and was recorded as an unknown wire
{
"eventType": "Unknown Wire Payment Received",
"category": "Purchase",
"created": "2025-04-28T20:11:07.608Z",
"data": {
"amount": {
"cents": 500000,
"currency": "USD"
},
"externalReferenceId": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"last4": "1234",
"processor": "braid",
"memo": "INVOICE 4821",
"status": "RECEIVED",
"createdAt": "2025-04-28T20:11:07.608Z"
}
}
```
The fields in the `data` object are:
|
`amount`
|
The amount of the incoming wire, expressed in `cents` with its `currency`.
|
|
`externalReferenceId`
|
The processor's reference identifier for the wire, used to look up the transaction on the originating side.
|
|
`last4`
|
The last four digits of the originating account number.
|
|
`processor`
|
The wire processor that received the funds (for example `braid`).
|
|
`memo`
|
The wire memo/description, when present.
|
|
`status`
|
The status of the unknown wire. Newly received wires are `RECEIVED`.
|
|
`createdAt`
|
The UTC datetime the unknown wire was recorded.
|
> **Note**
>
> The example values above are illustrative only and do not reflect real production values.
### Advanced: Stablecoin Payment Events
These events fire only for stablecoin pay-ins. If you're integrating cards, ACH, PIX, or SEPA, you can skip this section.
**`USDC Payment Received`**
```json USDC Payment Received
// Sent when the merchant receives a stablecoin (USDC) payment in their settlement location.
{
"eventType": "USDC Payment Received",
"category": "Purchase",
"created": "2025-04-11T22:49:32.855Z",
"data": {
"webhookInfo": {
"item": "sword",
"email": "",
"subtotal": {
"cents": 200,
"currency": "USD"
},
"fees": {
"cents": 0,
"currency": "USD"
},
"gasFees": {
"cents": 0,
"currency": "USD"
},
"chargebackProtectionFees": {
"cents": 0,
"currency": "USD"
},
"total": {
"cents": 200,
"currency": "USD"
},
"merchantId": "testtest",
"id": "2VqpY3bac7Gbur27bYwZz8ATgpUg4K1nPHLHHnsvbmZjSFB5jxuaoaXxHEgmGcerZJpwo7hLFswWqYEAn259uLea",
"customerId": "8zdj6f58ZfNDxDy6bArCDjVhWJ7Mwtigqh2M7VZYv9Qm"
}
}
}
```
**`Overpayment`**
```json Overpayment
// Sent when a customer sends more stablecoin than the required amount. The payment still settles successfully.
// Use the refundUrl to direct your customer to claim back the excess amount.
{
"eventType": "Crypto Overpayment",
"category": "Purchase",
"created": "2025-03-15T14:23:01.000Z",
"data": {
"paymentId": "78f9be3f-691f-4f8c-82f7-c70221b006e7",
"sessionId": "ses_abc123xyz",
"refundUrl": "https://deposit.coinflow.cash/coinflow.cash.prod?mode=refund&sessionId=ses_abc123xyz&refundToken=tok_abc123",
"expectedAmount": "10.00",
"actualAmount": "12.50",
"currencySymbol": "USDC",
"actualAmountUSD": "12.50"
}
}
```
**`Underpayment`**
```json Underpayment
// Sent when a customer sends less stablecoin than the required amount. The payment fails.
// Use the refundUrl to direct your customer to claim back what they sent.
{
"eventType": "Crypto Underpayment",
"category": "Purchase",
"created": "2025-03-15T14:23:01.000Z",
"data": {
"paymentId": "bce7ca59-4bcc-43c3-95f1-51f2858b0bd2",
"sessionId": "ses_def456uvw",
"refundUrl": "https://deposit.coinflow.cash/coinflow.cash.prod?mode=refund&sessionId=ses_def456uvw&refundToken=tok_def456",
"expectedAmount": "10.00",
"actualAmount": "7.50",
"currencySymbol": "USDC",
"actualAmountUSD": "7.50"
}
}
```
**`Review Held`**
```json Review Held
// Sent when a crypto pay-in is flagged by wallet screening and held for manual review.
{
"eventType": "Crypto Payin Review Held",
"category": "Purchase",
"created": "2025-03-15T14:23:01.000Z",
"data": {
"paymentId": "bce7ca59-4bcc-43c3-95f1-51f2858b0bd2",
"merchantId": "testtest",
"webhookInfo": {"orderId": "order_123"},
"heldAt": "2025-03-15T14:23:01.000Z"
}
}
```
**`Review Resolved`**
```json Review Resolved
// Sent when a held crypto pay-in review is resolved. `resolution` is "cleared" or "blocked".
{
"eventType": "Crypto Payin Review Resolved",
"category": "Purchase",
"created": "2025-03-15T18:02:44.000Z",
"data": {
"paymentId": "bce7ca59-4bcc-43c3-95f1-51f2858b0bd2",
"merchantId": "testtest",
"webhookInfo": {"orderId": "order_123"},
"resolution": "cleared",
"resolvedAt": "2025-03-15T18:02:44.000Z"
}
}
```
> **Warning**
>
> The `paymentId`, `sessionId`, and amount values shown above are **examples only** and are not reflective of real production values.
---
## Schema
**`Schema`**
```json Schema
{
eventType: string,
category: string,
created: string,
data: {
id: string,
signature?: string,
wallet?: string,
webhookInfo?: { [key: string]: string } | null,
subtotal: { cents: number, currency: string },
fees: { cents: number, currency: string },
gasFees: { cents: number, currency: string },
chargebackProtectionFees: { cents: number, currency: string },
// Custom pay-in fee charged to the customer (e.g. a merchant-configured
// "Deposit Fee"). Only present when the merchant has configured one.
// Already included in `subtotal` and `total` — do not add it again.
payInFees?: { cents: number, currency: string },
total: { cents: number, currency: string },
merchantId?: string,
customerId?: string,
rawCustomerId?: string,
cardToken?: string,
last4?: string,
bin?: string,
paymentMethodToken?: string,
// Stable payer id at the provider, for both PayPal and Venmo pay-ins.
// Only present when the provider returned one on the approval.
payerId?: string,
// PayPal/Venmo account holder name, when captured on the payment
payerName?: string,
payerFirstName?: string,
payerLastName?: string
}
}
```
## Docs
- [How to Test Chargeback Events](https://docs.coinflow.cash/guides/developer-resources/webhooks/checkout-webhooks/how-to-test-chargeback-events.md):