# Webhook event reference

36 event types published by this platform, 25 of them with a settled payload contract.

## How to read this page

The envelope around every event is settled: see the webhook delivery guide for its fields, the signature scheme and the delivery semantics. What varies is the data body, and each event below says which of two things it is. [Receiving webhooks](https://docs.winkpg.io/docs/webhooks.md)

- **documented**: The body is a curated shape whose every field is deliberate. Fields are added only additively within envelope version 1, so you can bind to it.
- **contract pending**: The body is not fixed yet: it is either the event's flat filter attributes or a projection of an internal record whose fields follow that record rather than a published contract. The event fires and the envelope holds; treat the body as informational for now.

## API Keys

### `ApiKey.Expiring`

API Key Expiring (contract pending, any scope)

Published when an active API key is within the configured number of days of expiring (default 30), and again at each closer reminder threshold as expiry approaches (default 7 days and 1 day). The key's owner is also warned directly in their notifications.

## Hosted Payment Page

### `HostedPaymentPage.AchSaved`

HPP ACH Saved (documented, merchant scope)

Published when a payer saves a bank account on a Hosted Payment Page without being charged (the save-only ACH flow). Carries the chargeable payment token public reference and bank display data (account type, last four); never the internal vault id and never the full routing or account number.

| Field | Type | Nullable |
| --- | --- | --- |
| MethodType | string | no |
| PaymentTokenPublicReference | string | yes |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| SessionId | string | yes |
| VerificationTransactionId | string | yes |
| CustomerId | string | yes |
| StoredCredentialConsentId | string | yes |
| CardLast4 | string | yes |
| CardBrand | string | yes |
| BankAccountLast4 | string | yes |
| BankAccountType | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.AchSaved",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "MethodType": "string",
    "PaymentTokenPublicReference": "string",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "SessionId": "string",
    "VerificationTransactionId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "StoredCredentialConsentId": "11111111-1111-1111-1111-111111111111",
    "CardLast4": "string",
    "CardBrand": "string",
    "BankAccountLast4": "string",
    "BankAccountType": "string"
  }
}
```

### `HostedPaymentPage.CardSaved`

HPP Card Saved (documented, merchant scope)

Published when a cardholder saves a card on a Hosted Payment Page without being charged (the save-card-only flow). Carries the chargeable payment token public reference and card display data (brand, last four); never the internal vault id.

| Field | Type | Nullable |
| --- | --- | --- |
| MethodType | string | no |
| PaymentTokenPublicReference | string | yes |
| HostedPageId | string | no |
| HostedPageName | string | yes |
| SessionId | string | yes |
| VerificationTransactionId | string | yes |
| CustomerId | string | yes |
| StoredCredentialConsentId | string | yes |
| CardLast4 | string | yes |
| CardBrand | string | yes |
| BankAccountLast4 | string | yes |
| BankAccountType | string | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "HostedPaymentPage.CardSaved",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "MethodType": "string",
    "PaymentTokenPublicReference": "string",
    "HostedPageId": "11111111-1111-1111-1111-111111111111",
    "HostedPageName": "string",
    "SessionId": "string",
    "VerificationTransactionId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "StoredCredentialConsentId": "11111111-1111-1111-1111-111111111111",
    "CardLast4": "string",
    "CardBrand": "string",
    "BankAccountLast4": "string",
    "BankAccountType": "string"
  }
}
```

### `HostedPaymentPage.ConsentCaptureFailed`

HPP Consent Capture Failed (contract pending, merchant scope)

Published when an HPP session's stored-credential consent capture fails after the CIT was approved. The cardholder was charged, but the consent record / token / customer linkage did not land; operator reconciliation is required before a follow-up MIT can run.

### `HostedPaymentPage.ContractCreationFailed`

HPP Recurring Contract Creation Failed (contract pending, merchant scope)

Published when a Save-Card-with-Initial-Charge HPP page charged the initial payment and vaulted the card, but creating the recurring contract from the referenced plan failed. The cardholder was charged and the card stored, but the recurring schedule does not exist; operator reconciliation is required.

### `HostedPaymentPage.EmbeddingViolation`

HPP Embedding Violation (contract pending, merchant scope)

Published when an HPP allowlist violation is detected. Server-side path (Source=SessionApi) is deterministic. Browser-side path (Source=BrowserCsp) is best-effort: not all browsers report.

### `HostedPaymentPage.Transaction.Completed`

HPP Transaction Completed (contract pending, merchant scope)

Published when a transaction is completed on a Hosted Payment Page (any outcome: approved, declined, or failed).

## Invoicing

### `Invoice.Cancelled`

Invoice Cancelled (documented, merchant scope)

Published when a draft invoice is cancelled.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Cancelled",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Closed`

Invoice Closed (documented, merchant scope)

Published when an invoice is closed: a manual write-off or the dunning end action.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Closed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Issued`

Invoice Issued (documented, merchant scope)

Published when a draft invoice is issued: locked, assigned an invoice number, and given a due date.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Issued",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Paid`

Invoice Paid (documented, merchant scope)

Published when the invoice balance reaches zero (within the configured tolerance).

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Paid",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.PartiallyPaid`

Invoice Partially Paid (documented, merchant scope)

Published when a partial payment is applied and a balance remains due.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.PartiallyPaid",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.PastDue`

Invoice Past Due (documented, merchant scope)

Published when the reminder sweep transitions an overdue invoice to past due.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.PastDue",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.PaymentFailed`

Invoice Payment Failed (documented, merchant scope)

Published when a payment attempt against an invoice is declined: auto-collect, smart retry, installment collection, or a pay-by-link decline.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.PaymentFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Sent`

Invoice Sent (documented, merchant scope)

Published when an invoice is sent (or marked sent) to the recipient.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Sent",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Uncollectible`

Invoice Uncollectible (documented, merchant scope)

Published when dunning is exhausted and the invoice is marked uncollectible.

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Uncollectible",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Invoice.Viewed`

Invoice Viewed (documented, merchant scope)

Published on the recipient's first view of the invoice (hosted page or API).

| Field | Type | Nullable |
| --- | --- | --- |
| InvoiceId | string | no |
| InvoiceNumber | string | yes |
| Status | string | no |
| PreviousStatus | string | yes |
| BillerId | string | no |
| BillerType | string | no |
| RecipientId | string | no |
| RecipientType | string | no |
| Currency | string | yes |
| GrandTotal | number | no |
| AmountPaid | number | no |
| BalanceDue | number | no |
| TransactionId | string | yes |
| PaymentAmount | number | yes |
| PaymentConvenienceFeeAmount | number | yes |
| PaymentSurchargeAmount | number | yes |
| PaymentChargedTotal | number | yes |
| PaymentMethod | string | yes |
| DeclineReasonCode | string | yes |
| IssueDate | datetime | yes |
| DueDate | datetime | yes |
| SentAt | datetime | yes |
| ViewedAt | datetime | yes |
| PaidAt | datetime | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Invoice.Viewed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "InvoiceId": "11111111-1111-1111-1111-111111111111",
    "InvoiceNumber": "string",
    "Status": "string",
    "PreviousStatus": "string",
    "BillerId": "11111111-1111-1111-1111-111111111111",
    "BillerType": "string",
    "RecipientId": "11111111-1111-1111-1111-111111111111",
    "RecipientType": "string",
    "Currency": "string",
    "GrandTotal": 0,
    "AmountPaid": 0,
    "BalanceDue": 0,
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "PaymentAmount": 0,
    "PaymentConvenienceFeeAmount": 0,
    "PaymentSurchargeAmount": 0,
    "PaymentChargedTotal": 0,
    "PaymentMethod": "string",
    "DeclineReasonCode": "string",
    "IssueDate": "2026-01-01T00:00:00\u002B00:00",
    "DueDate": "2026-01-01T00:00:00\u002B00:00",
    "SentAt": "2026-01-01T00:00:00\u002B00:00",
    "ViewedAt": "2026-01-01T00:00:00\u002B00:00",
    "PaidAt": "2026-01-01T00:00:00\u002B00:00",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Merchants

### `Merchant.Activated`

Merchant Activated (contract pending, merchant scope)

Reserved for a merchant being activated for transaction processing.

This event type is registered but nothing publishes it yet, so subscribing to it today produces no deliveries. It is listed so the gap is visible rather than mistaken for a broken receiver.

### `Merchant.Created`

Merchant Created (contract pending, merchant scope)

Published when a new merchant is created in the system.

### `Merchant.Deactivated`

Merchant Deactivated (contract pending, merchant scope)

Reserved for a merchant being deactivated and no longer able to process transactions.

This event type is registered but nothing publishes it yet, so subscribing to it today produces no deliveries. It is listed so the gap is visible rather than mistaken for a broken receiver.

### `Merchant.Updated`

Merchant Updated (contract pending, merchant scope)

Reserved for an update to a merchant's profile or configuration.

This event type is registered but nothing publishes it yet, so subscribing to it today produces no deliveries. It is listed so the gap is visible rather than mistaken for a broken receiver.

## Notifications

### `Notification.DestinationSuppressed`

Destination Suppressed (contract pending, any scope)

Published when a notification destination endpoint is automatically suppressed after sustained delivery failures.

## Recurring Billing

### `RecurringBilling.ChargeFailed`

Recurring Charge Failed (documented, merchant scope)

Published when a scheduled recurring charge is declined or errors during processing. Carries the failure reason and the processor's stable response code.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ChargeFailed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

### `RecurringBilling.ChargeSucceeded`

Recurring Charge Succeeded (documented, merchant scope)

Published when a scheduled recurring charge is approved by the payment processor. Fires for every real charge (a transaction was created), independent of the contract's approval-email toggles.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ChargeSucceeded",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

### `RecurringBilling.ContractEnded`

Recurring Contract Ended (documented, merchant scope)

Published when a recurring contract reaches its natural end (schedule or threshold rules) and will no longer bill.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ContractEnded",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

### `RecurringBilling.ContractSuspended`

Recurring Contract Suspended (documented, merchant scope)

Published when a recurring contract is suspended after repeated failures (or manual intervention) and billing is paused.

| Field | Type | Nullable |
| --- | --- | --- |
| ContractId | string | no |
| MerchantId | string | no |
| CustomerId | string | no |
| TransactionId | string | yes |
| Outcome | string | no |
| IsSuccess | boolean | no |
| Amount | number | no |
| FailureReason | string | yes |
| FailureCode | string | yes |
| ScheduledRunTime | datetime | no |
| ExecutedAt | datetime | no |
| NextBillingDate | datetime | yes |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "RecurringBilling.ContractSuspended",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "ContractId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "CustomerId": "11111111-1111-1111-1111-111111111111",
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "Outcome": "string",
    "IsSuccess": false,
    "Amount": 0,
    "FailureReason": "string",
    "FailureCode": "string",
    "ScheduledRunTime": "2026-01-01T00:00:00Z",
    "ExecutedAt": "2026-01-01T00:00:00Z",
    "NextBillingDate": "2026-01-01T00:00:00Z"
  }
}
```

## Transactions

### `Transaction.AchStatusChanged`

ACH Status Changed (documented, merchant scope)

Published on each ACH settlement-status change (settled, returned, voided, or failed).

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| PreviousStatus | string | yes |
| NewStatus | string | no |
| ReturnCode | string | yes |
| ReturnReason | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.AchStatusChanged",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "PreviousStatus": "string",
    "NewStatus": "string",
    "ReturnCode": "string",
    "ReturnReason": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Authorized`

Transaction Authorized (documented, merchant scope)

Published when a payment authorization is approved by the processor or issuer.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Authorized",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Captured`

Transaction Captured (documented, merchant scope)

Published when an authorized transaction is captured for settlement. This is gateway bookkeeping, not money movement: no shipped card processor has an online capture message, and funds move at batch settlement. Subscribe to Transaction.Settled for the funds signal.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Captured",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Declined`

Transaction Declined (documented, merchant scope)

Published when the issuer, the processor, or a fraud or policy rule refused the payment. Distinct from Transaction.Failed, which means the gateway could not process the request at all: a decline will not succeed on a retry of the same card unchanged.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Declined",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Failed`

Transaction Failed (documented, merchant scope)

Published when the gateway could not process the transaction (a processor timeout, an unreachable host, a configuration gap, or invalid request data). Distinct from Transaction.Declined, which means the payment was refused.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Failed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Returned`

Transaction Returned (ACH) (documented, merchant scope)

Published when an ACH transaction is returned by the receiving bank (NACHA return code), including a late return after settlement.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| SettlementStatus | string | no |
| ReturnCode | string | yes |
| ReturnReason | string | yes |
| EffectiveEntryDate | string | yes |
| IsLateReturn | boolean | no |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Returned",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "SettlementStatus": "string",
    "ReturnCode": "string",
    "ReturnReason": "string",
    "EffectiveEntryDate": "string",
    "IsLateReturn": false,
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Reversed`

Transaction Reversed (documented, merchant scope)

Published when an authorization is reversed online, in full or in part. A partial reversal leaves a live authorization for the remaining amount: compare the payload's AuthorizedAmount and CumulativeReversedAmount, or read IsPartialReversal.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Reversed",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Settled`

Transaction Settled (documented, merchant scope)

Published when a captured card transaction completes settlement and the funds move. This is the funds signal, arriving hours after Transaction.Captured, and it carries the settled-at timestamp plus the gateway and processor batch identifiers. An operator rollback followed by a re-settle delivers a second event. ACH transactions do not settle through this pipeline: subscribe to Transaction.AchStatusChanged for those.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Settled",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

### `Transaction.Voided`

Transaction Voided (documented, merchant scope)

Published when an authorization is cancelled in full before capture.

| Field | Type | Nullable |
| --- | --- | --- |
| TransactionId | string | no |
| MerchantId | string | no |
| Status | string | no |
| TransactionType | string | yes |
| Currency | string | yes |
| Amount | number | yes |
| AuthorizedAmount | number | yes |
| CumulativeReversedAmount | number | yes |
| IsPartialReversal | boolean | yes |
| ResultCode | string | yes |
| DeclineReasonCode | string | yes |
| GatewayBatchId | string | yes |
| ProcessorBatchId | string | yes |
| OccurredAtUtc | datetime | no |

```json
{
  "id": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
  "type": "Transaction.Voided",
  "version": 1,
  "createdUtc": "2026-01-01T00:00:00.0000000Z",
  "tenantId": "00000000-0000-0000-0000-0000000000a1",
  "resellerId": "00000000-0000-0000-0000-0000000000b2",
  "merchantId": "00000000-0000-0000-0000-0000000000c3",
  "correlationId": "00000000-0000-0000-0000-0000000000d4",
  "data": {
    "TransactionId": "11111111-1111-1111-1111-111111111111",
    "MerchantId": "11111111-1111-1111-1111-111111111111",
    "Status": "string",
    "TransactionType": "string",
    "Currency": "string",
    "Amount": 0,
    "AuthorizedAmount": 0,
    "CumulativeReversedAmount": 0,
    "IsPartialReversal": false,
    "ResultCode": "string",
    "DeclineReasonCode": "string",
    "GatewayBatchId": "11111111-1111-1111-1111-111111111111",
    "ProcessorBatchId": "string",
    "OccurredAtUtc": "2026-01-01T00:00:00Z"
  }
}
```

## Usage

### `Usage.Threshold.Reached`

Usage Threshold Reached (contract pending, merchant scope)

Published when a merchant's usage of a metered SKU crosses a configured percentage of the entitlement's included quantity (default 80% and 100%).

## Events whose body is not settled yet

These events deliver, and their envelope is the same as any other. Their data body is not contractual, so no example is published for them: a made-up one would read as a promise.

- `ApiKey.Expiring` (API Key Expiring)
- `HostedPaymentPage.ConsentCaptureFailed` (HPP Consent Capture Failed)
- `HostedPaymentPage.ContractCreationFailed` (HPP Recurring Contract Creation Failed)
- `HostedPaymentPage.EmbeddingViolation` (HPP Embedding Violation)
- `HostedPaymentPage.Transaction.Completed` (HPP Transaction Completed)
- `Merchant.Activated` (Merchant Activated)
- `Merchant.Created` (Merchant Created)
- `Merchant.Deactivated` (Merchant Deactivated)
- `Merchant.Updated` (Merchant Updated)
- `Notification.DestinationSuppressed` (Destination Suppressed)
- `Usage.Threshold.Reached` (Usage Threshold Reached)

- [Receiving webhooks](https://docs.winkpg.io/docs/webhooks.md): the envelope, signature verification, idempotency, retries and suppression.

## See also

- [All documentation](https://docs.winkpg.io/llms.txt): the machine-readable index of every public page on this site.
