Signature mismatch
The most common cause is signing parsed JSON instead of the exact raw body, or using a different timestamp than the request header.
Webhook tester
Edit a sample payload and generate an HMAC-SHA256 signature and cURL request. Check your callback verification in a test environment.
Set the endpoint, test secret, and timestamp.
Signatures are calculated in your browser. Use a test secret for debugging.
Unix timestamp in milliseconds, matching BoltUtil callback headers.
The signature and cURL update as you edit the JSON.
Enter a test secret, valid timestamp, and JSON to generate a signature.
Calculated from the current timestamp, exact body, and test secret.
Enter a valid endpoint, secret, timestamp, and JSON to generate a request.This simulated USDC order callback can also use USDT. Orders, addresses, and transaction hashes are examples, not evidence of payment.
This tool only generates requests. Run cURL manually in your test environment to send one.
Signature verification
Verify using the same signing rule, safely record the event, then update your business order.
Read the verification guideHMAC_SHA256(timestamp + "." + rawBody, secret)Use the millisecond timestamp from the header and the exact raw body to calculate HMAC before parsing JSON. Whitespace, line breaks, and field order affect the signature.
Compare the received signature with a constant-time helper provided by your language runtime.
Only return success after recording the event or putting it into a durable internal queue.
Webhook troubleshooting
Check the original body, secret, and response status to locate the issue.
The most common cause is signing parsed JSON instead of the exact raw body, or using a different timestamp than the request header.
Use the webhook secret configured for the merchant endpoint. API keys and webhook secrets should be treated as different credentials.
JSON middleware can reorder or reformat payloads. Capture the raw body before parsing when verifying HMAC signatures.
Non-2xx responses count as failed deliveries. Further attempts depend on the callback type, response status, and retry policy.
A notification may be delivered more than once. Deduplicate using the actual order identifier and status, or a unique event ID, before fulfillment.
Return HTTP 2xx only after writing the event to your database or queue. Otherwise a crash can lose a completed payment notification.
FAQ
Signature verification, responses, and duplicate deliveries.
Verify the exact raw request body, the timestamp header, and the configured webhook secret. Signing parsed JSON or a reformatted body usually produces a different HMAC.
No. BoltUtil uses the HTTP status code: 2xx means successful delivery. The body does not need to contain SUCCESS. Verify the signature and safely record the event first.
Deduplicate with a database constraint or atomic operation. Traditional order callbacks can use the order identifier and status; callbacks with a unique event ID can use that ID. A transaction hash alone can cover multiple transfers.
Return 2xx after verifying the signature and safely recording the event in a database or durable queue. Use an appropriate error status if verification or persistence fails. Retries depend on callback type and policy.