For AI agents and LLMs: a structured documentation index is available at /llms.txt. Every page has a Markdown sibling โ€” append .md to any URL.

Skip to content
Paddle Docs home

Handle webhook delivery

Receive notifications by making sure your webhook event server is configured correctly, and responding within five seconds.

AI summary

This guide shows developers how to configure a webhook handler so Paddle notifications are received reliably, acknowledged within five seconds, and retried correctly when delivery fails.

  • โ€ขRespond with HTTP 200 within five seconds, before any internal processing, and queue events for asynchronous handling.
  • โ€ขAllow Paddle's sandbox and live webhook IP addresses separately, and configure WAF rules to bypass bot checks on webhook paths.
  • โ€ขLive accounts get up to 60 retry attempts over about two days, while sandbox accounts get 3 attempts within about two minutes; use the occurred_at field to handle out-of-order delivery and verify signatures with the Paddle-Signature header.

Once you've created a notification destination, you should properly handle webhook delivery. This includes making sure your webhook server is configured correctly, responding to notifications promptly, and handling retries.

Before you begin

Create a notification destination where the type is url (webhook), if you haven't already.

Use an AI agent

Allow Paddle IP addresses

You should make sure that webhooks originate from a Paddle webhook IP address. We recommend adding Paddle webhook IP addresses to your allowlist, and rejecting webhooks that come from other sources.

Allow different IP addresses for sandbox and live accounts:

Sandbox
34.194.127.46
54.234.237.108
3.208.120.145
44.226.236.210
44.241.183.62
100.20.172.113
Live
34.232.58.13
34.195.105.136
34.237.3.244
35.155.119.135
52.11.166.252
34.212.5.7

Update firewall rules

If you're using a Web Application Firewall (WAF) to protect your web server from bot traffic, requests from Paddle may be blocked incorrectly.

We recommend configuring your firewall to bypass bot checks on webhook endpoint paths. Also use Paddle IP addresses and match Paddle as the user agent string to further restrict your rule.

Configure your webhook handler

To receive webhooks, make sure your webhook event server:

  • Uses HTTPS
  • Can accept POST requests with a JSON payload
  • Returns 200 within five seconds of receiving a request

We recommend configuring your handler to process webhooks asynchronously by queueing received events and processing them in order. This helps prevent a large spike in webhooks from overwhelming your server.

Respond to events

The server that you set to receive events from Paddle should respond with an HTTP 200 status code within five seconds. This lets Paddle know that you successfully received the message.

You should respond before doing any internal processing. For example, if you use a webhook to update a record in a third-party system, respond with a 200 before running any logic to communicate with the third-party solution.

If you're running your webhook handler on Vercel Serverless Functions, AWS Lambda, Google Cloud Functions, or similar serverless platforms, consider pre-warming your function to prevent cold starts that might cause intermittent timeouts.

We can't guarantee the order of delivery for webhooks. They may be delivered in a different order to the order they're generated. Store and check the occurred_at date against a webhook before making changes.

Handle retries

If your server sends another kind of status code or doesn't respond within five seconds, Paddle automatically retries using an exponential backoff schedule:

  • For sandbox accounts, we make 3 attempts in total, all within about two minutes.
  • For live accounts, we make up to 60 attempts in total over about two days. Around 10 attempts happen in the first hour, and around 45 in the first day.

On live accounts, the wait before the next attempt is 60 ร— n^1.1 seconds, where n is the number of attempts made so far.

Live

Live webhook retry schedule
AttemptWait before this attemptTime since first attempt
1โ€”0s
21m1m
32m 9s3m 9s
43m 21s6m 30s
54m 36s11m 6s
65m 52s16m 58s
77m 11s24m 9s
88m 30s32m 39s
99m 51s42m 30s
1011m 13s53m 43s
1112m 35s1h 6m
1213m 59s1h 20m
1315m 23s1h 35m
1416m 48s1h 52m
1518m 14s2h 10m
1619m 40s2h 30m
1721m 7s2h 51m
1822m 34s3h 14m
1924m 2s3h 38m
2025m 30s4h 3m
2126m 59s4h 30m
2228m 28s4h 59m
2329m 58s5h 29m
2431m 28s6h
2532m 59s6h 33m
2634m 30s7h 7m
2736m 1s7h 43m
2837m 32s8h 21m
2939m 4s9h
3040m 37s9h 41m
3142m 9s10h 23m
3243m 42s11h 7m
3345m 15s11h 52m
3446m 49s12h 39m
3548m 23s13h 27m
3649m 57s14h 17m
3751m 31s15h 8m
3853m 5s16h 2m
3954m 40s16h 56m
4056m 15s17h 52m
4157m 51s18h 50m
4259m 26s19h 50m
431h 1m20h 51m
441h 2m21h 53m
451h 4m22h 58m
461h 5m1d
471h 7m1d 1h
481h 9m1d 2h
491h 10m1d 3h
501h 12m1d 4h
511h 13m1d 5h
521h 15m1d 7h
531h 17m1d 8h
541h 18m1d 9h
551h 20m1d 11h
561h 22m1d 12h
571h 23m1d 13h
581h 25m1d 15h
591h 27m1d 16h
601h 28m1d 18h

Sandbox

Sandbox webhook retry schedule
AttemptWait before this attemptTime since first attempt
1โ€”0s
220s20s
343s1m 3s

Times are approximate. An attempt can happen up to a minute later than shown.

Because Paddle retries, your handler may receive the same event more than once. Use event_id to skip events you've already processed.

You can check the status of a webhook and see delivery attempts using the Paddle dashboard, or by using the list logs for a notification operation in the Paddle API.

When all attempts to deliver a webhook are exhausted, its status is set to failed. You can attempt to redeliver a notification using the replay a notification operation in the Paddle API.

Verify webhook signatures

Use the Paddle-Signature header included with each webhook to verify that received events are genuinely sent by Paddle.

Test your handler

Send simulated webhooks to your handler

Test your webhook handler by sending simulated events to your endpoint using the webhook simulator. You can customize payloads, inspect event details, and replay simulations as part of your testing process.

Forward events to a local endpoint

Notification destinations require public-facing URLs. If you're developing locally, you can expose your local development server to the internet using a service like Hookdeck CLI:

  1. Install Hookdeck CLI.

  2. Run your local server. Note the port your local server is running on.

  3. Run hookdeck listen {PORT} paddle --path {WEBHOOK_ENDPOINT_PATH}, where {PORT} is the port where your local server is running and {WEBHOOK_ENDPOINT_PATH} is the path to your webhook handler. For example:

    Shell
    hookdeck listen 3000 paddle --path /api/webhook
  4. Use the unique URL generated by Hookdeck CLI as your webhook endpoint URL when creating or updating a notification destination.

Learn more about using the Hookdeck CLI to test and replay Paddle webhooks events on the Hookdeck docs.

Was this page helpful?