Changes apply only after you tap Save, and the listener picks them up within 60 seconds. The listening account must be allowed to post in the target channel.
52). Active: this week so far plus the previous N full weeks (Mon–Sun) — 1 = last week + this week. Inactive: no post in the last N×7 days.user_id is DM'd the
message below. Activity targeting and group selection are ignored — the file is the recipient list.
Users already contacted under the same campaign name are skipped. Bots, our own accounts, people who never posted and anyone DM'd by any campaign in the last 14 days are skipped too, and so is anyone who is no longer a member of any active (not paused) monitored group.
The On long flood-wait option above applies here as well.
-1001234567890.Tap the on any group to import its past 7 or 30 days of messages.
The members: … · synced … line shows the last weekly member sync:
complete (full list read), partial (Telegram returned only part of a large or hidden-member group) or flood_wait (rate-limited, retried later).
still_member: is that user still in that row's group — yes / no (left) / unknown (no membership record); blank for channel and anonymous-admin posts. Paused groups keep the value from when they were paused.
Tap any section to expand it.
TG Monitor listens to your designated Telegram groups as a regular member — no admin access required. It records who posts, how often, and when, then gives you this dashboard to act on that intelligence.
What you can do
- See who is active (or inactive) across all monitored groups
- Automatically forward specific messages to a private channel
- Send targeted direct messages to active or lapsed members
- Track reply rates for every DM campaign
Access & security
Only the Telegram accounts listed as admins on the server (ADMIN_CHAT_IDS) can open this dashboard. Every API request is validated server-side — your session expires automatically after 24 hours.
Accounts card
One row per Telegram account the system runs, read-only. Tap ↻ to refresh.
- Green —
okorsleeping(night hours; DMs are never sent then). - Yellow —
flood wait(Telegram is rate-limiting it),daily cap(today's DM limit reached) orwarming(new account, DMs held back for its first days). - Red —
peer flood(Telegram flagged the account as spam; DMs paused 24 h),banned,start failed, orstale(no heartbeat for over 5 min — the service may be down). - Second line: heartbeat 12s ago · today 12/40 · age 194d, or the flood-wait / pause end time, or the error for banned / start failed. never reported = that account's service has not started yet.
KPI Cards
- Total Users — every unique person ever seen across all groups, including those who have since left. The small line shows how many of them have never posted (seen only by joining or by the member sync).
- Active Members — users who are currently a member of at least one group.
- Msgs (week) — message count in the current ISO week (Mon–Sun). The ↑/↓ arrow compares it with the 7 days that ended one week ago (not last Mon–Sun), so early in the week it usually shows ↓.
- DMs Sent — total direct messages delivered across all campaigns. The percentage is the overall reply rate.
Activity Chart
Shows daily message volume for the last 14 days. A flat or rising line means healthy engagement. A sudden drop may indicate a group going quiet or a monitoring interruption.
Top Users This Week
The 4 highest per-group message counts this week (someone active in two groups can appear twice). Reads weekly totals — empty until /aggregate 2 has run this week. The bar shows each count as a share of the top one.
/aggregate 2 to the dashboard bot (plain /aggregate only does last week).A live, paginated directory of every Telegram user the system has observed, sorted by most-recently-seen first.
Searching
Type in the search box to filter by username or first name. Results update automatically as you type (300 ms debounce).
Reading the list
- The blue badge shows the last time the user posted in, or was seen joining, any monitored group — e.g., "3h ago" or "12d ago".
- Users remain visible even after leaving a group. "Last seen" reflects the most recent message (or join) observed, not Telegram's own online indicator.
- Grey never posted badge: known only from joining or the member sync, so they are never DM targets. Red bot: Telegram marks the account as a bot. Yellow own account: one of our own system accounts. All three are always excluded from DM campaigns.
- The pagination line below the list shows your current page and the total user count.
Automatically copies matching messages from monitored groups to a channel or chat of your choice. Each group can forward to a different destination.
Controls (per group)
- Enable forwarder — on/off switch for this group.
- Forward all — sends every message without keyword filtering. Use with caution on high-volume groups.
- Target channel ID — the chat or channel to forward into. Forward any message from the target to @userinfobot to find its ID (a large negative number like
-1001234567890). - Keywords — only forward messages containing at least one listed word. Case-insensitive. Up to 20 keywords, 50 chars each.
Adding & removing keywords
Type a word in the input field and tap Add or press Enter. Tap the × on any tag to delete it.
Send a direct message to a filtered subset of users observed in your monitored groups.
Step-by-step
- 1. Campaign name — a unique label (letters, numbers, dashes, underscores only, max 64 chars). The same user will never receive the same campaign name twice, protecting against accidental re-sends.
- 2. Target — Active users: still a member of the selected group(s) and posted ≥ min messages in total across the look-back window and the selected groups. Reads weekly totals (previous week auto-computed Monday 00:05 UTC; this week needs
/aggregate 2). Inactive users: current members who have posted at least once, but not within the look-back window. Always excluded: our own accounts, bots, members who never posted, and anyone DM'd by any campaign in the last 14 days (cooldown; for inactive targets at least the look-back window). - 3. Min messages — (active targeting only, 1–1000) summed across all weeks of the look-back window and all selected groups: 2 messages a week for 2 weeks passes a threshold of 3.
- 4. Message — the DM text sent to each recipient. Max 4,096 characters.
- 5. Preview targets — run this first. It calculates the recipient list without sending anything. Verify the count looks right.
- 6. Send Campaign — confirms and queues the job. The server processes it in the background at the rate limits below.
Rate limits
- Max 15 DMs per hour per account, then about an hour's rest
- 30–90 second random delay between each message
- Max 40 DMs per day per fully warmed account (60+ days old); newer accounts send fewer (nothing in the first 7 days, then 5 / 10 / 20 a day)
- Nothing is sent 23:00–08:00 (sleep hours)
- When an account reaches its daily cap the job stops — it does not continue by itself the next day. Send again the next day with the same name; people already DM'd are skipped. Example: 100 recipients on one warmed account ≈ 3 days (40 + 40 + 20, about 3 hours of sending each day). Preview targets shows the estimate for your list and accounts.
- Short flood-waits pause and resume. A PeerFlood always stops the campaign and pauses the account 24 h; a flood-wait over 15 min stops it too unless you chose Keep waiting. You get a bot alert. Re-send later with the same name — people already DM'd are skipped.
Why a campaign stops
- PeerFlood — Telegram has flagged the account as spam and blocks DMs to strangers for now. Every further send would fail and only add evidence, which can escalate to a ban. The campaign always stops and the account is paused 24 h.
- Long flood-wait (> 15 min) — Telegram is heavily rate-limiting the account; resending right when the wait ends is the pattern that gets accounts restricted. Choose Stop campaign (recommended) or Keep waiting up to N h in the DM tab. With waiting, the campaign sleeps, then re-checks sleep hours and the daily cap before it continues; a wait longer than your limit still stops it.
- Sleep hours — nothing is sent at night, because night-time sending looks like a bot.
Recent campaigns
The card under Import lists every campaign with its status (running 12/40, done · 38 sent · 2 failed), the flood-wait option it was queued with, and its reply count. A stopped campaign shows the reason in red. Tap a row to see who replied (first 50).
/aggregate N+1 (N = Lookback; default → /aggregate 2) to the dashboard bot, wait a moment, then preview again.All KPIs show "—" or the page is blank
Your session may have expired or the server is unreachable. Close and reopen the app. If the issue persists, ask your operator to check the server status.
Campaign preview returns 0 users
Active targeting reads weekly totals, and the current week is never aggregated automatically. Send /aggregate N+1 to the dashboard bot, where N is your Lookback (default 1 → /aggregate 2; max 12), wait for its "Done." reply, then preview again. If the preview lists people under "Not included", the rules excluded them — aggregating again will not change that. Inactive targeting reads live data and needs no aggregation.
Can I send the same campaign to the same people again?
Not with the same campaign name — the system deduplicates by user+campaign pair. Use a new name (e.g., june_promo_v2) to re-contact them.
What if a user has blocked the account?
The system logs it as "blocked" and continues to the next recipient. Blocked users do not count against the hourly limit.
Is "last seen" the same as Telegram's online status?
No. "Last seen" here is the timestamp of the user's most recent message (or join) observed in a monitored group — not their Telegram online/offline indicator.
The forwarder isn't forwarding anything
Check that: (1) Enable forwarder is on for the group, (2) you have entered a valid Target channel ID, (3) you have tapped Save, and (4) the monitoring account is a member of the target channel.
Who can access this dashboard?
Only the Telegram accounts whose numeric user IDs are listed in ADMIN_CHAT_IDS on the server (comma-separated; if it is not set, the single ADMIN_CHAT_ID is used). Every request is verified server-side — other users are rejected even if they have the app link.