If your Paddle webhook endpoint goes down for an hour, subscription activations queue up silently. Customers paid but have no plan. You don't find out from Paddle — you find out from a support ticket.
A naïve monitor that just sends GET /api/payments/webhook won't help:
it'll return 405 and your verifier will reject unsigned payloads.
Here's how to do it right.
Approach 1 — POST a synthetic payload (recommended)
Valpero supports POST monitors with custom headers and body. Add a lightweight ping path that short-circuits Paddle's signature check when a special token is present.
1. Add a ping bypass to your webhook handler
@router.post("/api/payments/webhook")
async def payment_webhook(request: Request):
if request.headers.get("x-valpero-ping") == settings.VALPERO_PING_TOKEN:
return {"ok": True, "ping": True}
raw_body = await request.body()
sig = request.headers.get("paddle-signature", "")
# …normal Paddle verification below
2. Create a Valpero monitor
HTTP, POST, body {}, header X-Valpero-Ping: <your token>. Add a
keyword check for "ping": true.
If the endpoint is unreachable, returns 5xx, or stops matching the keyword, Valpero alerts you within 30 seconds (Pro plan).
Approach 2 — Watch a downstream side-effect (heartbeat)
If you can't modify the webhook handler, watch what happens after a
real event lands. After each successful transaction.completed event,
hit a Valpero heartbeat URL:
import httpx
await httpx.get("https://valpero.com/heartbeat/PING_TOKEN")
If no event arrives in N minutes, Valpero alerts you. Catches both "endpoint down" and "Paddle stopped sending events."
Don't rely on heartbeats alone — they miss the case where your endpoint quietly returns 200 but doesn't process the event. Combine with Approach 1.
Bonus — monitor Paddle's own status
Add a Valpero monitor against https://status.paddle.com/ with a
keyword check for All Systems Operational. When Paddle itself is
degraded, you'll know before your customers do.
Wrapping up
Three monitors total — synthetic POST, heartbeat, Paddle's status. Together they cover the full failure surface with minimal overhead.