Social Media CSV Template (Free, With Column Guide)

Social Media CSV Template (Free, With Column Guide)

A three-column CSV template for planning and importing social posts, plus what each column does and the quoting rules that stop imports breaking.

If you plan social content in a spreadsheet, the sheet only saves you time when it imports cleanly into whatever publishes it. Most templates you’ll find have twenty columns, and twenty columns is why the import fails.

Here’s a small one that works.

The template

content,scheduled_at,media_urls
"Big news: our spring update is live.",2026-11-03T09:00,https://example.com/spring.jpg
"Behind the scenes: how we plan a week of content in 20 minutes.",2026-11-03T13:00,https://example.com/planning.jpg
"Three things we learned shipping in public this quarter.",2026-11-04T09:00,

Three columns, one of them required. You can download this exact template from the bulk composer in BulkPublish so the header row matches what the importer expects.

What each column does

content is the post text and the only required column. Everything else is optional, so a file with nothing but a content column and some rows is a valid import.

scheduled_at is when the post publishes, written as a date and time like 2026-11-03T09:00. Leave it blank and you set the time in the composer instead, either individually or across the batch.

media_urls is a URL for an image or video to attach. The name is plural because it takes more than one: separate them with a semicolon. Leave it blank for a text post.

Why not more columns

The obvious question is why there’s no column for channels, or per-platform text, or hashtags.

Channel selection is the field you least want to get wrong across a hundred rows, and it’s the hardest to sanity-check inside a spreadsheet cell. It gets set after import, in the composer, where the posts are in front of you and you can apply a selection to the batch and then override individual posts.

Per-platform text has the same problem, doubled: a column per platform makes the file wide and fragile, and it’s the part of the post most worth looking at while you write it.

The general rule: put in the file the things a spreadsheet is genuinely better at, which is writing text and planning dates in bulk. Do the rest where you can see the result.

The formatting rules that matter

Almost every broken CSV is a quoting problem.

  • Commas in your text: wrap the whole field in double quotes
  • Double quotes in your text: double them and quote the whole field, so "He said ""yes"""
  • Line breaks in a post: quote the field, and it’ll parse fine
  • Emoji and accents: save the file as UTF-8
  • Dates: YYYY-MM-DDTHH:MM is unambiguous. 02/06/2026 is not, and different tools read it differently

Exporting from Google Sheets or Excel takes care of the quoting for you. Editing the raw file by hand is where it usually goes wrong.

What happens to rows that aren’t right

  • A file with no content column is rejected with a message saying so, rather than importing zero rows and appearing to work
  • Rows with no content and no media are skipped, so trailing blank lines don’t become empty posts
  • Everything else imports into an editable list, so a row that’s slightly off gets fixed in the composer

Using it

Plan in the sheet. Export as CSV. Import into the bulk composer. Set the channels. Check the queue reads sensibly as a set. Schedule.

BulkPublish supports 15 platforms: Facebook, Instagram, TikTok, YouTube, X, Threads, Bluesky, Pinterest, Google Business Profile, LinkedIn, Mastodon, Discord, Telegram, Tumblr and Snapchat.

  • Channels: Free: 3 (1 per platform). Pro: 30 (2 per platform). Business: 75 (5 per platform).
  • Posts: Free: 3/day. Pro: 30/day. Business: unlimited.

The free plan is enough to test the import end to end before committing a month of content to it, which is worth doing with five rows before you do it with a hundred.