Dev Mode Login
Enter your API secret to get a session token. Requires DEV_AUTH=true in .env — never enable in production.
Invalid secret — check API_SECRET in .env
TG Monitor
Group Intelligence
Accounts
Loading…
Total Users
—
loading…
Active Members
—
in any group
Msgs (week)
—
vs last week
DMs Sent
—
reply rate
Activity — last 14 days
Top users this week
Loading…
Loading…
Configure forwarding per group. Each group can forward to a different channel.
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.
Loading…
Rate limit: max 15 DMs/hour with 30–90s delays. Always preview before sending.
Active: still a member of the selected group(s) and posted ≥ min messages in total across the lookback window and the selected groups. Inactive: current members who have posted at least once, but not within the lookback window. Always excluded: our own accounts, bots, members who never posted, and anyone DM'd by any campaign in the last 14 days (cooldown; inactive targets: at least the lookback window).
Summed across all weeks of the lookback window and all selected groups.
How many weeks of activity to evaluate (max 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.
Loading…
A flood-wait over 15 min means Telegram is heavily rate-limiting this account. Stopping is safer: resending right when the wait ends is the pattern that gets accounts restricted. You get a bot alert and can re-send later with the same name — people already DM'd are skipped.
Either way, these always stop the campaign: PeerFlood (Telegram has flagged the account as spam — every further send would fail and only add evidence, which can escalate to a ban) and a banned/deactivated account. Nothing is sent during sleep hours, because night-time sending looks like a bot.
—
users would receive this
Import from CSV
Upload the exported CSV (or your hand-filtered copy). Every row with a 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.
Recent campaigns
Loading…
To find a group's ID, forward any message from the group to @userinfobot. Supergroup IDs are large negative numbers like -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).
Add Group
Loading…
Download message data as CSV or Excel. Dates are optional — leave them empty to export everything. Large ranges may take a few seconds, and an export holds at most 200,000 rows.
Export
Filters
Data available: …
Loading…
Columns: message_id · user_id · username · display_name · date · time · message_body · message_type · sender_type · group_name · group_id · still_member
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.
TG Monitor — group intelligence & outreach dashboard.
Tap any section to expand it.
Getting Started

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.

If the dashboard stops loading data, close and reopen it to re-authenticate with a fresh session.
Overview Dashboard

Accounts card

One row per Telegram account the system runs, read-only. Tap ↻ to refresh.

  • Green — ok or sleeping (night hours; DMs are never sent then).
  • Yellow — flood wait (Telegram is rate-limiting it), daily cap (today's DM limit reached) or warming (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, or stale (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.

The four KPI cards read live data and need no aggregation — if they all show "—", the dashboard could not reach the server: close and reopen the app. Top users this week reads weekly totals; the current week is only filled after your operator sends /aggregate 2 to the dashboard bot (plain /aggregate only does last week).
Users Tab

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.
Message Forwarder

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.

Important: tap Save after every change. Unsaved edits are discarded when you leave the tab.
DM Campaigns

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).

Always preview before sending. Campaigns cannot be cancelled from the app once queued. Your own system accounts, bots, members who never posted and anyone DM'd in the last 14 days are excluded automatically — the preview count already reflects that, and the preview lists how many were left out for each reason.
If an Active preview returns 0 users, recent weeks may not be aggregated yet. Send /aggregate N+1 (N = Lookback; default → /aggregate 2) to the dashboard bot, wait a moment, then preview again.
Export

Choose Messages or Users at the top of the Export tab, then the format (CSV or Excel). No group ticked = all groups. Times are UTC. Each export holds at most 200,000 rows; each type can be downloaded up to 10 times an hour.

Messages

One row per stored message in the date range. Exporting all groups asks you to confirm first and shows how many messages that is. still_member says whether the author is still in that row's group.

Users

One row per person, including people who never posted, left, or are only in paused groups. There is no date filter: activity is measured back from the moment you download. With groups ticked, last message, activity and membership count only those groups.

  • 活躍 — posted in the last 7 days. 7天不活躍 — has posted, but not in the last 7 days. 從未發言 — no message stored (in the ticked groups, if any).
  • 已退群 — has membership records, but none active. 暫停群 — active only in paused groups (their flags froze when paused).
  • 自家帳號 — one of our system accounts. bot — Telegram marks it as a bot. 14天冷卻期 — DM'd by any campaign in the last 14 days.
  • type is the first that applies in the order 自家帳號 › bot › 已退群 › 暫停群 › 從未發言 › 14天冷卻期 › 7天不活躍 › 活躍; flags lists them all.
"Active" here means live messages in the last 7 days. The DM tab's Active users uses weekly totals and per-group membership, so the two counts differ. With no group ticked, the 從未發言 count matches the Overview's "never posted" number.
Common Questions

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.

TG Monitor v1.0  ·  Sessions expire after 24 h  ·  Questions? Contact your operator