Skip to main content

Overview

When a payment is completed on a payment link, Modulus delivers a webhook event to your configured endpoint. Events are delivered via HTTPS POST with a JSON body and are retried with exponential backoff on failure.
Webhook endpoint configuration is managed through your Modulus dashboard or by contacting your account manager.

Event types

EventTriggered when
payment.succeededA customer successfully completed a payment
payment.declinedA customer’s payment was declined by the card issuer
payment.failedA payment failed due to a processing error
payment.expiredA payment link expired before any successful payment

Payload

{
  "event_type": "payment.succeeded",
  "payment_link_id": "550e8400-e29b-41d4-a716-446655440000",
  "payment_attempt_id": "660e8400-e29b-41d4-a716-446655440000",
  "amount": 150000,
  "currency": "PHP",
  "status": "SUCCEEDED",
  "card_brand": "VISA",
  "card_last_four": "4242",
  "merchant_branch_name": "SM City Angeles - Branch 1",
  "created_at": "2026-06-18T15:00:00Z"
}
FieldTypeDescription
event_typestringOne of the event types above.
payment_link_idstringThe payment link (UUID) the event belongs to. Match this to the id you stored at creation.
payment_attempt_idstringUnique identifier (UUID) for this payment attempt.
amountintegerAmount in the smallest currency unit (centavos for PHP).
currencystringISO 4217 currency code.
statusstringOutcome of the payment attempt.
card_brandstringCard network used (e.g., VISA).
card_last_fourstringLast four digits of the card.
merchant_branch_namestringDisplay name of the branch.
created_atstringISO 8601 timestamp of the event.

Reconciling payments

Match incoming events to your records using the payment_link_id, then look up the link with Retrieve a Payment Link to read the order_reference and metadata you set at creation.
Respond with a 2xx status as soon as you receive an event. Acknowledge first, then process asynchronously — slow responses count as failures and trigger retries.