Complete Guide · v4.0

Everything you need to know

From downloading the app to running chains, DM campaigns and analytics. Written for total beginners — with concrete steps and real examples.

Getting started
Work
Ads & campaigns
Analytics & system
Help

Quick start

Get from zero to your first mailing in under 10 minutes.

What you'll need before starting

A Telegram account (or several), a computer with Windows 10+ or macOS 11+, and about 10 minutes of free time.

1 Download the app

Grab the installer from the download page:

  • Windows: portable .exe — no installation needed
  • macOS: .dmg — drag the app to Applications
2 Activate your license

On first launch you'll see the activation window. Paste your key and click Activate. If you don't have a key yet — get a free 3-day trial.

3 Get Telegram API credentials

Log in to my.telegram.org, create an application, and copy your api_id and api_hash. Full walkthrough — on the Telegram API tab.

4 Add your first account

Go to Accounts → Add account, fill in Name, API ID, API Hash (phone optional for QR). Then click Authorize and scan the QR code with your phone.

5 Load recipients

Open Recipients → Refresh list to pull your Telegram groups, channels and contacts. Or import from a file.

6 Create your first ad

Open Ads → New ad, write your message, pick recipients, set the schedule — and hit Start.

You're done!

The app runs the campaign in the background and sends messages on schedule. Watch progress on the Ads page and in the Statistics dashboard.

Download & install

The app is portable on Windows and drag-and-drop on macOS. No dependencies, no admin rights.

Windows

1 Download the EXE

Save TelegramAutoPoster.exe (~80 MB) to a dedicated folder, e.g. C:\TelegramAutoPoster\. On first launch the app will create a data/ subfolder there with all settings, sessions and logs.

2 Handle SmartScreen

Windows may show a blue dialog: "Windows protected your PC". This is normal for any unsigned app.

  1. Click More info
  2. Click Run anyway
Why does this happen?

Windows flags any application without a paid code-signing certificate (usually $100+/year). The app is completely safe — you can verify it on VirusTotal.

macOS

1 Download the DMG

Open TelegramAutoPoster.dmg and drag the app into your Applications folder.

2 First launch

Right-click the app icon → Open → confirm Open in the security dialog. Or go to System Settings → Privacy & Security → Open Anyway.

Where the data lives

PlatformPath
Windows<folder with EXE>/data/
macOS~/Library/Application Support/TG AutoPoster Pro/
Tip: create a desktop shortcut

Right-click the EXE → Send to → Desktop (create shortcut). On macOS drag the app to the Dock.

Telegram API setup

Every Telegram client needs api_id and api_hash — free official credentials from Telegram. Getting them takes about 3 minutes.

What are API ID and API Hash?

They are essentially a "developer login" for Telegram. Every third-party app has its own pair. Yours will be attached only to your account and are safe.

1 Open my.telegram.org

In your browser, go to https://my.telegram.org.

2 Log in with your phone number

Enter the number in international format starting with + — for example +12025550100. Telegram will send a confirmation code to your app or via SMS.

3 Open API Development Tools

Click API development tools in the dashboard.

4 Create an application

Fill in the form — the values don't matter at all, Telegram stores them for their records only. Select platform Desktop and click Create application.

5 Copy your credentials

You'll see two values:

  • App api_id — a number like 1234567
  • App api_hash — a 32-character string like abcdef1234567890abcdef1234567890
Keep these private

Anyone who has your API ID, API Hash and phone number can potentially access your Telegram account. Never share them in chats, screenshots, or public forums.

Can I use the same credentials for multiple accounts?

Yes. API credentials belong to an application, not to a specific Telegram user. Add as many accounts as you want with the same api_id/api_hash — each will have its own session.

What if I lost my api_id / api_hash?

Just log into my.telegram.org again and open API development tools. Your existing app is still there — you can copy the values any time.

Telegram says "too many attempts" — what to do?

Wait 24 hours. This happens if you created multiple applications or logged in/out too often. The limit resets automatically.

Activation & plans

Three plans, one activation window. Switch at any time by entering a new key.

Plans at a glance

PlanAccountsKey extras
Standard — $5/mo1DM campaigns, chains, rotation, analytics, session check
Enterprise — $10/moUnlimited+ Auto-reply, bulk start/stop, stories, health monitor, backup
Supporter — $19.99/moUnlimited+ Priority support, app credits, early Cloud beta access
What does the free trial include?

All Standard-tier features for 3 full days. Multi-account, auto-reply, story campaigns and bulk operations are Enterprise-only and not included in the trial.

Activating a key

1 Click the activation button

In the sidebar, if no license is active, you'll see a red card with an Activate button. Or go to Settings → License → Activate.

2 Paste the key

Keys look like XXXX-XXXX-XXXX-XXXX. Paste it and press Enter or click Activate.

3 The app restarts automatically

On successful activation the license state updates instantly and the app reloads.

Offline grace period

The app checks the license every 6 hours. If there's a network problem, it continues working from the cached state for up to 30 days (until the last verified end date). You'll see a grey Offline badge on the license card, but no functionality is lost.

Where to see the status

  • Sidebar card — plan name, days left, end date
  • Settings → License — same info in the settings page
  • Top banner — visible if license is missing or expired

Accounts

The Accounts page is your home base. Everything else — recipients, ads, campaigns — belongs to the currently selected account.

The account grid

Each account is a card showing:

  • Name and initial badge
  • Status — Authorized (green) or Not authorized (grey)
  • User info — the Telegram display name and @username
  • Phone, Proxy, and current session status

The account you're currently working with is marked with a violet border and a CURRENT badge in the top-right corner.

Toolbar

ButtonWhat it does
RefreshRe-reads the account list from the local database.
Check sessionsRuns a session health check across all accounts (see dedicated section below).
Add accountOpens the editor for a new account. Disabled if you reached the plan limit.
Counter (e.g. 2 / 5)Number of accounts on the current plan. Turns orange near the limit.

Card actions

ActionDescription
Make currentSwitch the whole UI to this account. Visible only on non-current cards.
Health (shield icon)Opens the Account Health modal — see the dedicated section below.
Authorize / Re-authorizeStarts the QR/SMS login flow for this account.
EditChange name, API credentials, phone, or proxy. Editing credentials requires re-authorization.
Delete (trash icon)Permanently removes the account and its session file. Ads, recipients and campaigns of this account are also removed from the database.
Deauthorize ≠ Delete

Deleting removes the account and all its ads/campaigns from the local database. Deauthorizing keeps everything — only the session file is discarded.

Adding a new account

1 Click "Add account"

Fill in:

  • Name — any label like "Main" or "Work"
  • API ID, API Hash — from my.telegram.org
  • Phone — optional if you plan to log in via QR
  • Proxy — optional per-account proxy
2 Save & authorize

Click Save. A confirmation dialog appears offering to authorize immediately — click Authorize.

Per-account proxies

For multiple accounts, use a different proxy for each. This is one of the strongest signals to Telegram that your accounts are unrelated, drastically reducing ban risk.

QR / SMS authorization

Two methods. QR is faster and doesn't need a phone field — SMS is a fallback.

Choosing a method

Click Authorize on any account. A dialog opens with two options:

  • QR code — recommended. Requires only API ID + API Hash.
  • SMS code — requires a phone number in the account settings.

If the phone is empty, the SMS option is disabled with a hint.

QR login

1 A QR window opens

On your phone, open Telegram → Settings → Devices → Scan QR.

2 Scan the QR

Point the camera at the code on your screen. The window closes automatically.

3 Two-factor prompt (if enabled)

If you have 2FA enabled, a password prompt appears next. Type your cloud password.

QR timeout

The QR is valid for 180 seconds. If it expires, cancel and try again — a new one will be generated.

SMS login

1 Select "SMS code" and click Start

Telegram sends a code to your app (or via SMS). A dialog appears asking for the code.

2 Enter the code

Type the 5-digit code and press Enter. If 2FA is enabled, you'll get a password prompt right after.

QR won't scan — what to do?

Make sure your phone has internet access and Telegram is up to date. If a proxy is set — verify it with Test proxy in Settings. Sometimes Telegram temporarily rate-limits QR generation; wait 5 minutes and try again.

Where is the session stored?

In data/sessions/session_<account_id>.session next to the EXE. This file is what keeps you logged in — no re-scan is needed until Telegram revokes the session.

Session was revoked on my phone — what happens?

The next session check will mark this account as dead (🔴). Just click Authorize again — or use the auto re-authorization queue described in the Session Health Check section.

Session health check v4.0

The app keeps your Telegram sessions alive without you having to babysit them.

Why this matters

Telegram sessions can die at any time — if someone logs in from another device, resets sessions, or the account is banned. Previously you'd find out mid-campaign. Now the app checks everything in advance — at startup and on a configurable schedule.

How it works

On app startup and at the configured interval, the app walks through every account and verifies the session is alive. It's a fast operation — one request per account. No QR or SMS, sessions are loaded from data/sessions/.

Checks run in a background thread pool (up to 3 accounts in parallel), so the interface stays responsive.

Status indicators

In the Accounts page, each card gets a colored dot next to its name:

  • 🟢 Authorized — session alive, ready to work
  • 🔴 Not authorized — session dead, needs QR re-authorization
  • 🟠 Unreachable — network problem (no internet, proxy dead). Session is probably alive — we just couldn't verify
  • ⚪ Not configured — account has no API credentials
  • 🟣 Checking — check in progress

Enabling and configuring

Go to Settings → Session health check:

OptionDescription
Check on startupRun a check every time the app launches. Enabled by default.
Auto-check intervalPeriodic check in minutes. 0 = disabled. Suggested: 60 or 120.
Auto re-authorize dead sessionsWhen dead sessions are found, immediately open the QR re-authorization queue without asking.

Manual check

Click Check sessions in the toolbar on the Accounts page. Progress is visible via the dot indicators; the button shows checking… X/Y.

Re-authorization queue

When dead sessions are found, the app offers to re-authorize them one by one:

  1. A prompt appears: "Found N dead sessions. Re-authorize all now?"
  2. Click Yes — a QR login window opens for the first dead account
  3. Scan the QR with your phone. When that account authorizes, the next QR opens automatically
  4. The process continues until the queue is empty
  5. A summary toast shows: Re-auth finished: N successful, M failed
Tip: enable auto re-authorization

If you have many accounts, turn on Auto re-authorize dead sessions. On startup you'll just see a queue of QR windows — grab your phone and scan them in one go.

Will I have to scan QR every time?

No. Sessions are stored in files and live for months. QR is only requested when the session is truly dead. In everyday use everything restores silently.

What does "Unreachable" (🟠) mean?

Not a dead session — a network problem. The app doesn't reset authorization in these cases, to prevent false logouts. Try the check again later.

What if the check is disabled?

The app still works — sessions are checked lazily on first use. But you won't know in advance if a session is dead; you'll find out when you try to send a message.

Account health monitor v4.0

A risk indicator per account, based on real sending activity from the last 24 hours.

Opening it

On any account card, click the shield icon. A modal opens with health data for that account.

What you'll see

Risk banner
Green / Yellow / Red, with a short recommendation.
Sent (24h)
How many successful sends in the last day.
Errors (24h)
Errors and FloodWaits combined.
Floods (1h)
FloodWait errors within the last hour.
PEER_FLOOD (all time)
Total count of Telegram's hardest anti-spam warning. Any value > 0 turns the risk indicator red.
7-day activity chart
Bars = sent, line = errors. Gives an immediate sense of trends.
Recent errors
Last 5 error events with target and error kind.

Risk levels

LevelTriggers
🟢 HealthyLow activity, no floods, no PEER_FLOOD history
🟡 Elevated>20 sent, or any flood, or ≥10 errors in 24h
🔴 CriticalAny PEER_FLOOD, or >100 sent, or ≥3 floods in 24h

Recommendations

Click Recommendations in the modal for a checklist based on the current data. For example:

  • If PEER_FLOOD > 0 — pause this account for 24–48 hours
  • If floods are frequent — increase delays between messages
  • If sent > 100/24h — reduce daily volume
  • Green accounts get a "You're good, keep doing what you're doing"

Recipients

Groups, channels and contacts available for the current account, laid out in three columns.

You don't usually add recipients by hand

The app reads your real Telegram dialogs and shows only chats where you can post — as admin in channels, or as member in groups. Just authorize an account and click Refresh list.

Toolbar

ActionDescription
Refresh listFetch all groups, channels and contacts from Telegram. Takes 5–30 sec depending on how many chats you have.
Group filterShow only recipients from a specific named group. See the Recipient Groups section.
Manage groupsCreate, rename and delete named groups.
Import CSVBulk-load recipients from a file. Supports CSV, XLSX and JSON with a preview dialog.
Export CSVSave the current list to a CSV file with UTF-8 BOM (Excel-friendly).
Clear allRemove every recipient of this account. Irreversible — export first if unsure.

Three columns

  • Groups — chats and supergroups where you have posting rights
  • Channels — broadcast channels you admin
  • Contacts — users you can DM

Working with items

  • Checkbox — select individual recipients
  • Checkbox in header — select / deselect all in this column
  • Delete button on hover — remove the single recipient from the local list (doesn't affect Telegram)
  • Add + — manually add a single recipient (typing the exact name)
  • Remove selected — remove all checked recipients

Selection actions bar

When at least one item is selected, a violet action bar appears above the columns with:

  • Add to group — move the selection into a named group
  • Remove from group — visible only when a group filter is active
  • Delete — remove selected recipients entirely
  • Clear selection — uncheck everything
My list is empty after Refresh

Means the app didn't find any chats where you have posting rights. Check that: (1) the account is a member of some groups, (2) in those groups you have permission to send messages, (3) for channels, you have admin rights with post_messages.

Can I have different recipient lists per account?

Yes. Each account has its own list, stored separately. Switching accounts loads the correct list automatically.

Recipient groups v4.0

Named collections of recipients — like "Main", "VIP", "Test" — for one-click selection in ads.

What is a recipient group?

It's a saved set of recipients (groups + channels + contacts) you can select in one click in the ad editor. Many-to-many: the same recipient can belong to several groups at once.

Creating a group

1 Click "Manage groups"

Toolbar on the Recipients page, near the group filter.

2 Click "New group"

Type a name — e.g. "Main channels" — and save.

3 Add recipients

Either:

  • Check recipients in the columns, then click Add to group in the action bar, or
  • When importing, define the group column — see the Import section

Managing groups

In the Manage groups dialog you can:

  • Rename a group — pencil icon
  • Delete a group — trash icon. The recipients themselves stay in your list; only the group membership is removed.
  • See the member count next to each group

Filtering the Recipients view

Use the group filter dropdown on the toolbar to view only members of a specific group. Options:

  • All recipients — show everything
  • Without group — only recipients not in any group
  • Any specific group name

Selecting a group in the ad editor

Open any ad → Recipients tab. Above the three columns you'll see a row of group chips:

  • ○ name — 12 — nothing selected (12 available)
  • ◐ name — 5/12 — partially selected
  • ✓ name — 12 — fully selected (green)

Click a chip to toggle the whole group. Click again to deselect everything in that group.

Empty groups

If a group's members aren't in your current recipient list (e.g. they got removed by Refresh list), the chip is greyed out and disabled.

Import CSV / Excel / JSON v4.0

Bulk-load recipient lists from spreadsheets, JSON dumps, or a CSV exported from another app.

Supported formats

  • CSV — auto-detects delimiter (;, , or tab)
  • Excel — .xlsx and .xlsm with an interactive column-mapping dialog
  • JSON — either a list of objects or a dict with group/channel/contact keys

CSV format

Two or three columns: type, name, and optional group.

type;name;group
group;Marketing chat;Main
channel;@my_channel;Main
contact;John Smith;
group;Test chat;Test

Type accepts synonyms in English and Russian:

  • group, groups, группа, группы
  • channel, channels, канал, каналы
  • contact, contacts, контакт, контакты, user, users

JSON format

Two accepted shapes:

[
  { "type": "group",   "name": "Marketing chat", "group": "Main" },
  { "type": "channel", "name": "@my_channel",   "group": "Main" }
]

Or grouped by type:

{
  "group":   ["Marketing chat", "Test chat"],
  "channel": ["@my_channel"],
  "contact": ["John Smith"]
}

Excel column mapping

When you import an .xlsx file, a mapping dialog appears:

  • Type column — which column holds group/channel/contact
  • Name column — which column holds the actual recipient name
  • Group column — optional named group to assign each recipient to

The app auto-guesses based on header names ("type", "name", "group", and their Russian equivalents). A live preview shows the first 4 rows as they will be parsed.

Import preview

After parsing you'll see a summary:

  • New — how many new rows will be added
  • Duplicates — how many already exist in your list
  • Errors — parse problems, with line numbers
  • Detected groups — group names found in the file

Merge vs Replace

  • Merge — appends new recipients, skips duplicates, leaves existing ones untouched
  • Replace — wipes the current list and uses only what's in the file (an extra confirmation dialog appears)

Exporting to CSV

Click Export CSV on the toolbar. The file is saved with:

  • UTF-8 BOM encoding — Excel opens non-ASCII text correctly
  • Semicolon delimiter
  • Optional group column listing all recipient groups the item belongs to

Default filename: recipients_AccountName_20261016_143052.csv.

Excel shows garbled characters

The file wasn't saved as UTF-8. Re-export from the app (it always writes UTF-8 BOM) or in Notepad choose "Save As → encoding UTF-8".

Large files (10,000+ rows)?

Parsing is fast — a few milliseconds per 1000 rows. The preview dialog may take a second for very large files, but it works fine.

Ads overview

The Ads page lists all your scheduled messages for the current account and gives live control over each one.

Layout

Two-panel split:

  • Left — list of ads with a running/paused/stopped marker
  • Right — details for the selected ad

Markers in the list

  • ▶ — running
  • ⏸ — paused
  • ⏹ — stopped

Toolbar actions

ButtonWhat it does
RefreshReload the ad list.
New adOpen the ad editor for a fresh campaign.
Start all / Stop allBulk operations for the current account.
Start all (all accounts) — Enterprise onlyStart every ad of every authorized account.
Stop all (all accounts) — Enterprise onlyEmergency stop across all accounts.

Details panel

Shows the selected ad's content summary, interval, time window, recipient counts, delays, and — while running — a live progress bar.

Control buttons:

  • Start — begin sending
  • Pause / Resume — temporarily halt without losing state
  • Stop — cancel completely (running cycle interrupts immediately)
  • Edit, Duplicate, Delete
Live refresh

The page polls the running-ad status every 1.8 seconds. Progress, markers and buttons all stay in sync with the backend without any manual refresh.

Creating a new ad

Click New ad to open the editor. The editor has four tabs:

  1. Content — text, media, rotation, chains
  2. Recipients — groups, channels, contacts, forum topics
  3. Schedule — interval, time window, days, delays, auto-stop
  4. Advanced — send limit, templates

Each tab is covered in its own section below.

Ad editor — Content

Compose the message. Three modes: single message, content rotation, and message chains.

Mode 1 — Single message

The default mode. Fill in the message text and optionally attach media. Variables are supported (see below).

Mode 2 — Content rotation

Enable Use rotation to define multiple variants (see the dedicated rotation section).

Mode 3 — Message chains

Enable Message chains to switch to multi-step scenarios (see the dedicated chain section).

Message field

Supports multiline text, HTML formatting, and dynamic variables:

VariableResult
{date}Current date (YYYY-MM-DD)
{time}Current time (HH:MM)
{datetime}Date and time
{day}Day of week
{month}Month name
{random:1000}Random integer 0–1000
{random:1-100}Random integer in range
{random:red|green|blue}Random choice
{date:%H:%M}Custom strftime format

In subscriber campaigns (DM), these user variables are also available:

  • {name} — full name
  • {first_name}, {last_name} — parts of the name
  • {username} — @username if present
Character counter

Under the textarea the app shows the current character count, so you can see how close you are to Telegram's 4096-char limit.

Media

Click Add files to attach photos, videos, or documents. Multiple files (up to 10) are sent as a Telegram album.

  • Files are listed with their base name and a hover-delete button
  • Any file type Telegram accepts: JPG, PNG, MP4, MOV, ZIP, PDF, etc.
  • Media is uploaded per message — no rate-limit issues beyond the standard sending delay

Forward from Saved Messages

Instead of writing text, you can forward an existing saved message (or an entire album):

1 Enable "Forward from Saved Messages"

The regular message field and media list are hidden.

2 Click "Pick from Saved"

A picker opens with your saved messages. Use the search to filter by text or media type (photo/video/document/text).

3 Click a message

Its ID is placed in the field. When the ad runs, the app resolves the full album (if it's an album) and forwards it as-is.

Forwarded content isn't personalized

Variables like {name} don't work in forwarded messages — the message is copied verbatim. Use this mode for broadcast announcements, not personalized outreach.

Preview and Test send

At the bottom of the editor:

  • Preview — shows the message as it will look in Telegram (with substitution of date/time variables)
  • Test send — sends the message once to the first selected recipient. Use this before launching a long campaign.

Content rotation v4.0

Define multiple text and media variants. Each recipient gets a different one — dramatically reducing spam-pattern detection.

Why use rotation?

Telegram's anti-spam systems flag identical messages sent repeatedly. When the same content goes to hundreds of recipients, the account can be limited. With rotation, every message is unique text + media combination.

Enabling rotation

1 Check "Use rotation" in the Content tab

The single message field is replaced by a list of variants.

2 The first variant is pre-filled

Whatever was in the single message field becomes variant #1's text and media.

3 Add variants

Click Add variant. Fill in a different text and/or attach different media.

Pairing rule

Text + media always travel together

Variant #3's text is always sent with variant #3's media. This keeps variants coherent — no mismatched image-text combinations.

Rotation modes

ModeBehavior
RandomFor each recipient, a random variant is picked. Recommended for maximally non-patterned sending.
CycleVariants are used in order: 1, 2, 3, 1, 2, 3…

Per-variant media

Each variant has its own media list. Click Add files under any variant to attach media specific to that variant. If a variant has no media, it's sent as a text-only message.

Using rotation inside chains

Rotation works inside chains too — each step can have its own Use rotation toggle. Step 1 might send 3 text variants randomly, Step 2 might have no rotation, Step 3 might cycle through 5 different images. Each step's counter is independent.

Recommended: 3–5 variants

Two variants still produce a repeating pattern. Five or more genuinely varies the message stream. Combine with rotating media for the strongest protection.

Message chains v4.0

Turn a single ad into a multi-step dialogue — 2 to 5 messages sent one after another with configurable pauses.

Enabling chains

1 Check "Message chains" in the Content tab

The single message and rotation UI disappears. Instead you get a step builder.

2 Migrate existing content (optional)

If you had a message written in single mode, the app automatically converts it into the first step.

Each step has

  • Text — separate message body
  • Media — separate attachments (photos, videos, docs)
  • Optional rotation — per-step toggle to define multiple variants within the step
  • Delay after — how many seconds to wait before sending the next step (only shows between steps, not after the last one)

Managing steps

  • Add step — append a new empty step at the end
  • ↑ / ↓ arrows — reorder steps (disabled on first/last)
  • X — delete a step (minimum one step must remain)

Per-step rotation

Inside any step, enable Use rotation to define multiple text+media variants for that step. The rotation mode (random/cycle) is separate per step.

How delay and interval interact

The delay after fires between steps for the same recipient. The ad's own delay between messages fires between recipients. So a 3-step chain to 10 recipients ≈ (3 sends + 2 internal pauses) × 10 + 9 inter-recipient delays.

Timeline preview

Click Preview to see the whole chain as a numbered timeline with per-step content bubbles and pause indicators between them.

Real-world example — Warm-up sequence

For subscriber campaigns, a 3-step chain works like this:

StepContentDelay after
1"Hi {first_name}! Noticed you're into marketing — quick question?"45 sec
2"We run a small private community where we share real cases."60 sec
3"Want the link? It's free."—
Can I chain more than 5 messages?

Yes — there's no hard limit, but 2–5 steps is the sweet spot. Longer chains start feeling like spam.

Do steps stop if one fails?

If a step can't be delivered (user blocked, no permission, etc.), the remaining steps for that recipient are skipped, and the campaign moves to the next recipient. If a PEER_FLOOD or auto-stop rule fires, the whole campaign stops.

Schedule

Control when and how often the ad fires. Two scheduling modes, plus time windows, days-of-week and auto-stop protection.

Schedule modes

Interval
The ad runs once, then waits N minutes, runs again, and so on. Simple and predictable. Recommended: 180+ minutes.
Fixed times
The ad fires at exact times of day (e.g. 09:00 and 18:00). Perfect for daily announcements.

Interval mode

Set the interval in minutes. Minimum recommendation: 180 for channels, 60 absolute floor. Below that Telegram starts responding with FloodWait.

Fixed-times mode

Add one or more times of day (HH:MM). The app calculates the next scheduled run — if a day has all its times in the past, the next day's first time is used.

Days of week filter applies first

If a time falls on a day you've unchecked, the app skips to the next valid day automatically.

Time window

Restrict sending to specific hours — e.g. only during business hours. Overnight windows work too (22:00 → 06:00).

Global time window override

If you enable Global time window in Settings, it overrides per-ad settings. A violet hint appears in the ad editor — the per-ad window is disabled.

Days of week

Seven checkboxes: Monday through Sunday. Only the checked days are allowed to send. If the app is running but the current day is unchecked, it logs "wrong day" and waits.

Delays between messages

A random range in seconds. For each recipient, the delay is drawn uniformly between min and max.

ScenarioRecommended
Small channels (< 20 recipients)10–30 sec
Medium lists (20–100)30–120 sec
Large lists (100+)60–300 sec

Auto-stop protection

RuleBehavior
Stop after N consecutive errorsIf N errors happen in a row (counter resets on any successful send), the campaign stops. Recommended: 5–10.
Stop after N FloodWaits / hourIf N FloodWaits occur within a rolling hour, the campaign stops. Recommended: 3–5.
PEER_FLOOD (always on)Immediate stop — cannot be disabled. Telegram's hardest anti-spam signal.
0 = disabled

By default, both auto-stop rules are 0. Set them for production campaigns — there's no good reason not to.

What happens when auto-stop fires

  1. The campaign stops immediately
  2. A log entry appears: "Auto-stop: 5 consecutive errors. Ad 'X' stopped."
  3. If Telegram notifications are enabled, you receive a report in Saved Messages
  4. The ad stays in your list — fix the issue and restart

Forum topics

If a selected group is a Telegram forum (with topics), you can send to specific topics — or to the main chat.

What's a forum group?

A supergroup where the admin enabled "Topics" — messages are organized into separate threads. Regular groups don't have topics.

Configuring topics

1 Add groups in the Recipients tab

Any forum groups you select will show a topics button.

2 Click "Configure topics"

A dialog opens with a tree of groups and their topics. Topics are loaded from Telegram on demand (cached after first fetch).

3 Check the topics you want

Each group has its own checkbox list. Main chat appears as the first item.

4 Save

Your selection is stored per ad and per group.

What happens on send

For each recipient group that's a forum, the app sends a separate message to each checked topic. If you check 3 topics in a group and the same group is also selected for another ad, the topics apply only to this ad.

Counting recipients

The "total recipients" count in the ad details includes topic splits. A single group with 3 topics selected counts as 3 recipients.

Main chat

Always available. If you check only the main chat — no topics — the message goes to the general feed only.

Subscriber campaigns (DM)

Collect participants from any group or channel, then send them personalized direct messages.

Read this first

Mass DMs are the most aggressive form of Telegram automation. Telegram bans for this faster than for anything else. Always start with tiny limits (5–10 messages per day) and never disable the auto-stop. Use a dedicated, non-important account for the first tests.

How it works

  1. You specify a source — a group or channel you have access to
  2. The app fetches the participant list (with filters)
  3. It sends each participant a personalized DM
  4. Progress is tracked — the same user never receives the message twice

Creating a campaign

1 Set the source

One of:

  • @username — if the group has a public username
  • t.me/... — full invite link
  • Exact dialog name — if the group is private
2 Write the message

Supports user variables: {name}, {first_name}, {last_name}, {username}.

3 Configure filters
  • Exclude bots — on by default, highly recommended
  • Exclude users without username — off by default
  • Only active for N days — filter by last seen date, 0 = no filter
4 Set speed & limits
  • Delay between messages — min and max seconds. Recommended: 30–60 min, up to 300 for safety
  • Daily limit per pass — how many messages to send in one run. Start with 5–10
  • Fetch limit — how many participants to load at once
5 Set interval

How often the campaign runs a pass. For DM campaigns, 1440 minutes (once per day) is the safest.

Preview participants

Click Preview on any campaign. A window opens with the list of users that would be targeted, showing name, @username and user ID. Verify the filters work as expected before launching.

Running the campaign

Click Start. The first pass runs immediately. Live stats appear in the info panel and update every second:

  • Sent — messages delivered
  • Skipped — users without username, privacy-protected, deactivated, bots
  • Failed — errors (usually privacy or flood)
  • Tracked — total distinct users who've already received a message

Skip conditions

Users are skipped silently (counted in Skipped) when Telegram returns:

  • Privacy restrictions — "user doesn't accept messages from strangers"
  • Not mutual contact
  • Deactivated account
  • You were blocked by the user

Reset progress

Click Reset to clear the "already sent" list. Use this if you want to send the same campaign again — but only after changing the message meaningfully.

Completion reasons

ReasonMeaning
all_doneAll fetched participants have been processed
manualYou stopped the campaign
peer_floodTelegram flagged the account — hard stop
empty_sourceThe source group/channel has no participants matching your filters
Safe daily volume

There's no universal number — it depends on account age, activity, and Telegram's anti-spam mood that day. Start with 5–10 messages per day for the first week. Never exceed 50 without a very good reason.

Group joiner

Bulk-join groups and channels from a list of links with configurable delays.

Preparing links

Paste links in the textarea — one per line. Supported formats:

  • https://t.me/joinchat/XXXXX — private invite link
  • t.me/username — public group or channel
  • @username — public
  • +invite_hash — private invite

Delay between joins

Recommended: 10–30 seconds. Lower values lead to FloodWait errors very quickly. The default 5 seconds is aggressive — you'll want at least 15.

Running the joiner

  1. Paste links or click Load from file to import a .txt
  2. Set the delay
  3. Click Start joining

The app processes links one by one:

  • Progress bar shows current position
  • Each attempt is logged in the Event Log
  • Live results list appears below with ✓ / ✗ indicators
  • Final toast shows: N successful, M failed

Saving your list

Your link list is automatically saved in localStorage between sessions. Click Save to file to export it as a .txt for backup.

Be careful with mass joining

Joining 100+ groups in a day on a fresh account almost always results in a temporary ban. Start with 5–10 per day, spread over multiple accounts. Increase only if the account shows no signs of stress.

What happens if the app is closed mid-join?

The joiner stops. On restart, the link list is preserved, but the running state is not. You'll need to click Start again — the app doesn't skip already-joined chats automatically. If unsure, check the log to see which links succeeded.

Story campaigns

Automatically publish Telegram stories on schedule. Requires Telegram Premium on the account.

Premium required

Stories are a Telegram Premium feature. If your account doesn't have Premium, the app will refuse to start the campaign with a clear error.

Creating a story campaign

1 Click "New story campaign"

Fill in:

  • Name — internal label
  • Media file — one photo or video (JPEG/PNG for photo, MP4/MOV for video)
  • Caption — optional text on the story
  • Interval — how often to publish. For daily stories, use 1440 minutes

Running the campaign

Select the campaign, click Start. The app:

  • Checks that the account has Premium
  • Verifies the media file exists
  • Publishes the first story immediately
  • Schedules subsequent stories at the specified interval

Media requirements

TypeFormatsLimits
PhotoJPG, PNG, WEBP, GIF, BMPUp to 5 MB
VideoMP4, MOV, AVI, MKV, WEBMUp to 60 seconds, up to 5 GB
Do I need Premium on every account?

Yes — stories are per-account. If account A has Premium and account B doesn't, only A can publish stories.

What happens on FloodWait?

The app pauses for the required time, logs the event to the Event Log and Statistics, then resumes automatically.

Can I schedule a story for a specific time?

Not yet — the scheduler is interval-only for stories. A fixed-time option is planned for AutoPoster Cloud.

Auto-reply Enterprise

Automatically respond to incoming private messages based on keyword matching. Enterprise plan only.

Enterprise-only feature

On Standard or trial, the Auto-reply section shows a locked state with an upgrade link. The rules editor, testing, and any execution require Enterprise.

What it does

The app watches all incoming private messages on the current account. When a message matches a rule's condition, the configured action fires.

Creating a rule

1 Click "New rule"

Fill in:

  • Name — internal label for the rule
  • Enabled — global on/off toggle
  • Match type — contains, equals, regex, or any
  • Keywords — one per line
  • Action — reply, silent skip, or notify owner
  • Reply text — supports {first_name}, {username}, etc.
  • Reply delay — seconds to wait before sending (feels more human)
  • Cooldown — minimum seconds between replies to the same user
  • Only private chats — scope control

Match types

TypeBehavior
ContainsAny keyword appears anywhere in the message (case-insensitive)
EqualsThe entire message exactly matches a keyword
RegexPython-style regex match — most powerful
AnyFires on any incoming message. Keywords field is hidden.

Actions

ActionBehavior
ReplySend the configured reply text to the sender
Silent skipMatch the message but do nothing (useful for logging patterns)
Notify ownerForward the message to your Saved Messages with the rule name

Testing a rule

Click Test on any enabled reply-rule. The app sends the reply text to your own Saved Messages — useful to see exactly how it renders with variable substitution.

How rules trigger

  • Incoming message is parsed
  • Rules are checked in order; the first match wins
  • The cooldown check happens — the same user can't be auto-replied to more often than the cooldown
  • If the action is reply and delay is set, the app waits that many seconds then sends
Forum groups support

If the incoming message comes from a forum group topic, the reply is sent back to the same topic — not to the general chat. This is automatic.

Does it reply to bots?

No — bot messages are ignored. Self-messages are also ignored.

Do the cooldowns persist between restarts?

Cooldowns are stored in memory only. Restarting the app resets them. If this matters to you, keep the app running.

Can I use variables in the reply?

Yes — {first_name}, {last_name}, {username}, and {name} are all substituted with the sender's info.

Statistics v4.0

Full analytics dashboard: activity by day and hour, top targets, top errors, recent events with CSV export.

Filters

Period
Last 24 hours / 7 days / 30 days / All time
Account
All accounts or one specific
Campaign
Any campaign that has produced events

KPI cards

  • Sent — successful sends (green)
  • Errors — hard errors (red)
  • Floods — FloodWait events (yellow)
  • Rate — sent / (sent + errors + floods) as a percentage
  • Views — total views for tracked channel messages

Charts

Activity by day — bar chart of sent per day, with an error line overlay.

Activity by hour — bar chart of sent per hour of day. Useful to spot your best sending windows.

Top targets

Top-10 most-used recipients with sent count, error count, and — for channels — total views badge.

Top errors

Top-10 error types by frequency. Useful to understand systematic issues:

  • not_found — the recipient no longer exists
  • privacy — user privacy restriction
  • peer_flood — hard stop signal from Telegram
  • flood_wait — rate-limit hit
  • And others, depending on the specific error returned

Recent events

The last 30 events with timestamp, campaign name, target, and status pill. Filtered by the same period/account/campaign as the KPIs.

Channel views tracking

For broadcast channels where your account is admin, the app fetches view counts automatically in the background. Refreshed every 10 minutes for messages up to 7 days old.

Export CSV

Click Export CSV to save all events matching the current filters to a CSV file (up to 100,000 rows). Columns:

timestamp;account_id;campaign_name;campaign_type;target_name;target_kind;status;error_kind;views

Retention

Statistics are stored locally in SQLite. Events older than 90 days are automatically purged by a daily background job. Change retention in the config if needed.

Event log

Every action the app takes is logged here. Use it to monitor campaigns and diagnose problems.

Event types

  • INFO (blue) — routine events: mailing started, message sent, campaign completed
  • WARNING (orange) — potential issues: small interval, slow network, skipped users
  • ERROR (red) — actual failures: entity not found, no permission, PEER_FLOOD

Filters

FilterEffect
LevelShow only INFO / WARNING / ERROR / ALL
AccountFilter to a specific account's events
SearchFree text search in the message body (debounced 200 ms)
Silent modeHide routine messages like individual sends — shows only the important stuff. Enabled by default; toggle is persisted.

Counters

Above the log body you see live counters:

  • Total — all visible events
  • Sent — successful sends
  • Warnings — warnings
  • Errors — errors

Exporting

  • Export TXT — plain text, one event per line
  • Export CSV — structured with timestamp, level, kind, silent flag, account, message. UTF-8 BOM for Excel.

Copy all

Copies all filtered events to the clipboard in the same TXT format. Useful for pasting into a support ticket.

Clearing

Click Clear to wipe the visible buffer and the in-memory list. The file log on disk (data/logs/app.log) is unaffected.

Tip for troubleshooting

If something doesn't work, disable Silent mode to see every individual event. The full log will show exactly what happened at the message level.

Settings

All global configuration in one page.

General

SettingDescription
Language25 interface languages. The change triggers a full app reload.
ThemeSystem / Dark / Light. Applies instantly without reload.

Global proxy

A single proxy used by all accounts that don't have their own. Fields: type (SOCKS5 / SOCKS4 / HTTP), host, port, optional username and password.

  • Save — writes to config
  • Test — checks your external IP through this proxy via api.ipify.org. Result appears as a toast.
  • Clear — resets all fields and removes the global proxy

Global time window

A single sending window applied to every ad and campaign across the account. When enabled it overrides per-ad settings.

Auto-start

  • Auto-start all ads after authorization — when an account authorizes, every ad it owns starts immediately

Session health check

Covered in detail in the Session Health Check section:

  • Enable on startup
  • Auto-check interval (minutes, 0 = disabled)
  • Auto re-authorize dead sessions

Telegram notifications

See the dedicated section below.

License

Shows the current plan, days left, end date. Button to re-open the activation dialog.

Data & logs

  • Storage stats — total data size, accounts, recipients, campaigns counters
  • Open logs folder — opens data/logs/ in your file manager
  • Backup export — full profile to ZIP
  • Backup import — restore from ZIP with a preview dialog
  • Check for updates — manual update check
  • Debug — shows a JSON dump of the update subsystem state (useful for support)

Danger zone

  • Reset settings — wipes proxy, time window, autostart, session check and notification settings back to defaults
  • Clear accounts — deletes every account and its session. Confirmation dialog first.

Telegram notifications

Get campaign reports right in Telegram — to your Saved Messages or any chat.

Enabling

1 Check "Enable notifications"

In Settings, under the Telegram notifications card.

2 Choose the target
  • Saved Messages — safest, simplest
  • Any chat — opens a picker with all your dialogs, search included
3 Pick events
  • Start — off by default
  • Complete — on by default, includes stats
  • Stop — on by default, includes manual and auto-stop
  • Error — on by default, includes PEER_FLOOD, floods, consecutive errors

Testing

Click Send test notification. It uses the first authorized account and sends a test message to your chosen target. If no authorized account exists, you'll get a clear error.

Events delivered

Every notification carries a formatted summary. A typical campaign-completion report looks like:

✅ Mailing completed

📣 Campaign: Promo
📤 Sent: 45
❌ Errors: 2

⏱ Duration: 12 min
🕐 14:30 — 14:42
Notifications don't arrive — what to check

(1) Enable flag is on, (2) at least one event is checked, (3) the account is authorized, (4) if you chose a specific chat, your account can write to it (some channels don't allow messages from non-admins).

Are notifications sent from my account?

Yes. Every notification goes through the current account. Reports appear in the same account's Saved Messages (or the chosen chat).

Full profile backup v4.0

One click to export everything: config, database, sessions, ads, campaigns and statistics as a single ZIP file.

What's included

  • config.json — all settings, license key cache
  • autoposter.db — accounts, recipients, ads, stories, subscribers, templates, auto-reply rules, statistics
  • sessions/*.session — Telegram session files (optional, see below)
  • templates/ — any template folder data

What's excluded

  • logs/ — log files
  • exports/ — exported CSV files
  • backups/ — old backups
  • WAL/SHM SQLite temporary files

Exporting

1 Settings → Backup export

A dialog appears with an optional "include sessions" checkbox.

2 Choose whether to include sessions
  • Checked — full restore possible, no re-authorization needed. Sessions are sensitive — keep the ZIP safe.
  • Unchecked — safe to share. On restore, you'll need to re-authorize every account with QR.
3 Save location

Default filename: tgautoposter_backup_20261016_143052.zip. Progress is logged in the Event Log.

Importing

1 Settings → Backup import

File picker opens. Select the ZIP.

2 Preview the manifest

A dialog shows the backup's creation date, file count, and whether it contains sessions.

3 Confirm

The app creates an automatic safety backup of your current state (data/backups/before_import_*.zip), then restores the ZIP on top.

4 Restart

A confirmation dialog offers to reload the app immediately.

Treat backup ZIPs like passwords

If the archive includes sessions, anyone with the ZIP can log in to your Telegram accounts. Store it encrypted (7-Zip, VeraCrypt) or keep it on a physically secure medium.

Safety backup automatic

Before any import, the app makes a full backup of your current profile. If something goes wrong, you can restore it from data/backups/before_import_*.zip.

Updates

The app checks for new versions on startup and offers a changelog window when one is available.

Automatic check

2.5 seconds after startup, a small request goes to the update server. If a newer version exists, a changelog dialog appears with categorized items (features, fixes, improvements, security).

Update dialog

  • Download — opens the download page in your browser
  • Remind later — dialog closes, will show again next launch
  • Skip this version — never show this specific version again (if a newer one comes out, the dialog returns)
Mandatory updates

Critical updates (security or compatibility) show without "Remind later" / "Skip" buttons — you need to download and install them to continue.

Manual check

Two ways:

  • The download icon in the topbar
  • Settings → Data & logs → Check for updates

Debug info

Settings → Debug shows a JSON dump with your current version, the server's response, and whether the update would trigger. Useful when opening a support ticket.

Do updates install themselves?

Not yet. The app opens the download page — you install the new version manually. Silent auto-update is planned for AutoPoster Cloud.

Will I lose my data when updating?

No. Your data/ folder is untouched. Just replace the EXE / DMG.

What if the update server is down?

Nothing bad happens. The check fails silently and the app continues. No popup, no error.

Data & folders

Everything is stored in one folder. Understand it, and you understand the app.

Folder locations

PlatformPath
Windows<folder with EXE>/data/
macOS~/Library/Application Support/TG AutoPoster Pro/

What's inside

File / FolderPurpose
config.jsonAll settings, license cache, session_check config, notifications, global proxy
autoposter.dbSQLite database — accounts, recipients, groups, ads, stories, subscribers, templates, auto-reply rules, statistics events
sessions/Encrypted Telegram sessions, one per account. Never share these files.
logs/app.log (rotating, 5 MB × 3 files) and crash.log (only created on crashes)
backups/Auto backups: config.json snapshots and pre-import ZIPs
exports/Default save folder for CSV / TXT / ZIP exports
.migrated_v4Marker file — shows the legacy-data migration ran

Automatic backups

Every time you save settings or a campaign, the previous config.json is copied to backups/ with a timestamp. Only the 5 most recent are kept.

Restoring a config backup manually

  1. Close the app
  2. Open data/backups/ and find the copy you want
  3. Rename it to config.json and replace the current one
  4. Restart the app
Before big changes — backup

Before switching accounts, reinstalling, or moving to a new computer — export a full profile ZIP or copy the whole data/ folder to a safe place.

Migrating to a new computer

  1. Copy the entire data/ folder (or macOS equivalent) to a USB stick
  2. Install the app on the new computer
  3. Close it once (so it creates the empty data/ folder)
  4. Replace the new data/ folder with the one from the stick
  5. Launch — everything is preserved

Troubleshooting

Quick answers to the most common issues.

The app doesn't launch on Windows

Most likely Windows Defender / SmartScreen is blocking it. Right-click the EXE → Properties → check Unblock at the bottom of the General tab. If that doesn't help — add an exception in Windows Security. Try running as Administrator once.

The app doesn't launch on Mac ("app is damaged")

Open Terminal and run: xattr -cr /Applications/TelegramAutoPoster.app — this clears the quarantine flag. Then try launching again.

QR code doesn't scan or SMS code never arrives

Check that your phone has internet access and Telegram is up to date. If a proxy is set — verify it with the "Test proxy" button. Sometimes Telegram temporarily rate-limits codes; wait 5 minutes and retry.

Recipients list is empty after Refresh

Means the app didn't find any chats where you have posting rights. Check: (1) the account is a member of some groups, (2) in those groups you can send messages, (3) for channels, you have admin rights with post_messages.

FloodWait errors on every send

Telegram is rate-limiting the account. Increase the delay between messages (Schedule tab). Wait 24–48 hours and resume with lower volume. Consider rotating multiple accounts to distribute load.

"Peer flood" error

Telegram's strongest anti-spam warning. The campaign stops automatically. Do NOT restart it immediately — wait 24–48 hours. If it repeats, the account may be permanently limited.

The license check fails — "Network error"

Your internet or ISP is blocking our server. The app has up to 30 days of offline grace period — you can keep working. If it repeats beyond that, configure a proxy in Settings → Global proxy.

Account status shows "Not authorized" out of the blue

Telegram revoked the session. Rare, but happens if you logged in from too many devices, reset sessions in Telegram, or someone else accessed the account. Just click "Authorize" again.

Notifications don't arrive in Telegram

Check: (1) enabled in Settings, (2) at least one event checked, (3) the chosen chat is one your account can write to, (4) the account is authorized. If everything looks OK — check the Event log for errors.

App is slow / lags with many accounts

Performance drops when you have 30+ accounts actively sending. Try: (1) closing unused sections, (2) not running multiple high-frequency campaigns simultaneously, (3) checking CPU/RAM usage in Task Manager.

How do I see what went wrong — full log

Open Event log, disable Silent mode, and reproduce the issue. Copy the log (Copy all button) and send it to us on Telegram @igor_shelloff. Or export as TXT.

Where can I get help?

Contact us on Telegram: @igor_shelloff — usually replies within a few hours. Include: what you did, what happened, and the relevant log excerpt.