Skip to main content

Overview

Webhooks allow Payviox to send real-time notifications to your server when payment events occur. When a payment is processed, Payviox sends an HTTP POST request to your configured webhook URL with the payment details.
Webhooks are essential for keeping your application synchronized with payment statuses. Configure your webhook URL in the Payviox Dashboard under Settings > Webhooks.

Webhook Configuration

Setting Up Your Webhook URL

1

Configure Your Endpoint

Create an endpoint on your server to receive POST requests (e.g., https://yourdomain.com/api/webhook)
2

Add URL to Dashboard

Go to your Payviox Dashboard and navigate to Settings > Webhooks
3

Enter Your Webhook URL

Paste your endpoint URL in the webhook URL field
4

Save Your Webhook Token

Copy your webhook token - you’ll need it to verify webhook signatures
5

Select Webhook Events

Choose which events you want to receive. By default, only succeeded is enabled.

Available Events

You can subscribe to the following webhook events:
Always verify webhook signatures to ensure requests are coming from Payviox and not from malicious actors.

Webhook Payload Structure

Payviox sends webhooks with the following structure:

Payload Fields

integer
required
The payment amount in the smallest currency unit (e.g., cents for USD)
string
required
Three-letter ISO currency code (e.g., USD, EUR, GBP)
integer
Total fees amount in the smallest currency unit (e.g., cents for USD). The customer pays amount + fees = total. This field is present when fees have been calculated for the transaction.
object
required
Custom metadata associated with the payment session
string
required
The payment event type. Possible values:
  • succeeded: Payment completed successfully. You can fulfill the order.
  • pending_review: Payment flagged for fraud review. Do NOT ship until you receive succeeded or declined.
  • declined: Payment declined by fraud prevention. Customer has been automatically refunded.
  • refunded: A refund has been processed for this transaction.
  • expired: Payment session expired without completion.
  • incomplete: A crypto payment came in short (less than the requested amount). Opt-in event. Includes amount_remaining (how much is still due). Do NOT fulfill until you receive succeeded.
string
required
The payment provider used (e.g., stripe, paypal, crypto)
string
required
Your unique order identifier
array
required
Array of items purchased
string
Specific payment method used (e.g., card, bank_transfer)
object
Optional. Customer information if available from the payment provider. This field is only present when customer data was collected during payment.
integer
Only present on incomplete events. The amount still due, in the smallest currency unit (e.g., cents for USD) — how much more the customer must send to complete the payment. The amount already received equals amount - amount_remaining.

Event Types

Payviox sends different webhook events based on the payment lifecycle. Here’s what each event means and how to handle it:

succeeded - Payment Successful

✅ Payment Successful

The payment has been validated by the payment processor. You can safely fulfill the order.Typical flow:
  1. Customer completes payment
  2. Payment processor confirms the charge
  3. You receive succeeded webhook
  4. Ship the order / provide the service

pending_review - Fraud Review Required

⚠️ Pending Review

The payment has been flagged by our fraud detection system for manual review. Do NOT ship until you receive a final decision.Typical flow:
  1. Customer completes payment
  2. Fraud detection flags the transaction
  3. You receive pending_review webhook
  4. Admin reviews the transaction
  5. You receive either succeeded or declined webhook
Never fulfill orders that are in pending_review status. Wait for the final succeeded or declined webhook.

declined - Fraud Declined

❌ Declined (Fraud)

The payment was automatically declined by the fraud prevention system. The customer has been automatically refunded.Typical flow:
  1. Customer completes payment
  2. Fraud score exceeds threshold
  3. Automatic refund is issued
  4. You receive declined webhook
  5. Do NOT ship the order

refunded - Payment Refunded

↩️ Refunded

A refund has been processed for this transaction.Typical flow:
  1. Original payment was successful
  2. Refund is requested (by you or the customer)
  3. Refund is processed
  4. You receive refunded webhook

expired - Session Expired

⏰ Expired

The payment session expired before the customer completed payment.Typical flow:
  1. Payment session is created
  2. Customer does not complete payment within the session lifetime
  3. Session expires automatically
  4. You receive expired webhook

incomplete - Crypto Payment Underpaid

⚠️ Incomplete

A crypto payment came in short — the customer sent less than the requested amount. This is an opt-in event (enable it in your webhook settings), and only applies to crypto payments.The payload includes amount_remaining (how much is still due, in the smallest currency unit). The amount already received equals amount - amount_remaining.Typical flow:
  1. Customer pays a crypto invoice but sends less than the requested amount
  2. You receive incomplete (with amount_remaining)
  3. Customer sends the remaining amount to the same address
  4. You receive succeeded
Do NOT fulfill the order until you receive succeeded.

Webhook Headers

Every webhook request includes these headers:

Signature Verification

Critical Security Step: Always verify the webhook signature before processing the payload. This ensures the request is legitimate and from Payviox.
The Signature header contains an HMAC SHA256 hash of the request body, signed with your webhook token. Here’s how to verify it:

Verification Algorithm

  1. Get the raw request body (JSON string)
  2. Compute HMAC SHA256 hash using your webhook token as the secret key
  3. Compare the computed signature with the Signature header
  4. Only process the webhook if signatures match

Implementation Examples

Retry Logic

Payviox implements an automatic retry mechanism for failed webhook deliveries:
1

First Attempt

Instant delivery (0 seconds)
2

Second Attempt

30 seconds after first failure
3

Third Attempt

5 minutes after second failure
4

Fourth Attempt

30 minutes after third failure
After 4 failed attempts, the webhook will be marked as failed. You can manually retry failed webhooks from the Payviox Dashboard.

Success Criteria

A webhook is considered successfully delivered when your endpoint:
  • Returns HTTP status code 200
  • Responds within 30 seconds

Troubleshooting

Common Issues

Possible causes:
  • Using the wrong webhook token
  • Parsing/modifying the request body before verification
  • Incorrect HMAC algorithm (must be SHA256)
Solution: Always verify against the raw request body, before any parsing or modifications.
Possible causes:
  • Incorrect webhook URL in dashboard
  • Firewall blocking Payviox IP addresses
  • Server not responding within 30 seconds
Solution: Check your webhook URL configuration and server logs.
Possible causes:
  • Not implementing idempotency checks
  • Slow response times causing retries
Solution: Implement idempotency using session_id and order_id, and respond quickly with 200 OK.
Possible causes:
  • Processing taking too long before responding
  • Database locks or slow queries
Solution: Return 200 OK immediately and process webhooks asynchronously in a queue.

Security Checklist

Need Help?

If you’re having trouble with webhook integration:
Include your webhook attempt IDs from the dashboard when contacting support for faster resolution.