Skip to content

PostSider is in private beta. Public launch coming soon. Join the whitelist

← All articles
Onboard a New Social Client in One Afternoon With a CSV

Onboard a New Social Client in One Afternoon With a CSV

Every agency I have talked to about this has the same first week with a new client, and it is the same story: you spend it reading old posts to figure out what the brand sounds like, then you sit in a scheduler clicking through platform after platform to load thirty individual posts by hand. None of that is billable in the client’s eyes. It is setup. This piece walks through how to compress that setup into an afternoon using PostSider’s CSV bulk import: a real template you can copy, the columns explained one by one, and the two mistakes that trip up almost every first import.

I run PostSider, so I want to be upfront that this is a walkthrough of our own tool. I am also not going to pretend onboarding week has some industry-wide average cost, because I have not seen a real, sourced number for that. What I can show you is the mechanism that removes the worst part of it.

Onboarding week is the least billable week of every retainer

The first week of a new client relationship is the week you do the most unpaid setup work: reading their old content, learning their voice, and manually loading a month of posts one at a time.

Nobody signs a retainer to watch someone read their Instagram archive. But that is what week one looks like from the outside: you are absorbing brand voice, checking what has already been posted so you do not repeat a campaign, confirming which accounts you actually have access to, and figuring out a posting cadence that will not step on whatever the client’s internal team still touches. That part is real work and it is hard to compress, because it is thinking, not typing.

The part that is compressible is what comes after the thinking is done. Once you know the cadence and you have a month of captions drafted, the mechanical act of getting thirty-plus posts into a scheduler, one platform, one time slot, one caption box at a time, adds nothing to the client relationship. It is the same clicking motion whether the client pays you 2,000 zloty a month or 20,000. A CSV import turns that motion into one upload instead of thirty or forty individual entries, so the only week-one work left is the part that actually needed a human.

What is in the template, column by column

PostSider’s CSV importer reads five columns: two required, three optional. content and channels are mandatory on every row; datetime, first_comment, and thread are yours to fill in only when a row needs them.

Here is a downloadable example template built for a first-month client onboarding, with eight sample rows across five platforms so you can see the pattern before you build your own. Open it, keep the header row exactly as it is, and replace the sample content with the client’s actual posts.

ColumnRequiredWhat goes in it
contentYesThe post text itself. This is the only text field.
channelsYesOne or more connected channel names, comma-separated. Matched by name, not case-sensitive.
datetimeNoThe exact UTC time to publish, formatted YYYY-MM-DD HH:mm. Leave it blank to auto-fill the next open queue slot.
first_commentNoText posted as the first comment, on platforms that support it.
threadNoExtra parts of a thread, each one separated by three pipe characters, |||.

A few details that matter once you are actually filling this in for a client. The channels column has to match the exact name you gave the connected account inside PostSider, not the handle on the platform itself, so if you named the client’s Instagram connection “Brightleaf Instagram” during setup, that is what goes in the CSV. One row can list several channel names separated by commas, and that single row’s content publishes to every one of them. The thread column is what turns a single row into a multi-part thread: write your opening post in content, then each follow-up part in thread, separated by |||, and the importer chains them together as one connected thread instead of separate standalone posts.

The importer processes each row on its own. A typo in one channel name or a bad date in one row does not sink the other forty rows, it just fails that one row and tells you exactly why, so you fix that line and move on instead of debugging the whole file.

Every time in the CSV is UTC, not the client’s clock

PostSider reads every datetime value in the CSV as UTC. If you type in the client’s local wall-clock time without converting, the post publishes at the wrong hour, sometimes hours off depending on the season and the time zone gap.

This is the single most common way a first import goes sideways, and it is an easy trap because nothing in the spreadsheet warns you. You know the client wants their Tuesday post live at 9am Warsaw time, you type 2026-08-04 09:00 into the datetime column, and unless you did the conversion first, that post actually goes out at 9am UTC, which is 11am in Warsaw during summer. Two hours off does not sound catastrophic until it is the launch-day post the client specifically asked to go live before their morning meeting.

The fix is mechanical, not clever: work out the client’s local time in UTC before you type anything into the sheet. Warsaw in summer (CEST) is UTC+2, so a 9am local post becomes 2026-08-04 07:00 in the datetime column. New York in summer (EDT) is UTC-4, so a 9am local post becomes 2026-08-04 13:00. Write the offset for each client’s market on a sticky note the first time you set them up, because you will need it every single import after that, not just the first one.

There is a second option that skips the math entirely: leave datetime blank. An empty cell tells PostSider to drop that post into the channel’s next free queue slot, using whatever posting-time rules are already configured for that channel. For evergreen content where the exact minute does not matter, this is the faster and safer choice, because there is no time zone arithmetic to get wrong. Save explicit datetime values for the posts that genuinely have to land at a specific hour, a launch, an event start, a livestream announcement, and let the queue handle the rest.

One row, one caption: handle platform-specific wording with separate rows

A single CSV row publishes the exact same content text to every channel listed in that row. There is no built-in way to give Instagram one caption and LinkedIn a different one from the same row.

For a lot of posts this is fine, plenty of client content works word for word across platforms. But agencies rarely run one voice everywhere. LinkedIn wants a longer, more formal caption; Instagram wants shorter and punchier with hashtags at the bottom; a platform with a hard character limit needs something trimmed down entirely. If you put all three channel names in one row’s channels column, all three get the LinkedIn-length caption, hashtags and all, which looks off everywhere except LinkedIn.

The workaround is straightforward once you know it is coming: give each platform its own row. Same client, same day, same intended time, three separate rows, each with one channel name and its own tailored content. Copy the datetime value across the rows if they should all go live together, or stagger them slightly if you post platforms a few minutes apart on purpose. It adds rows to the spreadsheet, but it is still one upload instead of three separate manual scheduling sessions, and you keep full control of what actually shows up on each platform.

Import the file, then verify it landed right in the calendar

Uploading the CSV is not the last step. Open the calendar view and the posting queue afterward and check that every post landed on the day, time, and channel you intended before you close the laptop.

The importer gives you a result for every row right after upload: which ones scheduled successfully, which channels each row matched to, and the exact error text for anything that failed, wrong channel name, bad date format, a date that was already in the past. Read that list first and fix any failed rows, usually a rename or a date fix, then re-upload just those lines.

Once the results look clean, switch to the calendar view and scan the month visually. This is where you catch the mistakes the import report cannot: a week that is accidentally empty because you skipped seven rows, two posts stacked on the same day when you meant to spread them out, or a caption that read fine in a spreadsheet cell but looks wrong once you see it in context next to the client’s other content. The posting queue view is the other half of this check, it shows you what is actually lined up to publish per channel, which is the view worth screenshotting and sending to the client as proof the month is locked in.

Do this verification pass every time, not just the first time. A CSV import is fast, but fast is not the same as foolproof, and the five minutes it takes to eyeball a calendar is cheap insurance against a client noticing a gap in their feed before you do.

What to do with the afternoon you just got back

The point of compressing onboarding is not the CSV trick itself, it is what you do with the hours it frees up. Spend that time on the parts of onboarding that actually need a person: brand voice, content strategy, and the client conversation, not clicking through a scheduler.

If loading a month by hand used to eat most of a day, and a CSV import turns that into fifteen minutes plus a verification pass, you have bought back most of an afternoon on week one alone. Put it toward things a spreadsheet cannot do: a real brand-voice document you can hand to any writer on your team, a content pillar breakdown specific to that client’s audience, or just a second look at the captions before they go out, since you now have time to read them slowly instead of racing to get them scheduled before end of day.

The same system pays off every month after the first, too. Once you have the client’s channel names and voice dialed in, batching a full month of new content into the same CSV template takes a fraction of the time it did on day one. If batching itself is the part you want to tighten up next, how to batch a month of social content in one sitting covers the planning and writing side that feeds into a sheet like this one. And if you manage the calendar for more than one client, building a social media content calendar for 2026 is the planning layer that decides what goes in each row before you ever open the CSV.

Onboarding will always have a thinking week built in. What it should not have anymore is a clicking week. Pull the template, fill in the client’s first month, and see how much of that first afternoon you get back. For the full column reference and import limits, PostSider’s documentation at docs.postsider.com covers the API side if you want to automate the CSV generation itself, and you can try the import with a real account at app.postsider.com/register.

Frequently asked questions

Can I bulk schedule social media posts from a CSV?

Yes. PostSider has a CSV bulk import that takes a spreadsheet of posts (content, channels, and an optional schedule time) and turns every row into a scheduled post across the connected channels in one upload. You still confirm the batch in the calendar and queue view afterward.

What columns does a social media scheduling CSV need?

At minimum a content column (the post text) and a channels column (comma-separated channel names). Optional columns cover datetime for a specific UTC time, first_comment for a comment posted alongside the update, and thread for extra parts of a thread separated by three pipe characters.

Do I need to convert post times to UTC before importing a CSV?

Yes, if you fill in the datetime column at all. PostSider reads every CSV datetime as UTC, not the client's local time and not your agency's local time. Leave the column blank instead and the post drops into that channel's next open queue slot, which sidesteps the conversion entirely.

Can one CSV row post different captions to different platforms?

No, not within a single row. One row's content field goes out identically to every channel listed in that row's channels column. If a client needs platform-specific wording, put that platform on its own row with its own content, and repeat the same datetime across the rows so everything still lands together.

Run your social media
on autopilot.

Start free in minutes. Publish it yourself, or let your AI agent take the wheel.

30+ networks · MCP, REST and SDK · No credit card

Private beta Whitelist members get 50% off all plans. Join the list before we open the doors.