> For the complete documentation index, see [llms.txt](https://docs.neox.vn/docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.neox.vn/docs/global/global-collections/integration/collections/webhook.md).

# Webhook

For webhook delivery mechanics, security verification, and retry behaviour, see [Event Notification](/docs/global/global-collections/integration/event-notification.md).

This page documents 5 of the 7 event types in the **collection-transaction event group**, covering the lifecycle of an incoming collection: `TRADE_COLLECTION_RECEIVED`, `PLATFORM_COLLECTION_RECEIVED`, `COLLECTION_COMPLETED`, `COLLECTION_REJECTED`, and `COLLECTION_CANCEL`.

{% hint style="info" %}
Unlike other Global Collections webhooks, this group is **not** delivered to a per-request `webhookUrl` — that makes sense structurally, since these events (funds arriving, collection completed/rejected/cancelled) are not triggered by a merchant-initiated create call that could carry a `webhookUrl` parameter. Delivery falls back to the merchant's configured global-collection webhook URL/secret (see [Event Notification](/docs/global/global-collections/integration/event-notification.md)).
{% endhint %}

{% hint style="info" %}
The remaining 2 events in this group — `TRADE_COLLECTION_REFUND_PROCESS` and `TRADE_COLLECTION_REFUND_SUCCESS` — cover refund outcomes and are documented on [Refund Requests Webhook](/docs/global/global-collections/integration/refund-requests/webhook.md) instead, alongside the refund flow they relate to. They are still delivered through this same collection-transaction channel, not to a per-request `webhookUrl`.
{% endhint %}

## TRADE\_COLLECTION\_RECEIVED

Sent when funds arrive in a virtual account for a trade-collection-type order.

### Event data

| Field Name            | Type   | Description                                                                                                                    |
| --------------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ |
| type                  | string | Event type. Fixed value: `TRADE_COLLECTION_RECEIVED`.                                                                          |
| subMerchantId         | string | NeoX identifier of the sub-merchant that owns the receiving virtual account, if applicable.                                    |
| orderType             | string | Fixed value: `TRADE_COLLECTION`.                                                                                               |
| payerAccountSwiftCode | string | SWIFT/BIC code of the payer's bank.                                                                                            |
| amount                | number | Incoming amount as notified by the receiving bank.                                                                             |
| bankSerialNum         | string | Serial number assigned by the receiving bank to this incoming transfer.                                                        |
| orderId               | string | NeoX identifier of the collection order.                                                                                       |
| remark                | string | Free-text remark attached to the incoming transfer.                                                                            |
| createdAt             | string | Timestamp when the collection order was created (ISO 8601).                                                                    |
| payAmount             | number | Amount actually posted/matched for this collection.                                                                            |
| requestId             | string | Unique identifier for this webhook event. Use this for idempotency.                                                            |
| payCurrency           | string | Currency of `payAmount`.                                                                                                       |
| currency              | string | Currency of the incoming funds.                                                                                                |
| vaNo                  | string | Virtual account number that received the incoming funds.                                                                       |
| payerAccountNum       | string | Account number of the party that sent the funds.                                                                               |
| payerAccountName      | string | Account name of the party that sent the funds.                                                                                 |
| extData               | string | Reserved for future use. Currently always the literal string `"{}"`.                                                           |
| secureHash            | string | Base64-encoded SHA-256 signature. See [Event Notification](/docs/global/global-collections/integration/event-notification.md). |

### Sample data

Real captured example:

```json
{
  "type": "TRADE_COLLECTION_RECEIVED",
  "subMerchantId": "10000002",
  "orderType": "TRADE_COLLECTION",
  "payerAccountSwiftCode": "MOCKSWIFT",
  "amount": 102.5,
  "bankSerialNum": "VAKMMKO5XS0A",
  "orderId": "785481030920000002",
  "remark": "Test inbound trade collection - arrival 02",
  "createdAt": "2026-07-31 13:57:19",
  "payAmount": 102.5,
  "requestId": "ORE_1785481031473",
  "payCurrency": "USD",
  "currency": "USD",
  "vaNo": "5408441793000005",
  "payerAccountNum": "J0W7QEOVY3XOB",
  "payerAccountName": "MOCK PAYER",
  "extData": "{}",
  "secureHash": "JCkpjG9h8kSMaJNzpr6iaaEefxdFJ5WSH5F5G6Q4HRw="
}
```

## PLATFORM\_COLLECTION\_RECEIVED

Sent when funds arrive in a virtual account for a platform-collection-type order. Same field shape as `TRADE_COLLECTION_RECEIVED`, with `orderType` set to `PLATFORM_COLLECTION`.

### Event data

Same fields as [TRADE\_COLLECTION\_RECEIVED](#trade_collection_received) above, except:

| Field Name | Type   | Description                                              |
| ---------- | ------ | -------------------------------------------------------- |
| type       | string | Event type. Fixed value: `PLATFORM_COLLECTION_RECEIVED`. |
| orderType  | string | Fixed value: `PLATFORM_COLLECTION`.                      |

### Sample data

Real captured example:

```json
{
  "type": "PLATFORM_COLLECTION_RECEIVED",
  "subMerchantId": "10000002",
  "orderType": "PLATFORM_COLLECTION",
  "payerAccountSwiftCode": "MOCKSWIFT",
  "amount": 100,
  "bankSerialNum": "VAD94QLEL45P",
  "orderId": "785483204342000005",
  "remark": "Test inbound platform collection - arrival",
  "createdAt": "2026-07-31 14:33:24",
  "payAmount": 100,
  "requestId": "ORE_1785483204342",
  "payCurrency": "CNY",
  "currency": "CNY",
  "vaNo": "5408441793000005",
  "payerAccountNum": "PVUOJVL39B466",
  "payerAccountName": "MOCK PAYER",
  "extData": "{}",
  "secureHash": "Cc+l5O8ZJ8bJH54jU2KO/wNmMXHYz95ZKTgTgSQUV50="
}
```

## COLLECTION\_COMPLETED

Sent when a collection order finishes matching/review and funds are credited.

{% hint style="info" %}
The list of matched trade orders (`tradeOrderList` in the source system) cannot be represented in a flat payload and is omitted here. Call [Get Detail Trade Order](https://github.com/neopayvn/neox-gitbook-documents-v2/tree/main/global-collections/integration/trade-orders/get-detail-trade-order.md) or [Get Detail Collection Order](/docs/global/global-collections/integration/collections/get-detail-collection-order.md) to retrieve match detail.
{% endhint %}

### Event data

| Field Name       | Type   | Description                                                                                                                    |
| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ |
| type             | string | Event type. Fixed value: `COLLECTION_COMPLETED`.                                                                               |
| subMerchantId    | string | NeoX identifier of the sub-merchant that owns the receiving virtual account, if applicable.                                    |
| orderId          | string | NeoX identifier of the collection order.                                                                                       |
| requestId        | string | Unique identifier for this webhook event. Use this for idempotency.                                                            |
| orderType        | string | Classification of the collection. Enum: `TRADE_COLLECTION`, `PLATFORM_COLLECTION`.                                             |
| amount           | number | Original incoming amount.                                                                                                      |
| payAmount        | number | Amount actually posted/matched.                                                                                                |
| currency         | string | Currency of the incoming funds.                                                                                                |
| payCurrency      | string | Currency of `payAmount`.                                                                                                       |
| vaNo             | string | Virtual account number that received the incoming funds.                                                                       |
| bankSerialNum    | string | Serial number assigned by the receiving bank.                                                                                  |
| payerAccountNum  | string | Account number of the party that sent the funds.                                                                               |
| payerAccountName | string | Account name of the party that sent the funds.                                                                                 |
| feeAmount        | number | Fee charged for this collection.                                                                                               |
| feeCurrency      | string | Currency of `feeAmount`.                                                                                                       |
| createdAt        | string | Timestamp when the collection order was created (ISO 8601).                                                                    |
| extData          | string | Reserved for future use. Currently always the literal string `"{}"`.                                                           |
| secureHash       | string | Base64-encoded SHA-256 signature. See [Event Notification](/docs/global/global-collections/integration/event-notification.md). |

### Sample data

Real captured example:

```json
{
  "type": "COLLECTION_COMPLETED",
  "subMerchantId": "10000002",
  "orderId": "785490880054000007",
  "requestId": "ORE_1785490880054",
  "orderType": "TRADE_COLLECTION",
  "amount": 101,
  "payAmount": 101,
  "currency": "USD",
  "payCurrency": "USD",
  "vaNo": "5408441793000005",
  "bankSerialNum": "VARVSHLZVZVY",
  "payerAccountNum": "YJEWTIKDO0NWW",
  "payerAccountName": "MOCK PAYER",
  "feeAmount": 0.1,
  "feeCurrency": "USD",
  "createdAt": "2026-07-31T09:41:20.095Z",
  "extData": "{}",
  "secureHash": "He0rOHX4p0DK57sFBDXpKJXR8aKiOIUxRrpVjpPCYso="
}
```

## COLLECTION\_REJECTED

Sent when a collection order's review is rejected.

{% hint style="info" %}
The source system carries a list of rejection reasons (`rejectReasonInfoList`). Since a flat payload cannot represent an array, this webhook flattens it to **only the first entry** (`rejectReasonCode`/`rejectReasonText`) — if a collection is rejected for multiple reasons, later reasons are not included here. Call [Get Detail Collection Order](/docs/global/global-collections/integration/collections/get-detail-collection-order.md) for the complete list.
{% endhint %}

### Event data

| Field Name       | Type   | Description                                                                                                                    |
| ---------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ |
| type             | string | Event type. Fixed value: `COLLECTION_REJECTED`.                                                                                |
| subMerchantId    | string | NeoX identifier of the sub-merchant that owns the receiving virtual account, if applicable.                                    |
| orderId          | string | NeoX identifier of the collection order.                                                                                       |
| requestId        | string | Unique identifier for this webhook event. Use this for idempotency.                                                            |
| orderType        | string | Classification of the collection. Enum: `TRADE_COLLECTION`, `PLATFORM_COLLECTION`.                                             |
| amount           | number | Original incoming amount.                                                                                                      |
| payAmount        | number | Amount actually posted/matched (if any).                                                                                       |
| currency         | string | Currency of the incoming funds.                                                                                                |
| payCurrency      | string | Currency of `payAmount`.                                                                                                       |
| vaNo             | string | Virtual account number that received the incoming funds.                                                                       |
| remark           | string | Free-text remark attached to the collection order.                                                                             |
| createdAt        | string | Timestamp when the collection order was created (ISO 8601).                                                                    |
| rejectReasonCode | string | Code of the first rejection reason. See hint above.                                                                            |
| rejectReasonText | string | Human-readable description of the first rejection reason. See hint above.                                                      |
| extData          | string | Reserved for future use. Currently always the literal string `"{}"`.                                                           |
| secureHash       | string | Base64-encoded SHA-256 signature. See [Event Notification](/docs/global/global-collections/integration/event-notification.md). |

### Sample data

```json
{
  "type": "COLLECTION_REJECTED",
  "subMerchantId": "18104208",
  "orderId": "689379735339516013",
  "requestId": "ORE_20260722152239094",
  "orderType": "TRADE_COLLECTION",
  "amount": 5555,
  "payAmount": 0,
  "currency": "USD",
  "payCurrency": "USD",
  "vaNo": "90380384159",
  "remark": "90380384159",
  "createdAt": "2026-07-24T02:34:48.233Z",
  "rejectReasonCode": "CONTRACT_MISMATCH",
  "rejectReasonText": "Trade order amount does not cover the collected amount.",
  "extData": "{}",
  "secureHash": "Base64EncodedSHA256HashValue=="
}
```

## COLLECTION\_CANCEL

Sent when a collection transaction is cancelled.

### Event data

| Field Name    | Type   | Description                                                                                                                    |
| ------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------ |
| type          | string | Event type. Fixed value: `COLLECTION_CANCEL`.                                                                                  |
| subMerchantId | string | NeoX identifier of the sub-merchant that owns the receiving virtual account, if applicable.                                    |
| orderId       | string | NeoX identifier of the collection order.                                                                                       |
| requestId     | string | Unique identifier for this webhook event. Use this for idempotency.                                                            |
| remark        | string | Free-text remark describing the cancellation.                                                                                  |
| extData       | string | Reserved for future use. Currently always the literal string `"{}"`.                                                           |
| secureHash    | string | Base64-encoded SHA-256 signature. See [Event Notification](/docs/global/global-collections/integration/event-notification.md). |

### Sample data

```json
{
  "type": "COLLECTION_CANCEL",
  "subMerchantId": "18104208",
  "orderId": "689379735339516013",
  "requestId": "ORE_20260722152239094",
  "remark": "Cancelled at merchant's request",
  "extData": "{}",
  "secureHash": "Base64EncodedSHA256HashValue=="
}
```
