Skip to main content
How-to guides

Bulk Schedule Telegram Posts From a CSV: Columns and Errors

Also available in:ENRUUK
Published on October 28, 20269 min read0 views
Bulk Schedule Telegram Posts From a CSV: Columns and Errors

Bulk Schedule Telegram Posts From a CSV: Columns and Errors

TL;DR. To bulk schedule Telegram posts, fill one CSV file with five columns: channel_id, text, image_urls, scheduled_publish_time and scheduled_publish_timezone. Upload it in Autogram with up to 100 rows. The import is all-or-nothing: one bad row rejects the file, and the result names the row and the reason. Fix the cell, upload again, and every post lands as a draft or a scheduled post.

Want the import button instead of the theory? Open the scheduling feature and download the template from the import dialog.

Why bulk schedule Telegram posts from a spreadsheet

A content calendar already lives in a spreadsheet for most channel owners. One row is one post, with a date, a text and maybe a picture. Retyping that sheet into a post composer, 30 times, is where mistakes and missed days come from.

The CSV import removes the retyping. You plan in the sheet, export it, and Autogram creates every post in one step. Each post then behaves like any post you made by hand: you can open it, edit it, move its time or delete it before it goes out. For single posts, the step-by-step scheduling guide is the better fit.

Photo by Bich Tran on Pexels

What goes in the five columns

The file needs a header row with these five names. Column order does not matter, but a missing name rejects the whole file.

ColumnWhat to put in itCan it be empty?
channel_idThe number of a channel you connected to AutogramNo
textThe post text, up to 4096 charactersYes, if image_urls has a link
image_urlsOne or more image links, separated by |Yes, if text is filled
scheduled_publish_timeLocal date and time, such as 2026-11-05T09:00:00Yes: the post becomes a draft
scheduled_publish_timezoneA time zone from the list belowYes: the time is read as UTC

A row needs at least a text or an image link. A row with neither is rejected.

The template has the exact layout, so start from it: download the template CSV. It already shows a text-only post, a post with one image, a post with several images and a draft.

Step 1: Build the sheet

Keep one post per row. Work through these checks before you export:

  • Put the channel number in channel_id for every row. If you run several channels, one file can hold all of them.
  • Write the time as YYYY-MM-DDTHH:MM:SS, with a T between the date and the time. This is the ISO 8601 shape the importer asks for.
  • Leave scheduled_publish_time empty for a post you want to review first. It becomes a draft.
  • Join several image links with a |, for example https://example.com/1.jpg|https://example.com/2.jpg.
  • Check that two posts for the same channel never share the same minute.

Export the sheet as CSV with UTF-8 encoding. Quotes matter here. The CSV format standard says a field that holds a comma, a line break or a double quote must sit inside double quotes, and a quote inside the field is written twice (RFC 4180, October 2005). Every spreadsheet app does this for you on export. If you build the file by hand, do it yourself.

Photo by Kampus Production on Pexels

Step 2: Pick the right time zone value

The importer accepts a fixed list of zone names, not free text. Valid values are Europe/Kyiv, CET, Etc/GMT, and the fixed offsets Etc/GMT-1 to Etc/GMT-12 and Etc/GMT+1 to Etc/GMT+12.

Two details cause most of the trouble:

  • The sign is reversed. In the Etc/GMT names, Etc/GMT-2 means two hours ahead of UTC and Etc/GMT+4 means four hours behind. This is how the time zone database defines the names, as a POSIX convention that many people expect to be the other way round (tz database, etcetera file). The template uses Etc/GMT-2 for that reason: it is UTC+2.
  • Fixed offsets ignore daylight saving. Etc/GMT-2 stays UTC+2 all year. If your audience lives in a place that changes the clock, use Europe/Kyiv or CET, which follow daylight saving time.

An empty zone cell is read as UTC. If your times are local, fill the zone on every row. The multi-time-zone strategy guide explains how to choose the posting hour itself.

Step 3: Upload and read the result

Open the posts page, choose bulk import, and drop the file in. A preview shows the first rows with the channel name beside each one, so you can spot a wrong channel_id before you commit. Then confirm the import.

Three outcomes are possible:

  1. Success. Every row becomes a post. Rows with a time are scheduled. Rows without one are drafts.
  2. A file-level error. The importer refuses the file before it reads any row. This happens when a header is missing, the file is empty, or it holds more than 100 rows.
  3. Row errors. The file is readable, but at least one row breaks a rule. Nothing is imported.

The import counts against your monthly post allowance as one batch. The plan details are on the pricing page.

What a bad row looks like, and how to fix it

The import is all-or-nothing on purpose. A half-imported file would leave you with 17 of 30 posts and no clear idea which 13 are missing. Instead, the result lists every row with its number, a success flag and, for a failed row, the reason.

The rows that are fine are listed too, with the note "Not imported because other rows failed validation". They are not broken. They wait for you to fix the others.

Message you seeWhat it meansFix
channel_id must be an integerThe cell holds text or a decimalUse the channel number only
channel_id ... does not exist or does not belong to this userThe channel is not one of yoursCheck the number in your channel list
Either text or image_urls is requiredThe row has no contentAdd text or an image link
text exceeds maximum length of 4096 charactersThe post is too longShorten it or split it in two rows
Invalid timezoneThe zone is not on the listUse a value from Step 2
Invalid datetime formatThe time is not ISO 8601Write 2026-11-05T09:00:00
Another row in this file already schedules channel_id ...Two rows share one channel and one minuteMove one row to another time

The last check also looks at posts you already scheduled. If a post exists for the same channel at the same moment in UTC, the new row is refused too. Fix the cells in your sheet, export again and upload the corrected file. Because nothing was created, you cannot end up with duplicates.

Photo by Szabó Viktor on Pexels

Common mistakes

  • Not checking the time cells after export. If your spreadsheet app changed 2026-11-05T09:00:00 into another date format, the importer refuses the row. Open the CSV in a plain text editor once to check.
  • Forgetting the zone column. The times are then read as UTC, and the posts go out hours from where you planned.
  • Pasting more than 100 rows. Split a long calendar into several files, by week or by channel.
  • Mixing up the sign in Etc/GMT. If a post lands at the wrong hour by twice your offset, you used + where you needed -.
  • Treating the import as a publisher. Rows with no time are drafts. They do not go out until you schedule or publish them.

FAQ

How do I schedule many Telegram posts at once?

Put each post on its own row of a CSV file with the five columns channel_id, text, image_urls, scheduled_publish_time and scheduled_publish_timezone. Upload the file through bulk import on the posts page. Autogram creates all the posts in one step, scheduled or as drafts.

How many posts can one CSV file hold?

One file holds up to 100 rows. A larger file is refused before any row is read, with a message that shows how many rows you sent. Split a longer calendar into several files and upload them one after another.

What happens if one row has an error?

Nothing is imported. The result lists every row with its number, and the failed rows carry the reason. Fix those cells in the sheet, export the file again and upload it. No post was created by the first try, so there are no duplicates to clean up.

Can I import drafts instead of scheduled posts?

Yes. Leave scheduled_publish_time empty and the row becomes a draft. Review it in the posts list, then schedule or publish it when you are ready.

Can one file hold posts for several channels?

Yes. Each row carries its own channel_id, so one file can cover all the channels you connected. A row that names a channel you do not own is rejected.

Which time zone value should I use?

Use Europe/Kyiv or CET if your readers live where the clocks change in spring and autumn. Use a fixed Etc/GMT offset only if you want the same offset all year, and remember its sign is reversed: Etc/GMT-2 is UTC+2.

Bottom line

Plan in a spreadsheet, keep the five columns tidy, and let the importer do the typing. Read the error list once, fix the named cells, and upload again. When you are ready to bulk schedule Telegram posts for the month, start from the scheduling feature and the template file.

Image credits

#bulk schedule telegram posts#csv import#schedule telegram posts#telegram content calendar#telegram time zones#telegram scheduler

Subscribe to our newsletter

Get the latest Telegram growth tips, automation strategies, and platform updates delivered to your inbox.

Or follow our Telegram channel