Proof verification fails
Your call toverifyProof() is throwing an error even though the client reported a successful login.
Wrong secret key for this project
Wrong secret key for this project
BONDIFY_SECRET_KEY environment variable. They must match exactly.Proof was modified before verification
Proof was modified before verification
verifyProof(), the signature will not match.Fix: Pass the proof string directly from the SDK callback to your API request body, and read it back verbatim in your API handler. Do not JSON-parse and re-encode it.Secret key was recently rotated
Secret key was recently rotated
BONDIFY_SECRET_KEY, proofs signed after the rotation will fail verification.Fix: Ensure your server environment variable reflects the current secret key shown in the dashboard. Redeploy after updating the variable.Secret key is exposed to the browser (Next.js)
Secret key is exposed to the browser (Next.js)
NEXT_PUBLIC_ is bundled into the browser. If your secret key is accidentally exposed this way, it creates a security vulnerability — and if someone used the leaked key to construct a fake proof, verification behaviour becomes unpredictable.Fix: Ensure your secret key environment variable has no NEXT_PUBLIC_ prefix:Session is stuck on pending
Your polling loop keeps receiving pending status and never transitions to confirmed, cancelled, or expired.
User never opened Telegram
User never opened Telegram
User has blocked the Bondify bot
User has blocked the Bondify bot
pending until it expires.Fix: Ask the user to search for the Bondify bot in Telegram and unblock it, then try signing in again. You can detect this scenario by a high expired rate in your analytics for specific users.Incorrect project_id in your configuration
Incorrect project_id in your configuration
projectId you pass to the SDK does not match an active project in your Bondify account, session creation may succeed but confirmation events will never arrive.Fix: Confirm the projectId in your SDK configuration matches the Project ID (not the secret key) shown in your dashboard.Browser console errors during session creation
Browser console errors during session creation
apiBase is not overridden to an incorrect value in your SDK configuration.Telegram popup is being blocked
The browser blocks the window that should open Telegram, and the user sees nothing happen after clicking the button.signIn() called outside a user gesture
signIn() called outside a user gesture
click, keydown, etc.). If you call signIn() from a useEffect, a setTimeout, a route change handler, or any other async context, the popup will be blocked.Fix: Call signIn() directly inside a click event handler, with no await between the click and the call:Webhooks not being received
Your webhook endpoint is configured in the dashboard but you are not receiving POST requests after authentications complete.Webhook URL is not publicly reachable
Webhook URL is not publicly reachable
localhost URL or an internal network address will never receive deliveries.Fix: Use a tunnelling tool like ngrok during local development to expose your endpoint. In production, ensure the URL is a publicly accessible HTTPS endpoint.Endpoint is not responding with 2xx within 10 seconds
Endpoint is not responding with 2xx within 10 seconds
2xx status code within 10 seconds. Long-running synchronous processing in the handler will cause this.Fix: Respond with 200 OK immediately on receipt, then process the payload asynchronously (e.g. push it to a queue or background job).Signature verification is incorrectly rejecting requests
Signature verification is incorrectly rejecting requests
X-Bondify-Signature header (recommended) but have a bug in your verification logic, you may be returning 4xx and discarding valid deliveries.Fix: Temporarily log the raw X-Bondify-Signature header and the raw request body (before any JSON parsing) and compare the expected vs received HMAC. Ensure you are using the raw request body bytes, not a parsed object, when computing the HMAC.High expired rate in analytics
Your analytics dashboard shows a large proportion of sessions ending in expired rather than confirmed.
Users are not completing the flow in Telegram
Users are not completing the flow in Telegram
Users are on desktop without Telegram installed
Users are on desktop without Telegram installed
cancelled status not handled
Your polling loop continues running after the user cancels, causing unnecessary API calls or a stuck loading state.
Missing cancelled exit condition in polling code
Missing cancelled exit condition in polling code
cancelled status and exit the loop when you receive it.Fix: Add an explicit exit condition for cancelled: