Webhooks and status updates

We use webhooks to notify you the moment a transaction changes its status.

📘

Before you enable webhooks

  • Create a webhook endpoint on your server (HTTP endpoint)
  • Make sure it accepts POST requests with a JSON payload

Configure Webhooks

To start receiving webhook notifications, you can specify a webhook URL when sending the API request for creation of a checkout. Here's a sample request:

{
  "storeId": "12345678",
  "transactionType": "SALE",
  "transactionAmount": {
    "total": 25,
    "currency": "EUR"
  },
  "checkoutSettings": {
      "webHooksUrl":"https://webhook.site/50d0a452-2785-45fb-ab7a-468cf21d4f36"
  }
}

Here's what a webhook event will look like when received on the specified request URL:

Examples:

{
    "retryNumber": 0,
    "storeId": "12345678",
    "checkoutId": "5qnq1E",
    "orderId": "91e95c4d-9949-438e-8650-1457188ef016",
    "transactionType": "SALE",
    "approvedAmount": {
        "total": 25,
        "currency": "EUR",
        "components": {
            "subtotal": 20,
            "vatAmount": 2,
            "shipping": 3
        }
    },
    "transactionStatus": "APPROVED",
    "paymentMethodUsed": {
        "cards": {
            "cardNumber": "123456******7890",
            "expiryDate": {
                "month": "12",
                "year": "2024"
            },
            "brand": "VISA"
        }
    },
    "ipgTransactionDetails": {
        "ipgTransactionId": "84632773344",
        "transactionStatus": "APPROVED",
        "approvalCode": "Y:758396:4632773344:YYYM:032018"
    }
}
{
  "storeId": "23199117020",
  "checkoutId": "H0rmfL",
  "orderId": "PL-100000581365",
  "transactionType": "SALE",
  "transactionStatus": "WAITING",
  "paymentMethodUsed": {
    "paymentMethod": "BANCONTACT_QR"
  },
  "ipgTransactionDetails": {
    "ipgTransactionId": "84641052797",
    "transactionStatus": "WAITING",
    "approvalCode": "?:waiting BANCONTACT"
  }
}
{
  "retryNumber": 2,
  "storeId": "231991170201",
  "checkoutId": "x2GrVt",
  "orderId": "100000299131",
  "transactionType": "SALE",
  "transactionStatus": "VALIDATION_FAILED",
  "transactionFailure": {
    "code": "50716",
    "reason": "Transaction declined. 3D Secure authentication failed."
  },
  "tokenDetails": {
    "value": "5D097BEE-D739-43A6-920F-F5072422C80F",
    "reusable": "true",
    "declineDuplicates": "false",
    "cardNumber": "462294******2325",
    "brand": "VISA",
    "error": {
      "code": "50716",
      "message": "Transaction declined. 3D Secure authentication failed."
    }
  },
  "paymentMethodUsed": {
    "cards": {
      "expiryDate": {
        "month": "12",
        "year": "2030"
      },
      "brand": "VISA"
    },
    "paymentMethod": "card"
  },
  "ipgTransactionDetails": {
    "ipgTransactionId": "84534880696",
    "transactionStatus": "VALIDATION_FAILED",
    "approvalCode": "N:-50716:3D Secure authentication failed"
  }
}
{
  "retryNumber": -1,
  "storeId": "231991170201",
  "checkoutId": "69iTLz",
  "orderId": "PL-100000299993",
  "transactionType": "SALE",
  "approvedAmount": {
    "total": 26,
    "currency": "EUR",
    "components": {
      "subtotal": 26
    }
  },
  "transactionStatus": "APPROVED",
  "paymentMethodUsed": {
    "paymentMethod": "GOOGLE_PAY"
  },
  "ipgTransactionDetails": {
    "ipgTransactionId": "84535112936",
    "transactionStatus": "APPROVED",
    "approvalCode": "Y:919301:4535112936:PPXM:0003780350"
  }
}

Retry mechanism

If the call to the webHooksUrl fails, then the gateway will retry 3 times.
In case there's no status update for a transaction (e.g. if customer has closed the browser after redirect to a 3rd party provider), the gateway runs a scheduled job for every transactions that are older than 9 minutes but not older than 6 hours. The webhooks will then also be sent to the webHooksUrl.

Handling of edge cases

In certain instances, the webhook may not function as intended. We highly recommend implementing a transaction inquiry via the Retrieve checkout details endpoint if the status remains 'WAITING' for more than 5 minutes, with retries scheduled every few minutes up to a maximum of 30 minutes. You can use the checkoutId from the initial response to Create a new checkout endpoint. This approach guarantees that the final status of the transaction is retrieved without requiring additional back-office operations

Example:

GET .../checkouts/{checkoutId}

(no body)

Want a quick overview?