● Ship · When something is off
Troubleshooting
symptom, cause, fix.
Start with Console → Monitor → Status: it names the failing part. Then find the symptom below. The log (journalctl -u verified-calls) has the exact message.
01Install and start
| Symptom | Cause and fix |
|---|---|
pnpm install fails building better-sqlite3 | No prebuilt binary for your platform. Install build tools (apt install -y build-essential python3) and run it again. Use Node 22. |
| The app exits at start with a configuration error | A value in .env is out of range. The message names it, for example SCORING_RUG_THRESHOLD: must be lower than SCORING_HIT_THRESHOLD. |
/admin answers 503 | ADMIN_SECRET_KEY is empty or not 64 hex characters. Run openssl rand -hex 32, put it in .env, restart. |
| No setup code in the log | An owner already exists. Sign in; or ask another owner to invite you under Team. |
| Port already in use | Another process uses 8787. Change PORT and your proxy target. |
02Bot and recording
| Symptom | Cause and fix |
|---|---|
| Status: "Telegram rejected the bot token (401)" | The token is wrong or was revoked in @BotFather. Paste the current token under Integrations. |
| Messages in the group are not recorded | Privacy mode is on (the Test button says so): /setprivacy → Disable, then remove and re-add the bot, or make it admin. Or the chat is still waiting under Monitor → Chats: press Approve. Status → "A chat is recording" names the chats waiting. |
| Channel posts are not recorded | The bot must be an admin of the channel. |
| A chat I don't know appears under Monitor → Chats | Someone added your bot. Leave it unapproved; nothing is recorded. Turn off /setjoingroups in @BotFather. |
| Status: getUpdates conflict or failures | Two processes use the same token (for example a local copy and the server). Stop one. |
| Status: "Seal made but not posted: the bot is not running" | Seals are still made; they are posted once the bot runs. Check the token. |
| A seal chat gets no seal posts | The bot is not a member there, or in a channel it is not an admin allowed to post. The chat id must be the numeric id, e.g. -1001234567890. |
03Prices and results
| Symptom | Cause and fix |
|---|---|
| A call shows "—" and "unpriceable" | No pool was found, the price sources disagreed, or no trade happened within 5 minutes after the entry time. The call stays on the record and is not counted in the median. |
| 24 h or 7 d result empty | The window has not closed yet. It is never guessed. |
| Results appear minutes late | GeckoTerminal's free limit. The app asks for at most GECKOTERMINAL_RPM (25) per minute and backs off when told to. Busy groups see results a few minutes after a window closes. |
| Status: "Price data" degraded, rate limited | Lower the GeckoTerminal requests per minute under Data sources. |
| Exit liquidity always "not checked" | No Helius key and no own-RPC setting, or the caller has not linked a wallet. "Use my own RPC" refuses the public mainnet endpoint. |
04Proof and payments
| Symptom | Cause and fix |
|---|---|
| "Sign with wallet" is disabled | Set the operator wallet under Console → Proof. |
| Signing fails or is not stored | The wallet that signed is not the operator wallet, the transaction failed, or the RPC could not find it yet. Try again; set your own RPC under Integrations for reliability. |
| A VIP or listing payment stays "awaiting payment" | The transaction is not finalized yet, paid a different amount or asset, or went to another wallet. A payment that arrives late is still found by the background check for 24 hours. Check Money → VIP members → Payments. |
| A buyer sees "You opened several payment requests in the last half hour" | At most 5 payment requests per visitor in 30 minutes (VIP checkouts and paid listings). They finish an open request or wait. Behind a proxy, switch on the proxy setting under Product → API keys, or every visitor looks the same to the app. |
| Members don't get an invite | The bot lacks "Invite users" or "Ban users" in the VIP chat. Status → "VIP membership works" says which. |
| The sponsored slot does not show | A field contains a token address, a token page or a promise word. Status → "Sponsored slot passes the rules" names it. |
| A share-card image answers 503 "Busy rendering cards" | At most 40 new card images are rendered per 10 seconds across the site; above that the image answers 503 with Retry-After. Cached cards still load. Try again a few seconds later. |
verify-export.mjs reports a mismatch | The database file was changed outside the app or restored from an old backup. The script reports what does not match. |
05Console
| Symptom | Cause and fix |
|---|---|
| A field in Integrations is locked | The same secret is set in .env. Remove it there and restart to manage it in the console. |
| I saved a setting but nothing changed | Public address, log level and method apply after a restart. Maintenance, announcement, blocked countries, tagline, support email, website, terms and privacy URLs are not used by the public site in this version. |
| Saved secrets are unreadable after a move | ADMIN_SECRET_KEY differs from the one they were saved with. Restore the old key, or paste the secrets again. |