Bulk Import Posts via CSV
Got a hundred posts planned for next quarter? Don't paste them in one by one. Use a CSV.
When to use bulk import
- Loading a launch calendar from a spreadsheet.
- Importing posts from another tool you're switching from.
- Filling out a season of content in one go.
Get the template
Go to Posts → Bulk Import, click Download template. You get a CSV with these columns:
| Column | What goes in it | Required |
|---|---|---|
caption |
The post text | Yes |
scheduled_at |
Date and time, e.g. 2026-07-15 09:00 |
Yes (or queue) |
channels |
Comma-separated: facebook,instagram,x,linkedin,tiktok |
Yes |
media_url |
Public URL of an image or video | No |
link |
A URL to include in the post | No |
tags |
Hashtags separated by spaces, no # needed |
No |
notes |
Internal note. Not published. | No |
Fill the template in Excel, Google Sheets, or Numbers.
Upload
Back on the Bulk Import screen, click Choose file and pick your CSV. PostFriendly previews the first 20 rows.
Check the preview carefully. Look for:
- Bad times — wrong format, dates in the past, two posts in the same minute.
- Bad channels — channel names you don't have connected.
- Bad media URLs — links to private files PostFriendly cannot fetch.
Anything wrong shows in red. Fix the CSV and re-upload, or click Import valid rows only to skip the bad ones.
What happens after import
Each row becomes a scheduled post. They show up on your calendar in blue, ready to publish at the times you set. You can edit, delete, or move them like any other scheduled post.
Media URLs
PostFriendly downloads the media file from the URL and copies it into your asset library. The original URL no longer matters — if it disappears later, your post still has the file.
Use public URLs only (Dropbox shared links, Google Drive "anyone with link", a CDN). Private URLs that need login will not work.
Limits
- 500 rows per file. Split into multiple CSVs for larger imports.
- 50 MB per CSV.
- All times are in your account timezone.
Common mistakes
- Time zone slip. If your spreadsheet says
9:00 AMand your account is in Pacific time, the post publishes at 9:00 Pacific — not 9:00 in the timezone of your customers. Use Settings → Timezone to set this correctly first. - Channels typo. It's
x, nottwitter. Use the exact names from the template. - Smart quotes from Excel. Excel sometimes turns straight quotes into curly ones, which breaks the CSV. Save as CSV UTF-8 to be safe.