From downloading the app to running chains, DM campaigns and analytics. Written for total beginners — with concrete steps and real examples.
Get from zero to your first mailing in under 10 minutes.
A Telegram account (or several), a computer with Windows 10+ or macOS 11+, and about 10 minutes of free time.
Grab the installer from the download page:
.exe — no installation needed.dmg — drag the app to ApplicationsOn 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.
Log in to my.telegram.org, create an application, and copy your api_id and api_hash. Full walkthrough — on the Telegram API tab.
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.
Open Recipients → Refresh list to pull your Telegram groups, channels and contacts. Or import from a file.
Open Ads → New ad, write your message, pick recipients, set the schedule — and hit Start.
The app runs the campaign in the background and sends messages on schedule. Watch progress on the Ads page and in the Statistics dashboard.
The app is portable on Windows and drag-and-drop on macOS. No dependencies, no admin rights.
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.
Windows may show a blue dialog: "Windows protected your PC". This is normal for any unsigned app.
Windows flags any application without a paid code-signing certificate (usually $100+/year). The app is completely safe — you can verify it on VirusTotal.
Open TelegramAutoPoster.dmg and drag the app into your Applications folder.
Right-click the app icon → Open → confirm Open in the security dialog. Or go to System Settings → Privacy & Security → Open Anyway.
| Platform | Path |
|---|---|
| Windows | <folder with EXE>/data/ |
| macOS | ~/Library/Application Support/TG AutoPoster Pro/ |
Right-click the EXE → Send to → Desktop (create shortcut). On macOS drag the app to the Dock.
Every Telegram client needs api_id and api_hash — free official credentials from Telegram. Getting them takes about 3 minutes.
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.
In your browser, go to https://my.telegram.org.
Enter the number in international format starting with + — for example +12025550100. Telegram will send a confirmation code to your app or via SMS.
Click API development tools in the dashboard.
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.
You'll see two values:
1234567abcdef1234567890abcdef1234567890Anyone 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.
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.
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.
Wait 24 hours. This happens if you created multiple applications or logged in/out too often. The limit resets automatically.
Three plans, one activation window. Switch at any time by entering a new key.
| Plan | Accounts | Key extras |
|---|---|---|
| Standard — $5/mo | 1 | DM campaigns, chains, rotation, analytics, session check |
| Enterprise — $10/mo | Unlimited | + Auto-reply, bulk start/stop, stories, health monitor, backup |
| Supporter — $19.99/mo | Unlimited | + Priority support, app credits, early Cloud beta access |
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.
In the sidebar, if no license is active, you'll see a red card with an Activate button. Or go to Settings → License → Activate.
Keys look like XXXX-XXXX-XXXX-XXXX. Paste it and press Enter or click Activate.
On successful activation the license state updates instantly and the app reloads.
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.
The Accounts page is your home base. Everything else — recipients, ads, campaigns — belongs to the currently selected account.
Each account is a card showing:
The account you're currently working with is marked with a violet border and a CURRENT badge in the top-right corner.
| Button | What it does |
|---|---|
| Refresh | Re-reads the account list from the local database. |
| Check sessions | Runs a session health check across all accounts (see dedicated section below). |
| Add account | Opens 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. |
| Action | Description |
|---|---|
| Make current | Switch 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-authorize | Starts the QR/SMS login flow for this account. |
| Edit | Change 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. |
Deleting removes the account and all its ads/campaigns from the local database. Deauthorizing keeps everything — only the session file is discarded.
Fill in:
Click Save. A confirmation dialog appears offering to authorize immediately — click Authorize.
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.
Two methods. QR is faster and doesn't need a phone field — SMS is a fallback.
Click Authorize on any account. A dialog opens with two options:
If the phone is empty, the SMS option is disabled with a hint.
On your phone, open Telegram → Settings → Devices → Scan QR.
Point the camera at the code on your screen. The window closes automatically.
If you have 2FA enabled, a password prompt appears next. Type your cloud password.
The QR is valid for 180 seconds. If it expires, cancel and try again — a new one will be generated.
Telegram sends a code to your app (or via SMS). A dialog appears asking for the code.
Type the 5-digit code and press Enter. If 2FA is enabled, you'll get a password prompt right after.
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.
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.
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.
The app keeps your Telegram sessions alive without you having to babysit them.
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.
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.
In the Accounts page, each card gets a colored dot next to its name:
Go to Settings → Session health check:
| Option | Description |
|---|---|
| Check on startup | Run a check every time the app launches. Enabled by default. |
| Auto-check interval | Periodic check in minutes. 0 = disabled. Suggested: 60 or 120. |
| Auto re-authorize dead sessions | When dead sessions are found, immediately open the QR re-authorization queue without asking. |
Click Check sessions in the toolbar on the Accounts page. Progress is visible via the dot indicators; the button shows checking… X/Y.
When dead sessions are found, the app offers to re-authorize them one by one:
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.
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.
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.
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.
A risk indicator per account, based on real sending activity from the last 24 hours.
On any account card, click the shield icon. A modal opens with health data for that account.
| Level | Triggers |
|---|---|
| 🟢 Healthy | Low activity, no floods, no PEER_FLOOD history |
| 🟡 Elevated | >20 sent, or any flood, or ≥10 errors in 24h |
| 🔴 Critical | Any PEER_FLOOD, or >100 sent, or ≥3 floods in 24h |
Click Recommendations in the modal for a checklist based on the current data. For example:
Groups, channels and contacts available for the current account, laid out in three columns.
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.
| Action | Description |
|---|---|
| Refresh list | Fetch all groups, channels and contacts from Telegram. Takes 5–30 sec depending on how many chats you have. |
| Group filter | Show only recipients from a specific named group. See the Recipient Groups section. |
| Manage groups | Create, rename and delete named groups. |
| Import CSV | Bulk-load recipients from a file. Supports CSV, XLSX and JSON with a preview dialog. |
| Export CSV | Save the current list to a CSV file with UTF-8 BOM (Excel-friendly). |
| Clear all | Remove every recipient of this account. Irreversible — export first if unsure. |
When at least one item is selected, a violet action bar appears above the columns with:
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.
Yes. Each account has its own list, stored separately. Switching accounts loads the correct list automatically.
Named collections of recipients — like "Main", "VIP", "Test" — for one-click selection in ads.
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.
Toolbar on the Recipients page, near the group filter.
Type a name — e.g. "Main channels" — and save.
Either:
In the Manage groups dialog you can:
Use the group filter dropdown on the toolbar to view only members of a specific group. Options:
Open any ad → Recipients tab. Above the three columns you'll see a row of group chips:
Click a chip to toggle the whole group. Click again to deselect everything in that group.
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.
Bulk-load recipient lists from spreadsheets, JSON dumps, or a CSV exported from another app.
;, , or tab).xlsx and .xlsm with an interactive column-mapping dialoggroup/channel/contact keysTwo 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, usersTwo 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"]
}
When you import an .xlsx file, a mapping dialog appears:
group/channel/contactThe 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.
After parsing you'll see a summary:
Click Export CSV on the toolbar. The file is saved with:
Default filename: recipients_AccountName_20261016_143052.csv.
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".
Parsing is fast — a few milliseconds per 1000 rows. The preview dialog may take a second for very large files, but it works fine.
The Ads page lists all your scheduled messages for the current account and gives live control over each one.
Two-panel split:
| Button | What it does |
|---|---|
| Refresh | Reload the ad list. |
| New ad | Open the ad editor for a fresh campaign. |
| Start all / Stop all | Bulk operations for the current account. |
| Start all (all accounts) — Enterprise only | Start every ad of every authorized account. |
| Stop all (all accounts) — Enterprise only | Emergency stop across all accounts. |
Shows the selected ad's content summary, interval, time window, recipient counts, delays, and — while running — a live progress bar.
Control buttons:
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.
Click New ad to open the editor. The editor has four tabs:
Each tab is covered in its own section below.
Compose the message. Three modes: single message, content rotation, and message chains.
The default mode. Fill in the message text and optionally attach media. Variables are supported (see below).
Enable Use rotation to define multiple variants (see the dedicated rotation section).
Enable Message chains to switch to multi-step scenarios (see the dedicated chain section).
Supports multiline text, HTML formatting, and dynamic variables:
| Variable | Result |
|---|---|
{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 presentUnder the textarea the app shows the current character count, so you can see how close you are to Telegram's 4096-char limit.
Click Add files to attach photos, videos, or documents. Multiple files (up to 10) are sent as a Telegram album.
Instead of writing text, you can forward an existing saved message (or an entire album):
The regular message field and media list are hidden.
A picker opens with your saved messages. Use the search to filter by text or media type (photo/video/document/text).
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.
Variables like {name} don't work in forwarded messages — the message is copied verbatim. Use this mode for broadcast announcements, not personalized outreach.
At the bottom of the editor:
Define multiple text and media variants. Each recipient gets a different one — dramatically reducing spam-pattern detection.
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.
The single message field is replaced by a list of variants.
Whatever was in the single message field becomes variant #1's text and media.
Click Add variant. Fill in a different text and/or attach different media.
Variant #3's text is always sent with variant #3's media. This keeps variants coherent — no mismatched image-text combinations.
| Mode | Behavior |
|---|---|
| Random | For each recipient, a random variant is picked. Recommended for maximally non-patterned sending. |
| Cycle | Variants are used in order: 1, 2, 3, 1, 2, 3… |
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.
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.
Two variants still produce a repeating pattern. Five or more genuinely varies the message stream. Combine with rotating media for the strongest protection.
Turn a single ad into a multi-step dialogue — 2 to 5 messages sent one after another with configurable pauses.
The single message and rotation UI disappears. Instead you get a step builder.
If you had a message written in single mode, the app automatically converts it into the first step.
Inside any step, enable Use rotation to define multiple text+media variants for that step. The rotation mode (random/cycle) is separate per step.
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.
Click Preview to see the whole chain as a numbered timeline with per-step content bubbles and pause indicators between them.
For subscriber campaigns, a 3-step chain works like this:
| Step | Content | Delay 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." | — |
Yes — there's no hard limit, but 2–5 steps is the sweet spot. Longer chains start feeling like spam.
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.
Control when and how often the ad fires. Two scheduling modes, plus time windows, days-of-week and auto-stop protection.
Set the interval in minutes. Minimum recommendation: 180 for channels, 60 absolute floor. Below that Telegram starts responding with FloodWait.
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.
If a time falls on a day you've unchecked, the app skips to the next valid day automatically.
Restrict sending to specific hours — e.g. only during business hours. Overnight windows work too (22:00 → 06:00).
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.
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.
A random range in seconds. For each recipient, the delay is drawn uniformly between min and max.
| Scenario | Recommended |
|---|---|
| Small channels (< 20 recipients) | 10–30 sec |
| Medium lists (20–100) | 30–120 sec |
| Large lists (100+) | 60–300 sec |
| Rule | Behavior |
|---|---|
| Stop after N consecutive errors | If N errors happen in a row (counter resets on any successful send), the campaign stops. Recommended: 5–10. |
| Stop after N FloodWaits / hour | If 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. |
By default, both auto-stop rules are 0. Set them for production campaigns — there's no good reason not to.
If a selected group is a Telegram forum (with topics), you can send to specific topics — or to the main chat.
A supergroup where the admin enabled "Topics" — messages are organized into separate threads. Regular groups don't have topics.
Any forum groups you select will show a topics button.
A dialog opens with a tree of groups and their topics. Topics are loaded from Telegram on demand (cached after first fetch).
Each group has its own checkbox list. Main chat appears as the first item.
Your selection is stored per ad and per group.
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.
The "total recipients" count in the ad details includes topic splits. A single group with 3 topics selected counts as 3 recipients.
Always available. If you check only the main chat — no topics — the message goes to the general feed only.
Collect participants from any group or channel, then send them personalized direct messages.
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.
One of:
@username — if the group has a public usernamet.me/... — full invite linkSupports user variables: {name}, {first_name}, {last_name}, {username}.
How often the campaign runs a pass. For DM campaigns, 1440 minutes (once per day) is the safest.
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.
Click Start. The first pass runs immediately. Live stats appear in the info panel and update every second:
Users are skipped silently (counted in Skipped) when Telegram returns:
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.
| Reason | Meaning |
|---|---|
all_done | All fetched participants have been processed |
manual | You stopped the campaign |
peer_flood | Telegram flagged the account — hard stop |
empty_source | The source group/channel has no participants matching your filters |
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.
Bulk-join groups and channels from a list of links with configurable delays.
Paste links in the textarea — one per line. Supported formats:
https://t.me/joinchat/XXXXX — private invite linkt.me/username — public group or channel@username — public+invite_hash — private inviteRecommended: 10–30 seconds. Lower values lead to FloodWait errors very quickly. The default 5 seconds is aggressive — you'll want at least 15.
.txtThe app processes links one by one:
Your link list is automatically saved in localStorage between sessions. Click Save to file to export it as a .txt for backup.
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.
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.
Automatically publish Telegram stories on schedule. Requires Telegram Premium on the account.
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.
Fill in:
Select the campaign, click Start. The app:
| Type | Formats | Limits |
|---|---|---|
| Photo | JPG, PNG, WEBP, GIF, BMP | Up to 5 MB |
| Video | MP4, MOV, AVI, MKV, WEBM | Up to 60 seconds, up to 5 GB |
Yes — stories are per-account. If account A has Premium and account B doesn't, only A can publish stories.
The app pauses for the required time, logs the event to the Event Log and Statistics, then resumes automatically.
Not yet — the scheduler is interval-only for stories. A fixed-time option is planned for AutoPoster Cloud.
Automatically respond to incoming private messages based on keyword matching. Enterprise plan only.
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.
The app watches all incoming private messages on the current account. When a message matches a rule's condition, the configured action fires.
Fill in:
| Type | Behavior |
|---|---|
| Contains | Any keyword appears anywhere in the message (case-insensitive) |
| Equals | The entire message exactly matches a keyword |
| Regex | Python-style regex match — most powerful |
| Any | Fires on any incoming message. Keywords field is hidden. |
| Action | Behavior |
|---|---|
| Reply | Send the configured reply text to the sender |
| Silent skip | Match the message but do nothing (useful for logging patterns) |
| Notify owner | Forward the message to your Saved Messages with the rule name |
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.
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.
No — bot messages are ignored. Self-messages are also ignored.
Cooldowns are stored in memory only. Restarting the app resets them. If this matters to you, keep the app running.
Yes — {first_name}, {last_name}, {username}, and {name} are all substituted with the sender's info.
Full analytics dashboard: activity by day and hour, top targets, top errors, recent events with CSV export.
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-10 most-used recipients with sent count, error count, and — for channels — total views badge.
Top-10 error types by frequency. Useful to understand systematic issues:
not_found — the recipient no longer existsprivacy — user privacy restrictionpeer_flood — hard stop signal from Telegramflood_wait — rate-limit hitThe last 30 events with timestamp, campaign name, target, and status pill. Filtered by the same period/account/campaign as the KPIs.
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.
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
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.
Every action the app takes is logged here. Use it to monitor campaigns and diagnose problems.
| Filter | Effect |
|---|---|
| Level | Show only INFO / WARNING / ERROR / ALL |
| Account | Filter to a specific account's events |
| Search | Free text search in the message body (debounced 200 ms) |
| Silent mode | Hide routine messages like individual sends — shows only the important stuff. Enabled by default; toggle is persisted. |
Above the log body you see live counters:
Copies all filtered events to the clipboard in the same TXT format. Useful for pasting into a support ticket.
Click Clear to wipe the visible buffer and the in-memory list. The file log on disk (data/logs/app.log) is unaffected.
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.
All global configuration in one page.
| Setting | Description |
|---|---|
| Language | 25 interface languages. The change triggers a full app reload. |
| Theme | System / Dark / Light. Applies instantly without reload. |
A single proxy used by all accounts that don't have their own. Fields: type (SOCKS5 / SOCKS4 / HTTP), host, port, optional username and password.
api.ipify.org. Result appears as a toast.A single sending window applied to every ad and campaign across the account. When enabled it overrides per-ad settings.
Covered in detail in the Session Health Check section:
See the dedicated section below.
Shows the current plan, days left, end date. Button to re-open the activation dialog.
data/logs/ in your file managerGet campaign reports right in Telegram — to your Saved Messages or any chat.
In Settings, under the Telegram notifications card.
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.
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
(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).
Yes. Every notification goes through the current account. Reports appear in the same account's Saved Messages (or the chosen chat).
One click to export everything: config, database, sessions, ads, campaigns and statistics as a single ZIP file.
logs/ — log filesexports/ — exported CSV filesbackups/ — old backupsA dialog appears with an optional "include sessions" checkbox.
Default filename: tgautoposter_backup_20261016_143052.zip. Progress is logged in the Event Log.
File picker opens. Select the ZIP.
A dialog shows the backup's creation date, file count, and whether it contains sessions.
The app creates an automatic safety backup of your current state (data/backups/before_import_*.zip), then restores the ZIP on top.
A confirmation dialog offers to reload the app immediately.
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.
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.
The app checks for new versions on startup and offers a changelog window when one is available.
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).
Critical updates (security or compatibility) show without "Remind later" / "Skip" buttons — you need to download and install them to continue.
Two ways:
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.
Not yet. The app opens the download page — you install the new version manually. Silent auto-update is planned for AutoPoster Cloud.
No. Your data/ folder is untouched. Just replace the EXE / DMG.
Nothing bad happens. The check fails silently and the app continues. No popup, no error.
Everything is stored in one folder. Understand it, and you understand the app.
| Platform | Path |
|---|---|
| Windows | <folder with EXE>/data/ |
| macOS | ~/Library/Application Support/TG AutoPoster Pro/ |
| File / Folder | Purpose |
|---|---|
config.json | All settings, license cache, session_check config, notifications, global proxy |
autoposter.db | SQLite 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_v4 | Marker file — shows the legacy-data migration ran |
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.
data/backups/ and find the copy you wantconfig.json and replace the current oneBefore switching accounts, reinstalling, or moving to a new computer — export a full profile ZIP or copy the whole data/ folder to a safe place.
data/ folder (or macOS equivalent) to a USB stickdata/ folder)data/ folder with the one from the stickQuick answers to the most common issues.
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.
Open Terminal and run: xattr -cr /Applications/TelegramAutoPoster.app — this clears the quarantine flag. Then try launching again.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Contact us on Telegram: @igor_shelloff — usually replies within a few hours. Include: what you did, what happened, and the relevant log excerpt.