Webhooks
Webhooks notify your server when events occur in the Wava platform — most importantly, when a payment is confirmed. Instead of polling for status, your server receives an HTTP POST request with the event data.Setup
Configure your webhook URL in the Wava Dashboard under Settings > Integrations > API. You can set different URLs for development and production environments. Your endpoint must:- Accept
POSTrequests - Respond with a
200status code within 5 seconds - Be accessible over HTTPS (production)
How webhooks work
Direct API integrations
When a merchant integrates directly with the Wava API, webhooks are sent to the webhook URL configured in their dashboard. The primary event isorder_payment (sent when a payment is confirmed).
Partner integrations
Partners receive a different set of webhooks depending on the event type:- Order webhooks: Sent to the partner’s webhook URL when an order created through the partner is paid (same payload as direct API webhooks).
- Store onboarding webhooks: Sent to the partner when a new store is onboarded on their platform.
Webhook payload
Payloads are a flat JSON object — every field is at the top level (there is no nesteddata wrapper). Every payload includes the event name and a top-level timestamp (ISO 8601). When a payment is confirmed, Wava sends:
total_priceis the order total (notamount).currencyis the ISO 4217 code (e.g.COP).payment_methodis an object; the gateway ispayment_method.gateway(e.g.nequi,breb,daviplata).id_externalis theorder_keyyou provided when creating the order (nullif none). Use it — orid_order— to match webhooks to your records and to deduplicate retries.external_store_idis your external store reference (nullif none).
Payment links created via the API (
source: "api") also emit a link_paid event in addition to order_payment for the same order. Payment links created from the Wava dashboard UI (source: "wava") do not trigger webhooks. See Webhook Events for the link_paid payload.Retry policy
If your endpoint does not respond with a200 status code, Wava retries the webhook with exponential backoff. After multiple failed attempts, the webhook is marked as failed and can be reviewed in the dashboard.