Skip to content

The /setup menu ​

The fastest way to configure X Bot is the interactive /setup menu. It wraps every admin command behind a clickable, edit-in-place interface β€” no slash commands to memorise.

Quickest path: add the bot to your group, type /setup, tap πŸš€ Quick Start, and follow four prompts. You'll have a daily-report schedule running on a real filter in under two minutes.

What /setup looks like ​

/setup top-level menu

╔══════════════════════════════════════════════╗
β•‘ βš™οΈ  Bot Setup                                β•‘
β•‘                                              β•‘
β•‘ Pick a section. Settings save instantly.     β•‘
β•‘                                              β•‘
β•‘ Current state                                β•‘
β•‘ ─ Project:  MyToken                          β•‘
β•‘ ─ Filter:   3 keywords Β· 2 cashtags          β•‘
β•‘ ─ Schedule: daily 18:00 UTC                  β•‘
β•‘ ─ Plan:     FREE β€” 47/100 credits left       β•‘
╠══════════════════════════════════════════════╣
β•‘ [ πŸš€ Quick Start ]                           β•‘
β•‘ [ 🎯 Filters     ] [ ⏰ Schedule       ]      β•‘
β•‘ [ πŸ“Š Reports     ] [ 🎨 Customization  ]      β•‘
β•‘ [ πŸ‘₯ Admins      ] [ πŸ’³ Buy Credits   ]      β•‘
β•‘ [ ℹ️  About       ]                          β•‘
β•‘ [ βœ• Close ]                                  β•‘
β•šβ•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•β•

Every screen shows your current state at the top so you know what's configured before you change anything. Every change saves instantly to the database β€” there's no "save" button to forget.

Quick Start wizard ​

Tap πŸš€ Quick Start for a four-step linear flow that gets a fresh chat from "nothing configured" to "first scheduled report" with the minimum number of prompts. Skip and Exit are always available β€” a partly-completed wizard never blocks you, settings just stay at their defaults.

Quick Start β€” Step 1 of 4 (project name)

The four steps:

StepAsksSaves to
1Project nameProjectName setting (used on reports, leaderboard cards, admin DMs)
2What to track on X β€” accounts, cashtags, or keywordsThe default filter's from, cashtags, or keywords array
3When to post the daily report β€” 4 preset times or custom HH:MMA scheduled job keyed to your chat
4Done β€” summary screen with /recreate hint to preview now(none)

The full menu ​

Each top-level button opens a focused screen. Drill down freely β€” every screen has ← Back to the previous level and βœ• Close to dismiss.

🎯 Filters ​

What X posts the bot fetches on every scheduled run.

Filters β€Ί Default

Tap any category to drill down. Excludes is checkbox-style β€” one tap toggles "exclude retweets / replies / quote tweets".

Named filters (advanced) lets you keep multiple filters running on the same chat β€” useful when you manage several clients in one group. Each named filter has its own per-row delete button with a confirmation tap. Tap βž• Add named filter to send a single-line definition through the menu (name from:@x keywords:y cashtags:$Z mention:@m exclude:retweet ignore:@spam). Need at least one of from / keywords / cashtags / mention.

A category screen looks like this β€” short description of what the category does, the current value, and Add / Remove / Clear all actions:

Filters β€Ί Default β€Ί Cashtags

When you tap βž• Add, the menu transitions into input mode β€” type your reply as a normal message, and the screen redraws automatically with a confirmation banner ("βœ“ Added 2 cashtags: $BTC, $ETH").

βž• Add cashtags

Send the cashtags to track, space-separated.
The $ is optional.

Example:  $BTC $ETH SOL

Type your reply as a normal message,
or tap Cancel to go back.

[βœ• Cancel]

⏰ Schedule ​

When the bot runs and posts the daily report.

Schedule menu

Four daily presets cover most communities. The currently-active preset gets a βœ“ prefix in its label. Custom time asks for HH:MM. Specific days accepts 14:30 Mon Wed Fri. Cron accepts standard cron expressions (e.g. cron(0 12 ? * MON-FRI *)). The bot enforces a 12-hour minimum frequency to keep costs predictable.

If you tap a schedule preset on a chat with no filters, the menu refuses with a friendly error pointing back at 🎯 Filters β€” the bot won't schedule a chat that has nothing to fetch.

πŸ“Š Reports & Period ​

πŸ“Š Reports & Period

Period: 01/05/2026 7days
Start:  2026-05-01
End:    2026-05-07

The bot fetches X posts inside this window on
every scheduled run. Without a period
configured, the bot uses a rolling 24-hour
window.

[πŸ“† Set period]   [πŸ—‘ Clear period]
[⚑ Generate report now]
[πŸ“° Show last report]

Set period scopes reports to a specific window (e.g. a competition lasting one week). Format DD/MM/YYYY Ndays or Nweeks. Clear period reverts to the default rolling 24h. Generate report now triggers the same Step Function the cron uses β€” useful for instant previews. Show last report points at /report (which re-posts the most recent cached image at zero credit cost).

🎨 Customization ​

Project metadata that appears on reports and the public leaderboard.

🎨 Customization

🏷 Name:        MyToken
✏️ Description: A community-driven DeFi project
πŸ“ Long desc.:  (multi-paragraph project pitch…)
πŸ–Ό Logo:        βœ“ uploaded
πŸ”— URLs:        2 URLs
πŸ’¬ Topic:       Forum topic "Reports"

[🏷 Name]      [✏️ Description]
[πŸ“ Long desc.][πŸ–Ό Logo]
[πŸ”— URLs]      [πŸ’¬ Topic]
[πŸ“ˆ Leaderboard customization]

The Leaderboard sub-tree exposes:

SettingFormat
πŸ† PointsFive numbers, space-separated: likes retweets replies quotes views (e.g. 5 1 20 10 0.01)
🎨 ColorsFive hex colors, same order
πŸ”’ Top countWhole number 1..10 β€” how many users on the leaderboard
πŸ“› Top titleFree text. Optional |#hex suffix sets a custom color (e.g. Top contributors|#FF8800)
πŸ₯‡ Best-tweet titleSame
πŸ“Š Engagement titleSame

Logo uploads use the bot's existing photo handler β€” tap πŸ–Ό Logo, then send the image as a Telegram photo (not a file). The bot resizes and uploads to the website CDN.

Topic instructs you to send /set_topic from inside the desired forum topic. The menu can't capture message_thread_id from a callback button, so this remains a slash-command surface.

πŸ‘₯ Admins & Notifications ​

Lists chats users designated to receive private DMs about credit exhaustion, fetch errors, and chat-not-found warnings. Adding admins still requires /add_admin @user1 @user2 from the chat β€” Telegram's @-mention parser only fires on real messages, not callbacks.

πŸ‘₯ Admins & Notifications

Currently:
  β€’ Alice (@alice_admin)
  β€’ Bob (@bob_dev)

To add admins, send /add_admin @user1 @user2
in this chat.

[πŸ—‘ Clear notification list]

πŸ’³ Buy Credits & Plan ​

Plan + balance display, plus the buttons that drive the buy and manage flows. The screen renders differently depending on the chat's current plan:

FREE chat:

πŸ’³ Buy Credits & Plan

Plan: FREE
Used this month: 47 / 100
Remaining:        53
Resets: 2026-06-01

[πŸ’° Buy credits / upgrade]   [πŸ›  Manage subscription]
[πŸ“Š Usage this month]

PRO subscription chat:

πŸ’³ Buy Credits & Plan

Plan: PRO (subscription) βœ“
Unlimited fetching with Stripe metering above 1 000 / month free.

[πŸ’° Buy credits / upgrade]   [πŸ›  Manage subscription]
[πŸ“Š Usage this month]

PRO credits chat (ETH-purchased):

πŸ’³ Buy Credits & Plan

Plan: PRO (credits)
Credits remaining: 4 152
Total purchased:   5 000

[πŸ’° Buy credits / upgrade]   [πŸ›  Manage subscription]
[πŸ“Š Usage this month]

The πŸ’° Buy credits / upgrade button posts a payment-options card below the menu. The options the bot offers depend on the current plan:

  • FREE β†’ both πŸ’³ Pay with Credit Card (Stripe subscription) and πŸͺ™ Pay with ETH (credit pack).
  • PRO credits β†’ both options shown. ETH tops up the existing balance; Stripe layers a subscription on top (existing ETH credits stay and are spent first per fetch).
  • PRO subscription β†’ no buy options. The bot replies with a "subscription exists" message and points at πŸ›  Manage to go to the Stripe portal.

The πŸ›  Manage subscription button opens the Stripe Customer Portal in your browser β€” that's where you update your card, cancel, or download invoices. Only meaningful when you have an active Stripe subscription.

The πŸ“Š Usage this month sub-screen breaks out fetched_posts and fetch_attempts for the current month and today β€” useful for spotting silent failures (high attempts, zero posts β†’ likely 402s or empty queries) and for previewing your next Stripe invoice when you're approaching the 1 000-post threshold.

Buy + manage are also reachable as the legacy slash commands /buy and /subscription. Behaviour is identical; the menu buttons just save you typing.

πŸ“‘ X Posts Auto-relay ​

Forwards posts from selected X accounts to the chat as soon as they're published β€” separate from the scheduled report. Useful when a project wants community admins to see official-account tweets in real time without checking X.

πŸ“‘ X Posts Auto-relay

Forward posts from X accounts to this chat as soon
as they're published. Posts can take up to 5
minutes to appear here after the original was
posted on X.

3 active relays:
▢️ @MyTokenOfficial    (4/10 today)
▢️ @MyTokenCEO         (1/10 today)
⏸ @MyTokenSupport     (0/10 today)

[ ▢️ @MyTokenOfficial ]
[ ▢️ @MyTokenCEO ]
[ ⏸ @MyTokenSupport ]
[ βž• Add Account ]

Each relay polls every 5 minutes via the X API. New posts (since the last successful forward) are pushed into the chat as plain URLs β€” Telegram auto-renders the X preview card so the post body is visible.

Per-relay manage screen lets the operator tune behaviour:

πŸ“‘ X Posts Auto-relay β€Ί @MyTokenOfficial

State: ▢️ Active
Today: 4/10 forwarded
Polls every: 5 min

Post types to forward
☐ Retweets
☐ Replies (to other users)
βœ… Quote tweets
βœ… Thread continuations (self-replies)

Topic: (default β€” top of chat)

[ ⏸ Pause ] [ ✏️ Cap: 10/day ]
[ ☐ Retweets ] [ ☐ Replies ]
[ βœ… Quote tweets ] [ βœ… Thread ]
[ πŸ’¬ Set topic ] [ 🧹 Clear topic ]
[ πŸ—‘ Delete relay ]
SettingWhat it does
Cap (1–100/day)Maximum forwards per chat per UTC day β€” when reached, the relay stops forwarding silently until midnight UTC. Default 10.
Pause / ResumeDisables the polling schedule for this relay; restoring re-creates it instantly.
RetweetsWhen βœ…, retweets by the relayed account are forwarded. Default off.
RepliesWhen βœ…, replies to other users are forwarded. Default off.
Quote tweetsWhen βœ…, quote tweets are forwarded. Default on.
Thread continuationsWhen βœ…, self-replies (a user replying to their own tweets) are forwarded β€” covers Twitter threads. Default on. Set this off if you only want the head of each thread.
TopicOptional Telegram forum-topic id. When set, relay posts only to that topic instead of the main thread.

Auto-cleanup: if Telegram returns a "chat-gone" error (bot was kicked / blocked), the relay automatically removes its polling schedule and stored configuration. No leak.

Hard limit: 10 relays per chat. Adjust the underlying constant if you need more.

ℹ️ About ​

ℹ️ About this chat

Chat ID: -1002593612414
Plan: PRO βœ“
Schedule: daily 18:00 UTC
Project: MyToken

A diagnostics panel for support requests.

How /setup relates to slash commands ​

/setup is additive β€” every existing slash command keeps working exactly as before. The menu wraps the same primitives (buildQueryFromComponents, saveXBotSetting, createScheduleRule, etc.), so behaviour is identical between the two surfaces. Power users can keep typing /add_keywords DeFi airdrop for muscle-memory speed; newcomers get a friendly clickable surface.

Three commands fundamentally cannot be moved into menu buttons because they need plain-text + Telegram message-entity context that callbacks don't carry:

CommandWhy it stays
/set_topic [name]Captures the message_thread_id of the topic the message was sent in β€” a button has no thread context
/add_admin @userRelies on Telegram's verified mention entities for chat-admin verification
/set_x_filteringLegacy slash command for adding a named filter; the menu's ‴ Named filters β†’ βž• Add named filter does the same

Configuration recipes ​

Common goals β†’ exact menu paths. Each recipe is one or two minutes of clicking.

"Track only original posts (no retweets, no replies)" ​

Most communities want the leaderboard to reward original content, not re-shares.

/setup β†’ 🎯 Filters β†’ 🚫 Excludes β†’ tap Retweets and Replies so both show βœ…. Done. Future fetches send -is:retweet -is:reply to the X API and quote tweets stay in.

"Reward replies more than likes (community building)" ​

Default points: likes 1Γ—, retweets 2Γ—, replies 1.5Γ—, quotes 3Γ—, views 0.001. To favour conversation:

/setup β†’ 🎨 Customization β†’ πŸ“ˆ Leaderboard customization β†’ πŸ† Points β†’ send:

1 1 5 3 0.001

Replies now weigh 5Γ— β€” substantive discussion outpaces drive-by likes.

"Run reports twice a day" ​

Schedule fires at most once per day by default. To get an end-of-EU and end-of-US report:

/setup β†’ ⏰ Schedule β†’ πŸ”§ Cron expression β†’ send:

cron(0 14,22 ? * * *)

Two fires/day at 14:00 + 22:00 UTC. The 12-hour minimum frequency check enforces β‰₯ 12h spacing automatically β€” narrower windows are rejected with a clear error.

"Track multiple campaigns simultaneously in one group" ​

Three concurrent client campaigns, one Telegram group, one report per campaign per fire.

/setup β†’ 🎯 Filters β†’ ‴ Named filters β†’ βž• Add named filter, then send one of these on each pass:

campaign_a from:@kol1,@kol2 keywords:"#CampaignALaunch"
campaign_b from:@kol3,@kol4,@kol5 cashtags:$CBT
campaign_c from:@kol6 mention:@CampaignC_Official

Each fires on the same schedule and posts a separate report tagged with the filter name.

"Forward an account's tweets in real time, between reports" ​

Big news from @MyTokenOfficial shouldn't wait for the 22:00 UTC report.

/setup β†’ πŸ“‘ X Posts Auto-relay β†’ βž• Add Account β†’ send:

@MyTokenOfficial 5

(Optional 5 is the daily cap; default 10.) The bot polls every 5 minutes, forwards the URL on a fresh post, Telegram renders the preview card.

"Constrain reports to a campaign window (e.g. 7-day push)" ​

Don't want pre-campaign noise contaminating the leaderboard.

/setup β†’ πŸ“Š Reports β†’ πŸ“† Set period β†’ send:

01/05/2026 7days

Reports now fetch posts strictly inside that window. πŸ—‘ Clear period reverts to rolling 24 h.

"Make reports post to a forum topic, not the main thread" ​

Group uses topics; reports should land in a dedicated Reports topic.

Open the Reports topic, then from inside it send:

/set_topic Reports

Future reports route to that topic. To revert: /set_topic clear from anywhere in the group.

"Notify two specific admins when credits run out" ​

Bot DMs designated admins on credit / fetch / chat-gone errors. By default, it falls back to all chat admins β€” narrow to a curated list.

/add_admin @alice @bob

DMs now go only to @alice and @bob. To clear: /setup β†’ πŸ‘₯ Admins β†’ πŸ—‘ Clear notification list.

"Hide the chat from the public xbot.ninja showcase" ​

Solo-KOL portfolios are auto-hidden (single user fails the β‰₯ 2 active users threshold). For community projects that should stay private:

There's no explicit hide toggle β€” public listing is gated by metric thresholds. Two ways to stay private:

  • Run a small / quiet chat that doesn't meet the thresholds (top user score < 300, posts < 5/month, or active users < 2).
  • Contact support to set the chat as exempt β€” the public dashboard skips it regardless of metrics.

The chat's direct URL (https://xbot.ninja/?chatId=…) remains accessible regardless. Share it only with people who should see the data.

Common gotchas ​

SymptomReasonFix
Schedule "rejected" with FREQUENCY_ERRORCron tries to fire more often than every 12 hSpacing check β€” pick at least 12-hour gaps. The error message names the offending hour pair.
/setup doesn't appear in autocompleteBotFather command list out of dateThe bot accepts /setup regardless of autocomplete. Update BotFather β†’ /setcommands if discoverability matters.
Filter preview shows empty parens / weird querySome component is empty/setup β†’ 🎯 Filters shows the literal query. Add at least one of accounts / cashtags / keywords / mentions.
X Posts Auto-relay forwards a thread's worth of posts at onceSelf-replies bypass X API's exclude=replies/setup β†’ πŸ“‘ X Posts Auto-relay β†’ @account β†’ toggle ☐ Thread continuations off. The bot then keeps only the thread head.
Daily cap reached but I want moreHit MAX_POSTS_PER_DAY for relayTap ✏️ Cap and raise. Each post forwarded counts as one credit.
Custom title / color reverted overnightSettings update worked but UPDATED_AT bump invalidated render cache; next fetch shows the new valueWait one report cycle. The render cache rebuilds on the next fetch.
Report has "0 posts" everywhereNo posts matched the filter in the configured periodDrop the period (rolling 24 h is more forgiving), or widen filters. Often it's a typo in a cashtag.
Bot "online" but reports stop arrivingBot was demoted from admin / kicked silentlyCheck Telegram β†’ group admins. Re-promote if missing. The bot self-disables on chat-gone errors.

Done ​

The wizard's final screen recaps everything that was saved and points at /setup β†’ πŸ“Š Reports β†’ ⚑ Generate report now for an immediate preview:

Quick Start β€” done

That's the whole tour. Type /setup in your group to start.

X Bot Documentation