How to upload posts in bulk to Buffer
Buffer’s bulk upload feature lets you add multiple posts at once using a CSV file, saving time when filling your content calendar or planning campaigns.
This guide explains where to find the bulk upload feature, how to prepare and upload your CSV, what the feature supports, and how to troubleshoot common issues. Bulk upload is available on all Buffer plans, including Free, and can be found in each channel’s settings.
In this article:
- Which plans include bulk upload, and how many posts can I add?
- Downloading the CSV template
- Preparing your CSV file
📝 Bulk upload is not currently supported for YouTube.
Which plans include bulk upload, and how many posts can I add?
Bulk upload is available on all Buffer plans, including the Free plan. Upload limits depend on your plan:
- Free plan: Up to 10 posts per channel per upload, limited by the number of slots remaining in your queue. For example, if your Facebook Page already has 3 scheduled posts, you can upload up to 7 more.
- Paid plans: Up to 100 posts per channel per upload.
If your CSV exceeds your plan’s limit, Buffer uploads posts up to the limit and skips the rest without showing an error. If posts appear to be missing, split the CSV into smaller batches or review your plan limits on our pricing page.
Downloading the CSV template
Start by downloading the CSV template for the channel you want to schedule to. Each template includes the correct columns for that social network, so use a fresh download each time.
- Click the Publish tab in the left sidebar.
- Select the channel you want to upload posts to.
- Click the gear icon (⚙️) next to the channel name to open the settings menu.
- Click the General tab.
- Click the Bulk Upload button.
- Click Download Template.

📝 Notes:
- Download a fresh template from the channel settings for the specific channel you're scheduling to. Some channels, such as Pinterest, require additional fields (such as a "Board Name" column). Using a template without the correct fields can cause errors and prevent your posts from uploading.
- To use emoji in your posts, save the file with
CSV UTF-8orUTF-16encoding. UTF-8 is the safest choice overall. Excel and Google Sheets both save reliable CSVs; some editors (such as Apple Numbers or third-party CSV tools) can add invisible characters or change your column headers, which can cause the upload to fail.
Preparing your CSV file
Once you've downloaded the template, fill in your posts, following the format below. Each row is one post.
General CSV format
|
Text
|
Image URL
|
Tags (Optional, separated by commas).
|
Posting Time (Optional) | Board Name (Pinterest only) |
|
Your post text or caption.
|
A direct link to your image, ending in |
Existing Buffer tags, separated by commas (for example, |
|
The name of one of your existing boards. |
📝 A few rules apply to every CSV:
- The column titles are case-sensitive and must match the template exactly ("Text", "Image URL", "Tags", "Posting Time"). Take care not to let a spreadsheet split a header like "Image URL" into two separate columns.
- Each post needs either text or an image URL (or both). For Instagram, you must include an image URL. For Pinterest, you must include the name of an existing board.
- Do not leave blank rows between posts. Empty rows can prevent the upload from completing.
- Bulk upload currently supports text and single-image posts only. Video and carousel posts are not supported.
Pinterest CSV format
For bulk Pinterest uploads, use our Pinterest CSV template to format your posts correctly. Each Pin’s description is taken from the Text column.
The template includes the following optional fields:
| Column | What it’s used for |
|---|---|
| Title | The title displayed on the Pin. |
| Alt Text | Text describing the image, for accessibility. |
| Link | The destination URL people visit when they click the Pin. |
Including these fields allows you to schedule fully formatted Pins without needing to edit them after uploading.
📝 Using an older Pinterest CSV? If your Pinterest CSV still has a Description column, Buffer treats it as an alias for the Text column. If Text and Description have the same value, the upload succeeds. If they differ, you'll see a validation error asking you to move the content into the Text column.
Formatting the Posting Time column (and fixing Excel date problems)
The Posting Time column is optional, but when you use it, it must be in exactly this format: YYYY-MM-DD HH:mm in 24-hour time. For example, to post on 6 April 2026 at 9:00 am, enter 2026-04-06 09:00 . Leave the column blank to schedule each post to the next available slot in your queue.
This column causes more failed uploads than any other, almost always because of a spreadsheet reformatting the date. To avoid that:
- Zero-pad the month, day, and hour. Use
2026-04-06 09:00, not2026-4-6 9:00. Un-padded values can fail to schedule with no error. - Watch out for Excel. Excel will often auto-reformat date cells (for example, into
mm/dd/yyyy), even if you typed them correctly, and it can re-break them each time you reopen the file. Google Sheets is more reliable. If you use Excel, download the file as CSV (UTF-8, comma-delimited) and recheck the Posting Time column before uploading.
Adding line breaks to your post text
To add paragraph breaks or spacing inside a post's text, insert the line break directly in the Text cell:
- Windows: press Ctrl + Enter while editing the cell.
- Mac: press Cmd + Enter while editing the cell.
💡 Tip: The upload preview may show your text on a single line, but the published post will keep the line breaks. Edit inside the cell itself (not the formula bar), and save the file as CSV UTF-8 or UTF-16.
Using the Tags column
The Tags column is for Buffer tags (labels used to organize and report on posts), not hashtags. Tags are case-sensitive and must already exist in your account. If a tag in your CSV doesn't exist, Buffer still imports the post but ignores that tag. To include hashtags in a post, put them in the Text column instead.
How to get a direct image URL from popular hosting services
When uploading posts in bulk, each image must use a direct image URL (a link that ends in .jpg, .png, etc., and opens the image by itself, not a web page). The file also has to be visible to anyone with the link. A regular "share" or "view" link from Google Drive or Dropbox won't work until you convert it, as shown below.
💡 Quick test: right-click your link and open it in a new browser tab. If the image appears on its own (not inside a webpage), it's a direct link.
Google Drive
- Upload your image to Google Drive.
- Right-click the image and select Get link.
- Under General access, change to Anyone with the link.
- Copy the file ID from the URL (the long string of letters and numbers).
- Replace it in this format:
https://drive.google.com/uc?export=view&id=FILE_ID
If your copied link looks like https://drive.google.com/file/d/1AbCdEfGhIjKlMn/view?usp=sharing, the file ID is the part between /d/ and /view.
The direct link becomes ➡️https://drive.google.com/uc?export=view&id=1AbCdEfGhIjKlMn.
Dropbox
- Upload your image to Dropbox.
- Right-click the file and select Share.
- In the sharing window, confirm Anyone with the link can view.
- Copy the link, which looks like:
https://www.dropbox.com/s/xxxxxx/filename.png?dl=0
- Change the ending from
dl=0toraw=1:
https://www.dropbox.com/s/xxxxxx/filename.png?raw=1
Imgur
- Upload your image to imgur.com.
- Imgur links are public by default, so there are no extra sharing steps.
- Right-click the image and select Open image in new tab.
- The URL in the new tab is your direct image link (ending in
.jpgor.png).
What you can't bulk upload or add to the CSV template
Some post types and features are not supported in bulk upload. Create these posts individually in the composer:
- Videos: Video posts, including Reels, cannot be bulk uploaded.
- Carousels: Carousels are not supported. Each post can include only one image.
- Instagram post types: CSV uploads create standard Instagram posts. You cannot mark a row as a Reel or Story. For image Stories, upload the post, then change its type to Story in the queue before publishing.
- First comments: Instagram, LinkedIn, and Facebook first comments cannot be added through CSV and must be scheduled in the composer.
✨ Want to see these added? Upvote the feature requests for bulk video upload, multiple image URLs per post, and bulk uploading first comments.
Uploading your CSV file
- From the Publish tab, select the channel you want to upload posts to.
- Click the gear icon (⚙️) next to the channel name to open the settings menu.
- Click the General tab.
- Click the Bulk Upload button.
- When the upload screen appears, click Upload File.
- Select your prepared CSV file from your computer.
Reviewing and confirming your posts
After Buffer reads your file, it shows a preview of your posts on the Review Content screen. This preview confirms that the file was read; if you don't see it, the upload didn't go through.
- Review the previewed posts for accuracy.
- If something looks off, click Back in the dialog header to return to the upload step, then re-upload a corrected file.
- When everything looks right, click Add Posts to Queue to schedule them, or Save as Drafts if you're not ready to schedule yet. (This is the confirmation step, so your posts aren't saved until you click one of these.)
- Click View Post to jump to your Queue (if you added to the queue) or your Drafts (if you saved as drafts), where your uploaded posts will now appear.
Troubleshooting bulk upload issues
When there's a problem with a post, you'll see an error beneath it on the Review Content screen. After you schedule the correctly formatted posts, a summary screen appears, and if any posts had issues, you'll see the option to Download CSV with post errors so you can fix and re-upload just those.

📝 General checks that resolve most upload problems:
- Save the file as
.csv, not.xlsor.xlsx. - Make sure the column titles match the template exactly (they're case-sensitive) and there are no empty rows.
- Confirm your Posting Time cells are in
YYYY-MM-DD HH:mmformat. - If you included tags, make sure each tag already exists in your Buffer account, or Buffer will import the post and skip the tag.
I uploaded my CSV file, but nothing happened
If you upload a CSV and see no preview or error, the file was not processed. Try these steps in order:
- Check for a hidden error message. Buffer shows a preview when it reads the file successfully. If no preview appears, close the upload dialog and look for an error at the top of the page. Fix the issue it identifies, then upload the file again.
- Check the file format. Confirm that:
- The file is saved as .csv, not .xls or .xlsx
- The column headings match the template exactly
- There are no blank rows between posts
- Complete the final step. The preview does not save your posts. Select Add Posts to Queue or Save as Drafts. If you close the dialog before choosing one, nothing will be added.
- Still having trouble? Contact us and include your CSV file so we can check its formatting.
Only some of my posts were uploaded
If fewer posts appear than you expected, you likely went over your plan's per-upload limit. On the Free plan, only the first 10 posts per channel are added, and any beyond that are dropped without an error. Split your file into smaller batches, or upgrade to a paid plan for up to 100 posts per channel.
Image troubleshooting checklist
If your image doesn't show up after uploading, check the following:
- ✅ Does the URL end in a file extension? Make sure the link ends in
.jpg,.jpeg,.png, or one of the formats listed above. - ✅ Is the file publicly accessible? Link sharing must be set to public or anyone with the link. Private links won't display.
- ✅ Is it a direct image URL? Right-click the link and open it in a new tab. If the image displays by itself (not inside a webpage), it's the right type of link.
- ✅ Is the image too large? Very large images (over 5MB) may fail to load. Try resizing or compressing before re-uploading.
- ✅ Is the hosting service supported? Stick with widely used hosts (Google Drive, Dropbox, Imgur, or your own website). Some services, like Facebook or Instagram, don't provide usable direct URLs.
If an image loads in the preview but the post then fails to publish, the site hosting the image may be blocking Buffer from fetching it (for example, a robots.txt rule on your own website). In that case, host the image on one of the services above or upload it directly in the composer instead. And if you see an error like Unexpected token '<', "<!DOCTYPE "... is not valid JSON , the link is returning a web page rather than an image file, so replace it with a direct image URL.
If you've checked everything and the image still won't display, try a different hosting service to see whether the problem is the file or the link.
More resources from our blog
- How to Crosspost: Beginner’s Guide
- The Complete Guide to Content Repurposing
- The Best Content for Social Media — Backed by Data
- 350+ Instagram Caption Ideas for Your Next Post
- Types of Social Media Content: 30+ Ideas for Your Next Post
📝 Need help with bulk uploading? Send us an email at hello@buffer.com, and our Advocacy team will be standing by to assist!