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://orhttps://URLs - Thumbnail fields can also use a whole-number timestamp in milliseconds
- If you want to schedule a post,
DateandTimemust 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:
DateTimeContent TypeMedia 1Media 1 ThumbnailMedia 2Media 2 ThumbnailMedia 3Media 3 ThumbnailMedia 4Media 4 ThumbnailMedia 5Media 5 ThumbnailMedia 6Media 6 ThumbnailMedia 7Media 7 ThumbnailMedia 8Media 8 ThumbnailMedia 9Media 9 ThumbnailMedia 10Media 10 ThumbnailCaptionLink URLFirst CommentComment DelayAI Generated ContentRepost FrequencyRepost Until DateRepost Until TimeFacebook Content TypeFacebook CaptionFacebook Also Publish Media to StoriesInstagram Content TypeInstagram CaptionInstagram CollaboratorsInstagram Also Publish Media to StoriesInstagram Publish As Trial ReelInstagram Auto Share If Performs WellInstagram User TagsLinkedIn Content TypeLinkedIn CaptionGoogle Business Profile Content TypeGoogle Business Profile CaptionGoogle Business Profile Button TypeGoogle Business Profile Button URLThreads Content TypeThreads CaptionX Content TypeX CaptionPinterest Content TypePinterest CaptionPinterest TitlePinterest WebsitePinterest Alt TextYouTube Content TypeYouTube CaptionYouTube TitleYouTube VisibilityYouTube CategoryYouTube Made For KidsYouTube Video LanguageYouTube Recording DateYouTube TagsTikTok Content TypeTikTok CaptionTikTok Who Can WatchTikTok Photo TitleTikTok Allow CommentsTikTok Allow DuetTikTok Allow StitchTikTok Auto Add MusicTikTok Disclose Post ContentTikTok Your BrandTikTok Branded ContentTelegram Content TypeTelegram CaptionBluesky Content TypeBluesky CaptionTumblr Content TypeTumblr CaptionTumblr 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:
ImageVideoDocumentStoryCarouselLinkTextReel
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, orDocument - 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:
| Network | Caption column | Content type column | Supported content types |
|---|---|---|---|
Facebook Caption | Facebook Content Type | Image, Video, Story, Link, Carousel, Text, Reel | |
Instagram Caption | Instagram Content Type | Image, Video, Story, Carousel, Reel | |
LinkedIn Caption | LinkedIn Content Type | Image, Video, Document, Link, Carousel, Text | |
| Google Business Profile | Google Business Profile Caption | Google Business Profile Content Type | Image, Text |
| Threads | Threads Caption | Threads Content Type | Image, Video, Link, Carousel, Text |
| X | X Caption | X Content Type | Image, Video, Carousel, Text |
Pinterest Caption | Pinterest Content Type | Image, Video, Carousel | |
| YouTube | YouTube Caption | YouTube Content Type | Video |
| TikTok | TikTok Caption | TikTok Content Type | Image, Video, Carousel |
| Telegram | Telegram Caption | Telegram Content Type | Image, Video, Link, Carousel, Text |
| Bluesky | Bluesky Caption | Bluesky Content Type | Image, Video, Link, Carousel, Text |
| Tumblr | Tumblr Caption | Tumblr Content Type | Image, 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 Thumbnailsets a thumbnail forMedia 1Media 2 Thumbnailsets a thumbnail forMedia 2Media 3 Thumbnailsets a thumbnail forMedia 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://orhttps://URLs - Timestamp values must be whole numbers in milliseconds
- Do not include
msafter 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 Delayempty to use the workspace default when the draft post is created - Use
0to publish the comment with the post - Use a whole number from
1to120to 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
trueto 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, orYearRepost Until Date: useyyyy-MM-ddRepost Until Time: useHH: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 commasInstagram Also Publish Media to Stories:trueorfalseInstagram Publish As Trial Reel:trueorfalseInstagram Auto Share If Performs Well:trueorfalseInstagram 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 from1to10that refers to the matchingMediacolumnusername: the Instagram username to tagxandy: optional coordinates from0to1; 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 charactersPinterest Website: enter a fullhttp://orhttps://URL up to 2,048 charactersPinterest 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:
BOOKORDERSHOPLEARN_MORESIGN_UPCALL
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 textYouTube Visibility:Private,Unlisted, orPublicYouTube Category:Autos & Vehicles,Comedy,Education,Entertainment,Film & Animation,Gaming,Howto & Style,Music,News & Politics,Nonprofits & Activism,People & Blogs,Pets & Animals,Science & Technology,Sports, orTravel & EventsYouTube Made For Kids:trueorfalseYouTube Video Language: use a supported YouTube language codeYouTube Recording Date: useyyyy-MM-ddYouTube Tags: enter one or more tags separated by commas
Supported YouTube Video Language values:
af= Afrikaanssq= Albanianam= Amharicar= Arabichy= Armenianas= Assameseaz= Azerbaijanibn= Banglaeu= Basquebe= Belarusianbs= Bosnianbg= Bulgarianmy= Burmeseca= Catalanzh-CN= Chinese (China)zh-HK= Chinese (Hong Kong)zh-TW= Chinese (Taiwan)hr= Croatiancs= Czechda= Danishnl= Dutchen= Englishen-IN= English (India)en-GB= English (United Kingdom)et= Estonianfil= Filipinofi= Finnishfr= Frenchfr-CA= French (Canada)gl= Galicianka= Georgiande= Germanel= Greekgu= Gujaratiiw= Hebrewhi= Hindihu= Hungarianis= Icelandicid= Indonesianit= Italianja= Japanesekn= Kannadakk= Kazakhkm= Khmerko= Koreanky= Kyrgyzlo= Laolv= Latvianlt= Lithuanianmk= Macedonianms= Malayml= Malayalammr= Marathimn= Mongolianne= Nepalino= Norwegianor= Odiafa= Persianpl= Polishpt= Portuguesept-PT= Portuguese (Portugal)pa= Punjabiro= Romanianru= Russiansr= Serbiansr-Latn= Serbian (Latin)si= Sinhalask= Slovaksl= Slovenianes= Spanishes-419= Spanish (Latin America)es-US= Spanish (United States)sw= Swahilisv= Swedishta= Tamilte= Teluguth= Thaitr= Turkishuk= Ukrainianur= Urduuz= Uzbekvi= Vietnamesezu= Zulu
TikTok column values
Use these values for TikTok-specific columns:
TikTok Who Can Watch:Public,Followers,Friends, orPrivateTikTok Allow Comments:trueorfalseTikTok Allow Duet:trueorfalseTikTok Allow Stitch:trueorfalseTikTok Disclose Post Content:trueorfalseTikTok Your Brand:trueorfalseTikTok Branded Content:trueorfalseTikTok Photo Title: enter plain text up to 90 charactersTikTok Auto Add Music:trueorfalse
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
- Open the Posts page, click Bulk upload, and choose Import posts from CSV
- Select the target accounts you want to use
You can also apply a group if you already have one set up - Click Proceed
- Upload your CSV file
- Click Proceed again to let Postoria read the file
- Review the imported rows and make sure the file was read correctly
- Click Create draft posts to turn imported rows into drafts
- 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.