Payment Verification Failed
payment_verification_failed400
A payment provider webhook arrived with a signature that did not verify, so it was ignored. Only the webhook sender sees it.
What this means
Dodo, our payment provider, tells us about payments and subscription changes by calling our webhook. Every call is signed. This error means the signature on a call did not match our webhook secret, so the event was not trusted and not processed: no plan, payment or key was changed. The response is HTTP 400.
When you'll see this
- Something other than Dodo sent a request to the webhook URL.
- The signature headers were missing or altered on the way.
- The webhook secret configured on our side does not match the one in Dodo.
You will not see this error in the dashboard or from the API: the only caller of the webhook is the payment provider.
Learn more about how this works
Dodo signs each webhook with the standard webhook headers (webhook-id, webhook-timestamp, webhook-signature). We verify the signature against the raw request body before reading the event. A call that fails the check gets this error and is dropped. If the webhook secret is missing on our side, the request fails with a server error instead, so the provider keeps retrying until it is fixed.
Example response
{
"success": false,
"error": "payment_verification_failed",
"message": "Payment signature verification failed.",
"details": [],
"retry_after": null,
"doc_url": "https://docs.asterwise.com/reference/errors/payment_verification_failed/",
"request_id": "req_01HXYZABCDEFGH",
"timestamp": "2026-05-25T12:34:56Z"
}
- There is nothing to do as a customer. Payments are confirmed only from verified webhooks.
- If your plan did not update after a payment, email [email protected] with the payment date and amount.
No integration calls this endpoint. Do not send requests to the payment webhook; an unsigned or wrongly signed request is always refused with this error.
Production handler
No code example provided.
Avoid this error by
- Nothing on the customer side. On our side, the webhook secret must match the one set in the Dodo dashboard after any rotation.