Publishing

Bulk import: schedule a calendar from one CSV

The column spec (datetime, text, media, title), how filenames match uploaded files, files made for Buffer, Hootsuite, Metricool, Publer, Sendible or SocialBee, and what is checked before anything is created.

A month of posts is a spreadsheet. Dashboard → Bulk import turns each row into a scheduled post on as many accounts as you pick, with the media attached and the per-platform fields filled in.

The columns

Header names are read case-insensitively, and several spellings are accepted. You need a text column and a time; the rest is optional.

ColumnAccepted headersRequired
When to publishdatetime, date_time, scheduled, scheduledtime, when, or a date column plus a time column. Every row needs a time, not just a dateYes
The posttext, content, caption, postYes
Files to attachmedia, files, file, attachmentsNo
TitletitleNo
Instagram musicinstagram_music, ig_musicNo
TikTok musictiktok_musicNo
First commentfirst_comment, firstcomment, commentNo

Commas, not semicolons

The file must be comma-separated. Excel in a European locale exports semicolon-separated CSV by default, which arrives as one column and will not import. Save as CSV UTF-8 with commas, or set the delimiter before exporting.

A working example

datetime,text,media,title
2030-03-04 09:00,"Three things we changed this month",launch.mp4,March changelog
2030-03-05 17:30,"Behind the scenes of the shoot",bts-1.jpg;bts-2.jpg,
2030-03-06 12:00,"No media on this one, just text",,
  • Times are read in your computer's timezone. 2030-03-04 09:00 means 9am where you are sitting.
  • Dates can also be written 04.03.2030 09:00, as a slash date that can only be read one way (25/03/2030), with an AM/PM time (9:00 AM), or as an ISO time with its zone (2030-03-04T09:00+02:00), which keeps that zone.
  • Every row must be at least one minute ahead. The importer refuses past times rather than publishing instantly.
  • Wrap any text containing a comma in double quotes, as in the example.
  • Leave a cell empty to skip it. Empty trailing columns are fine.

Where the title goes

The title column is used by YouTube and Pinterest, the two platforms with a separate title field. Leave it out and the suggested YouTube title is the first line of your text, up to the first | or · and without trailing hashtags. With YouTube selected, the row list shows every row's title before anything is scheduled, and you can edit it there. Titles are never shortened for you, so a title over 100 characters, or one containing < or >, holds the row back until you fix it. Every other platform ignores the column.

Attaching media

The media column holds filenames, separated by semicolons: bts-1.jpg;bts-2.jpg. In the same dialog you upload the actual files, and rows match to them by name.

  • Matching is on the filename only. Folder paths are ignored, and case does not matter.
  • Two different files with the same filename will collide, so rename one before uploading.
  • Rows referencing a file you have not uploaded yet show Missing media and clear the moment it arrives. You can drop the CSV in first and add files after.
  • Uploads run in the background; rows go green as each file finishes.
  • Files can also come straight from Google Drive: pick them with the Drive button in the same dialog and they match by their Drive filename, like any upload. Photos and videos only, up to 200 MB each.

Files made for another scheduler

A bulk-upload file made for Buffer, Hootsuite, Metricool, Publer, Sendible or SocialBee loads as it is, with no columns to rename. The file is recognised by its header row. Hootsuite's has none, so its column A is read as the date and time, B as the text and C as a link. The dialog says which tool the file was read as and what each column became, and lists under Not imported every column whose data it cannot use, with the reason.

  • Apart from Hootsuite's, these files name media by link. Each link is matched by the file name at its end (…/photos/beach.jpg is beach.jpg): download those files and add them in the same dialog, as for the media column. A link that names no file, such as a Google Drive or YouTube page, holds its row back.
  • A link meant for the post is added to the end of its text.
  • Titles and first comments carry over. Where a row holds several comments, the first one becomes the first comment.
  • When no date in the file shows whether the day or the month comes first, the dialog asks once for the whole file.
  • Rows with no date, rows marked as drafts and story rows are held back, each with its reason. Stories are scheduled in the composer.
  • Every row goes to every account you pick. A Metricool file whose rows go to different networks is flagged, so load one file per network.
  • Rows to fix download in the file's own columns, with the reason added to each.
  • Nothing is fetched from the other tool: Schedchie reads only the file you load.

Per-platform picks

Three platforms need something a spreadsheet cannot express, so the dialog asks for it rather than making you add columns. Pinterest and TikTok ask per selected account; YouTube asks once:

PlatformWhat it asksScope
PinterestWhich board pins go to; a pin cannot be created without onePer selected Pinterest account
TikTokThe privacy level, which TikTok requires you to choosePer selected TikTok account
YouTubeWhether the videos are altered or synthetic contentOnce, applied to every row in the import

The YouTube declaration is the disclosure YouTube asks for on manual uploads: tick it when the videos make real people, places or events look real but they were generated or altered. Animation, effects and beauty filters do not count. Category and privacy are filled in for you.

Which accounts you can select

  • Text-capable platforms (Facebook, LinkedIn, Threads, Bluesky, Mastodon, Telegram, Google Business Profile and X) accept any row, and Google Business Profile rows need text. Posting to X is a €4.99 add-on per 30 posts.
  • Instagram, TikTok, Pinterest and YouTube need media, so they become selectable only when every valid row has some. The dialog says every row needs media until then.
  • TikTok and YouTube need a video specifically, and say every row needs a video otherwise.

Splitting an import into a text-only file and a video file is usually faster than trying to satisfy every platform in one pass.

Threads options

With a Threads account selected, the dialog shows two options, applied to every row in the import:

  • Who can reply: everyone, accounts you follow, mentioned only, parent post author only or followers only. Left on Leave the account's own setting, nothing is sent. Threads fixes this when the post is created; it cannot be changed afterwards.
  • Also share to Instagram (as a story): the Thread also goes to its linked Instagram account as a story, not a feed post. If Threads turns the story down, the Thread still publishes on its own and we tell you what Threads said.

Music for Reels and TikToks

Pick one track per platform in the dialog and it goes on every row that can carry it. Each row shows the track it gets as a chip; click the chip to change or remove it for that row.

To set music per row in the file, add an instagram_music or tiktok_music column. A cell holds either a track id or a song name. A name is looked up when the file loads: Instagram through its music search, TikTok against its trending Commercial Music Library list, which has no search. The match shows on the row for you to keep or change before anything is scheduled. A name with no match is marked No match, and that row posts without music unless you pick one.

RowMusic
Instagram: a single video (a Reel)Yes
Instagram: an image or a carouselSkipped, only Reels take a song
Instagram account connected with Instagram sign-inSkipped, reconnect it through Facebook to add music
TikTok account on the Business connectionYes
TikTok account on the classic connectionSkipped, reconnect it under Accounts to add the Business connection

A skipped row or account is marked with a chip that says why. It still posts, without the track.

First comment

A first_comment column posts its cell as a comment on the new post, right after the post publishes. On Bluesky, Mastodon and Threads the comment is a reply to the post. Leave a cell empty for no comment.

AccountFirst comment
LinkedInYes, up to 1,250 characters
BlueskyYes, up to 300 characters
MastodonYes, up to your server's own limit
ThreadsYes, up to 500 characters. An account connected before October 18, 2026 is skipped until you reconnect it under Accounts
TikTok account on the Business connectionYes, up to 1,200 characters, once TikTok makes the post public
TikTok account on the classic connectionSkipped, reconnect it under Accounts to add the Business connection
YouTubeYes, except on private or made-for-kids videos. A channel connected before first comments came to YouTube is skipped until you reconnect it under Accounts
Facebook, InstagramComing soon
X, Pinterest, Google Business Profile, TelegramNot supported

Before anything is created, the import lists which of your selected accounts get the comment and which do not. A comment over the platform's limit holds its row back. It is never shortened.

What gets checked

Rows are validated before anything is created, and each one is listed with a tick, a cross or a spinner. The counter at the bottom reads {n} of {total} rows ready to import.

MessageCause
Unreadable date: "…"The datetime cell could not be parsed.
Ambiguous dateA slash date that reads as either day-first or month-first, like 03/04/2030. Use YYYY-MM-DD HH:mm.
Add a time (HH:mm)The row has a date but no time.
Time is in the pastThe row is less than one minute ahead of now.
Empty row (no text, no media)Nothing to publish in that row.
Missing media: a.jpgA referenced file has not been uploaded.

Each row is also checked against every account you selected, with the composer's rules, and a row that fails names the account and the reason:

  • Text over the platform's limit, including Telegram's 1,024 characters when the row has media and your Mastodon server's own limit.
  • A Pinterest or YouTube title over 100 characters.
  • A first comment over the platform's limit, on an account that posts it.
  • More media than the platform takes in one post: 10 on Instagram, Facebook and Threads, 4 on X and Bluesky, your server's number on Mastodon.
  • A Facebook row that mixes a video with other media.
  • A Google Business Profile row with no text.

Only valid rows are imported. The rest are offered as schedchie-rows-to-fix.csv, with the reason on each row. Fix that file and import only it, so the rows that already worked are not created a second time.

Once imported, each row is an ordinary scheduled post: editable, reschedulable, and reporting its own per-account result. See why a post failed for reading those.

Limits

  • 200 MB per file, images and video only. Videos also cap at 15 minutes.
  • 2,000 file uploads per day.
  • No cap on rows. Rows are created at a deliberate pace, so a few hundred takes a couple of minutes; leave the dialog open while it runs.

Caption limits per platform are checked before anything is imported. The reference is in platform limits.

Write to support

Write with the account name and the post’s scheduled time, and a person writes back about that post.

support@schedchie.com

Unlimited accounts, unlimited posts, €7.99

Start free trial

14-day free trialCancel anytime, no questions asked