How to bulk upload posts with a CSV file in Postoria

Bulk upload lets you create many posts at once from a CSV file instead of building them one by one.

In Postoria, posts from a CSV file are first created as draft posts. After that, you can review them, edit them, schedule them, or publish them right away.

Before you start

Here are the main things to know before you upload your CSV:

  • Bulk upload is not available on the Free plan
  • This import path supports CSV files; to upload local images or videos directly, use Import media as posts
  • You can download a ready-to-use CSV template here: bulk-upload-template.csv
  • Your CSV file must be 10 MB or smaller
  • A single CSV file can contain up to 100 rows
  • Media, link, and thumbnail URL values must use full http:// or https:// URLs
  • Thumbnail fields can also use a whole-number timestamp in milliseconds
  • If you want to schedule a post, Date and Time must both be filled in
  • Scheduled date and time are interpreted using your workspace time zone
  • Social network-specific validation rules still apply after import

Supported CSV columns

Postoria supports these column names:

  • Date
  • Time
  • Content Type
  • Media 1
  • Media 1 Thumbnail
  • Media 2
  • Media 2 Thumbnail
  • Media 3
  • Media 3 Thumbnail
  • Media 4
  • Media 4 Thumbnail
  • Media 5
  • Media 5 Thumbnail
  • Media 6
  • Media 6 Thumbnail
  • Media 7
  • Media 7 Thumbnail
  • Media 8
  • Media 8 Thumbnail
  • Media 9
  • Media 9 Thumbnail
  • Media 10
  • Media 10 Thumbnail
  • Caption
  • Link URL
  • First Comment
  • Comment Delay
  • AI Generated Content
  • Repost Frequency
  • Repost Until Date
  • Repost Until Time
  • Facebook Content Type
  • Facebook Caption
  • Facebook Also Publish Media to Stories
  • Instagram Content Type
  • Instagram Caption
  • Instagram Collaborators
  • Instagram Also Publish Media to Stories
  • Instagram Publish As Trial Reel
  • Instagram Auto Share If Performs Well
  • Instagram User Tags
  • LinkedIn Content Type
  • LinkedIn Caption
  • Google Business Profile Content Type
  • Google Business Profile Caption
  • Google Business Profile Button Type
  • Google Business Profile Button URL
  • Threads Content Type
  • Threads Caption
  • X Content Type
  • X Caption
  • Pinterest Content Type
  • Pinterest Caption
  • Pinterest Title
  • Pinterest Website
  • Pinterest Alt Text
  • YouTube Content Type
  • YouTube Caption
  • YouTube Title
  • YouTube Visibility
  • YouTube Category
  • YouTube Made For Kids
  • YouTube Video Language
  • YouTube Recording Date
  • YouTube Tags
  • TikTok Content Type
  • TikTok Caption
  • TikTok Who Can Watch
  • TikTok Photo Title
  • TikTok Allow Comments
  • TikTok Allow Duet
  • TikTok Allow Stitch
  • TikTok Auto Add Music
  • TikTok Disclose Post Content
  • TikTok Your Brand
  • TikTok Branded Content
  • Telegram Content Type
  • Telegram Caption
  • Bluesky Content Type
  • Bluesky Caption
  • Tumblr Content Type
  • Tumblr Caption
  • Tumblr Tags

Use the column names exactly as shown above.

Column order does not matter. Postoria matches fields by column name, not by position.

All CSV columns are optional.

You do not have to include every optional column in every CSV. For example, if you only need one media field, you can use Media 1 and leave out the rest.

However, some fields still have validation rules when they are used. For example, if you provide Date, you must also provide Time, and vice versa.

Even if a CSV row is imported successfully, social network validation rules still apply when draft posts are created or later published.

Supported content types

Postoria supports these content types in bulk upload:

  • Image
  • Video
  • Document
  • Story
  • Carousel
  • Link
  • Text
  • Reel

If you leave Content Type empty, Postoria will try to determine it automatically based on the CSV row data:

  • Multiple media URLs → Carousel
  • One media URL → Image, Video, or Document
  • A link without media → Link
  • Shared or network-specific caption only → Text

If Postoria cannot determine the content type, the CSV row can still be read, but a draft post cannot be created for that row.

Network-specific captions and content types

Use a network-specific caption column when a network needs different text from the shared Caption. For example, put a shorter version in X Caption while keeping a longer shared caption for the other selected networks.

If a network-specific caption is empty or omitted, that network inherits the shared Caption.

You can also override the shared Content Type for each supported network. The available network-specific fields are grouped below:

NetworkCaption columnContent type columnSupported content types
FacebookFacebook CaptionFacebook Content TypeImage, Video, Story, Link, Carousel, Text, Reel
InstagramInstagram CaptionInstagram Content TypeImage, Video, Story, Carousel, Reel
LinkedInLinkedIn CaptionLinkedIn Content TypeImage, Video, Document, Link, Carousel, Text
Google Business ProfileGoogle Business Profile CaptionGoogle Business Profile Content TypeImage, Text
ThreadsThreads CaptionThreads Content TypeImage, Video, Link, Carousel, Text
XX CaptionX Content TypeImage, Video, Carousel, Text
PinterestPinterest CaptionPinterest Content TypeImage, Video, Carousel
YouTubeYouTube CaptionYouTube Content TypeVideo
TikTokTikTok CaptionTikTok Content TypeImage, Video, Carousel
TelegramTelegram CaptionTelegram Content TypeImage, Video, Link, Carousel, Text
BlueskyBluesky CaptionBluesky Content TypeImage, Video, Link, Carousel, Text
TumblrTumblr CaptionTumblr Content TypeImage, Video, Link, Carousel, Text

An empty network-specific content type inherits the shared Content Type. Network-specific content types use the same Media 1 through Media 10 and Link URL values from the CSV row. An unsupported combination, such as Document in Instagram Content Type, causes a validation error. A draft is not created if the effective content type is unsupported by any selected network; selected networks are never silently omitted from a bulk-uploaded post.

For example, this row creates a shared Link post while using the image and shorter caption for Instagram:

Content Type,Media 1,Caption,Link URL,Instagram Content Type,Instagram Caption
Link,https://example.com/image.jpg,Shared caption,https://example.com/article,Image,Short Instagram caption

CSV formatting rules

A few formatting rules are important:

Date format

Use this format:

yyyy-MM-dd

Examples:

2026-12-31
2027-01-01

Time format

Use 24-hour time:

HH:mm

Examples:

08:05
23:59

URLs must be absolute

For Media fields, Link URL, and thumbnail image URLs, use full URLs such as:

https://example.com/image.png

Relative paths, broken links, and non-web file paths are not supported.

Media thumbnail values

Use Media 1 Thumbnail, Media 2 Thumbnail, and other matching thumbnail columns to set thumbnails for media files.

Each thumbnail column applies only to the matching media column:

  • Media 1 Thumbnail sets a thumbnail for Media 1
  • Media 2 Thumbnail sets a thumbnail for Media 2
  • Media 3 Thumbnail sets a thumbnail for Media 3

A media thumbnail value can be either:

  • a full image URL, or
  • a timestamp in milliseconds

Use a full image URL when you want to provide your own thumbnail image.

Example:

https://example.com/thumbnail.jpg

Use a timestamp in milliseconds when you want Postoria to generate the thumbnail from the matching video file.

Examples:

0
1000
3000

Rules:

  • Thumbnail URL values must use full http:// or https:// URLs
  • Timestamp values must be whole numbers in milliseconds
  • Do not include ms after the number
  • Social network-specific thumbnail rules may still apply when the post is created or published

Multiline caption and first comment are supported

Caption can contain multiple lines. This is useful for longer captions, paragraphs, and hashtags.

First Comment can also contain multiple lines.

Comment Delay values

Use Comment Delay to control when the comment from the First Comment column is published.

Enter the delay in minutes.

Examples:

0
2
15

Rules:

  • Leave Comment Delay empty to use the workspace default when the draft post is created
  • Use 0 to publish the comment with the post
  • Use a whole number from 1 to 120 to publish the comment after that many minutes

AI-generated content disclosure

Use AI Generated Content to mark a post for the supported social networks’ AI-generated-content disclosure.

  • Use true to enable the disclosure
  • Use false, leave the value empty, or omit the column to keep it disabled
  • The single value applies to every selected destination where the disclosure is supported: Instagram, TikTok video posts, YouTube, X, and Pinterest
  • The disclosure is not sent for TikTok photo posts or for unsupported social networks and content types

Repost column values

Use these values for repost settings:

  • Repost Frequency: Do not repost, Day, 2 days, 3 days, 4 days, 5 days, 6 days, 7 days, 8 days, 9 days, 10 days, 11 days, 12 days, 13 days, 14 days, 15 days, 16 days, 17 days, 18 days, 19 days, 20 days, 21 days, 22 days, 23 days, 24 days, 25 days, 26 days, 27 days, 28 days, 29 days, 30 days, 31 days, 32 days, 33 days, 34 days, 35 days, 36 days, 37 days, 38 days, 39 days, 40 days, 41 days, 42 days, 43 days, 44 days, 45 days, 46 days, 47 days, 48 days, 49 days, 50 days, 51 days, 52 days, 53 days, 54 days, 55 days, 56 days, 57 days, 58 days, 59 days, 60 days, Month, 2 months, 3 months, 4 months, 6 months, or Year
  • Repost Until Date: use yyyy-MM-dd
  • Repost Until Time: use HH:mm

If you provide Repost Until Date, you must also provide Repost Until Time, and vice versa.

Facebook column values

Use true or false for Facebook Also Publish Media to Stories.

When it is true, Postoria creates the regular Facebook publication first and then publishes each attached media file as a separate Facebook Story. The option has no effect when the effective Facebook content type is Story or Link.

Instagram column values

Use these values for Instagram-specific columns:

  • Instagram Collaborators: enter up to three Instagram usernames separated by commas
  • Instagram Also Publish Media to Stories: true or false
  • Instagram Publish As Trial Reel: true or false
  • Instagram Auto Share If Performs Well: true or false
  • Instagram User Tags: enter a JSON array of user tags

When Instagram Also Publish Media to Stories is true, Postoria creates the regular Instagram publication first and then publishes each attached media file as a separate Instagram Story. The option has no effect when the effective Instagram content type is Story.

Each object in Instagram User Tags must contain:

  • media: a number from 1 to 10 that refers to the matching Media column
  • username: the Instagram username to tag
  • x and y: optional coordinates from 0 to 1; when used, both must be specified

Example value:

[
  {"media": 1, "username": "alice", "x": 0.5, "y": 0.4},
  {"media": 2, "username": "bob"}
]

media: 2 always refers to Media 2, even when Media 1 is empty.

JSON quotation marks must be escaped when the value is written directly in a CSV file:

"Instagram User Tags"
"[{""media"":1,""username"":""alice"",""x"":0.5,""y"":0.4}]"

Pinterest column values

Use these values for Pinterest-specific columns:

  • Pinterest Title: enter plain text up to 100 characters
  • Pinterest Website: enter a full http:// or https:// URL up to 2,048 characters
  • Pinterest Alt Text: enter plain text up to 500 characters

Google Business Profile column values

Use these exact, case-sensitive values for Google Business Profile Button Type:

  • BOOK
  • ORDER
  • SHOP
  • LEARN_MORE
  • SIGN_UP
  • CALL

Leave the field empty when the post should not have a button.

Use Google Business Profile Button URL for the button destination. Enter a full http:// or https:// URL, or use {{location.website_url}} to use the connected location’s website. A button URL is not used for the CALL button type.

YouTube column values

Use these values for YouTube-specific columns:

  • YouTube Title: enter plain text
  • YouTube Visibility: Private, Unlisted, or Public
  • YouTube Category: Autos & Vehicles, Comedy, Education, Entertainment, Film & Animation, Gaming, Howto & Style, Music, News & Politics, Nonprofits & Activism, People & Blogs, Pets & Animals, Science & Technology, Sports, or Travel & Events
  • YouTube Made For Kids: true or false
  • YouTube Video Language: use a supported YouTube language code
  • YouTube Recording Date: use yyyy-MM-dd
  • YouTube Tags: enter one or more tags separated by commas

Supported YouTube Video Language values:

  • af = Afrikaans
  • sq = Albanian
  • am = Amharic
  • ar = Arabic
  • hy = Armenian
  • as = Assamese
  • az = Azerbaijani
  • bn = Bangla
  • eu = Basque
  • be = Belarusian
  • bs = Bosnian
  • bg = Bulgarian
  • my = Burmese
  • ca = Catalan
  • zh-CN = Chinese (China)
  • zh-HK = Chinese (Hong Kong)
  • zh-TW = Chinese (Taiwan)
  • hr = Croatian
  • cs = Czech
  • da = Danish
  • nl = Dutch
  • en = English
  • en-IN = English (India)
  • en-GB = English (United Kingdom)
  • et = Estonian
  • fil = Filipino
  • fi = Finnish
  • fr = French
  • fr-CA = French (Canada)
  • gl = Galician
  • ka = Georgian
  • de = German
  • el = Greek
  • gu = Gujarati
  • iw = Hebrew
  • hi = Hindi
  • hu = Hungarian
  • is = Icelandic
  • id = Indonesian
  • it = Italian
  • ja = Japanese
  • kn = Kannada
  • kk = Kazakh
  • km = Khmer
  • ko = Korean
  • ky = Kyrgyz
  • lo = Lao
  • lv = Latvian
  • lt = Lithuanian
  • mk = Macedonian
  • ms = Malay
  • ml = Malayalam
  • mr = Marathi
  • mn = Mongolian
  • ne = Nepali
  • no = Norwegian
  • or = Odia
  • fa = Persian
  • pl = Polish
  • pt = Portuguese
  • pt-PT = Portuguese (Portugal)
  • pa = Punjabi
  • ro = Romanian
  • ru = Russian
  • sr = Serbian
  • sr-Latn = Serbian (Latin)
  • si = Sinhala
  • sk = Slovak
  • sl = Slovenian
  • es = Spanish
  • es-419 = Spanish (Latin America)
  • es-US = Spanish (United States)
  • sw = Swahili
  • sv = Swedish
  • ta = Tamil
  • te = Telugu
  • th = Thai
  • tr = Turkish
  • uk = Ukrainian
  • ur = Urdu
  • uz = Uzbek
  • vi = Vietnamese
  • zu = Zulu

TikTok column values

Use these values for TikTok-specific columns:

  • TikTok Who Can Watch: Public, Followers, Friends, or Private
  • TikTok Allow Comments: true or false
  • TikTok Allow Duet: true or false
  • TikTok Allow Stitch: true or false
  • TikTok Disclose Post Content: true or false
  • TikTok Your Brand: true or false
  • TikTok Branded Content: true or false
  • TikTok Photo Title: enter plain text up to 90 characters
  • TikTok Auto Add Music: true or false

Tumblr column values

Use Tumblr Tags to attach native Tumblr discovery tags separately from the post caption. Enter up to 30 tags separated by commas.

Postoria trims surrounding whitespace, removes a leading #, ignores empty values, and removes duplicate tags without regard to letter case. Double quotation marks are not allowed inside Tumblr tags.

Because commas separate the tags, wrap the complete field in CSV quotation marks when it contains more than one tag:

Tumblr Caption,Tumblr Tags
Explore our latest indie game,"gaming,indiegame,steam"

How to bulk upload posts in Postoria

  1. Open the Posts page, click Bulk upload, and choose Import posts from CSV
  2. Select the target accounts you want to use
    You can also apply a group if you already have one set up
  3. Click Proceed
  4. Upload your CSV file
  5. Click Proceed again to let Postoria read the file
  6. Review the imported rows and make sure the file was read correctly
  7. Click Create draft posts to turn imported rows into drafts
  8. Review the created drafts and either:
    • schedule them, or
    • publish them right away

That’s it. Bulk upload creates draft posts first so you can still review everything before publishing.

What happens after upload

After your CSV is read:

  • Imported rows appear on the bulk upload page for review
  • You can confirm that the file was read correctly before creating drafts
  • You can schedule all draft posts at once
  • You can also publish all draft posts right away from the bulk actions menu

If some draft posts cannot be created later, those CSV rows stay on the page with an error message.

Common questions

Can I upload an Excel file?

No. The CSV import accepts CSV files, not Excel workbooks. To upload local images or videos without a CSV, choose Import media as posts from the Bulk upload menu.

Can I use only some of the supported columns?

Yes. You only need the columns relevant to your posts. For example, a CSV row with only Media 1 can still work.

Does column order matter?

No. Postoria matches CSV columns by name, not by position.

For thumbnails, the number in the column name matters. For example, Media 1 Thumbnail always applies to Media 1, even if the columns are not next to each other.

Can I leave Content Type empty?

Yes. Postoria will try to detect it automatically from the CSV row data.

Can I leave Date and Time empty?

Yes, but only if both are empty.
If one is filled in, the other must also be filled in.

Does bulk upload publish posts immediately?

No. Bulk upload creates draft posts first. You can then review, schedule, or publish them.

Can I add thumbnails from a CSV file?

Yes. Use Media 1 Thumbnail, Media 2 Thumbnail, and other matching thumbnail columns.

You can enter either a full image URL or a timestamp in milliseconds.

For example, use Media 1 Thumbnail to set a thumbnail for Media 1.

Can I use one thumbnail column for all media files?

No. Thumbnails are matched by media number.

Use Media 1 Thumbnail for Media 1, Media 2 Thumbnail for Media 2, and so on.

Can I use a timestamp for a thumbnail?

Yes. Enter a whole number in milliseconds.

For example:

1000

This means Postoria will generate the thumbnail from the matching video file at 1 second.

Do not include ms after the number.

Can I delay the comment added from the First Comment column?

Yes. Add the Comment Delay column and enter the delay in minutes, or leave the field empty to use the workspace default for new posts.

Can I mark bulk-uploaded posts as AI-generated?

Yes. Add the AI Generated Content column and set it to true. Postoria applies the disclosure to supported destinations when the draft is published. The setting does not apply to TikTok photo posts.

Final note

Bulk upload is the fastest way to create many posts at once in Postoria, but it works best when your CSV follows the exact column names and formatting rules.

If a CSV row cannot be imported or a draft cannot be created later, Postoria will show you where the problem is so you can fix it.