Social Post Scheduler · Social Media
Plan posts in a sheet, and they go out on Bluesky and Mastodon
Every morning it posts the rows in your content calendar that are dated today and marked Approved, to the networks ticked on each row, and marks every row Posted or Held.
Free account to start. Buying and running live need a paid plan.
- Runs on a schedule
- 1 AI step
- About 15 min to set up
Sound familiar?
The job, before and after this agent.
What it feels like today
- “We plan a month of posts in a spreadsheet, then forget to actually post half of them.”
- “Someone has to log in to Bluesky and Mastodon every morning just to paste text.”
- “Drafts that weren't signed off sometimes get posted because nobody can tell them apart.”
What you get with the agent
- Rows dated today with Status Approved are posted to Bluesky, Mastodon or both, as ticked on the row.
- Rows that aren't approved are skipped and left exactly as they are.
- Blank text, leftover placeholders and posts over 300 characters for Bluesky are caught in code before anything goes out.
- Each row is marked Posted to … with the post links, or Held with the reason, so nothing is posted twice.
Before
Tuesday at 9, the owner remembers the planned post, opens two apps, copies the text, trims it for Bluesky and hopes it was the approved version.
After
At 9:00 the approved Tuesday row goes out on both networks. The sheet now says Posted to Bluesky and Mastodon, with both links, and the unapproved draft below it was skipped.
How it works
The whole workflow, step by step.
Every morning the agent reads your content-calendar sheet in Google Sheets (Date, Text, Bluesky, Mastodon, Status, Updated, Result) and finds, in code, the rows dated today in your time zone. Rows whose Status says Approved are posted to the networks ticked on the row: Bluesky, Mastodon or both; anything else is skipped and left alone. Before posting, code checks the text (not blank, no leftover placeholders, at most 300 characters for Bluesky and 500 for Mastodon) and an AI last look holds only clearly unfinished posts. Each row is marked “Posted to …” with the post links (naming only the networks it really went out on), or “Held: …” with the reason, so nothing goes out twice. Connect Bluesky, Mastodon or both. Posts go out when the schedule runs (9:00 by default), not at a time typed in the sheet; missed days aren't caught up. Text only: no images.
- TriggerEvery day at 9:00
- App callRead the content calendar
- LogicFind today's posts
- LogicEach of today's rows
- AI stepLast look at the wording
- LogicApproved?
- LogicCheck the text
- LogicBluesky ticked?
- LogicMastodon ticked?
- LogicFits on Bluesky?
- LogicWhere does it go?
- Not approved:Skipped (not approved)
- Held:Mark the row
- No network:Mark the row
- Too long:Mark the row
- Both:Post to Bluesky
- Bluesky:Post to Bluesky only
- Mastodon:Post to Mastodon only
- Held:Mark the row
- OutputSkipped (not approved)
- App callPost to Bluesky
- App callPost to Mastodon
- App callPost to Bluesky only
- App callPost to Mastodon only
- LogicPosted on Bluesky?
- LogicPosted on Mastodon?
- LogicBoth ticked?
- LogicWhat went out?
- Both:Mark the row
- Bluesky (Mastodon not connected):Mark the row
- Bluesky:Mark the row
- Mastodon (Bluesky not connected):Mark the row
- Mastodon:Mark the row
- Not connected:Mark the row
- Other:Mark the row
- App callMark the row
- LogicCount what happened
- OutputDone for today
This is the workflow that opens in your workspace when you set the agent up. Every step can be edited.
- Step 1Every day at 9:00Runs every morning at 9:00. Set your time zone on the trigger: a row's date counts as “today” in that zone. Change the time, or add more runs a day, on the trigger.
- Step 2Read the content calendarReads your content-calendar tab (Date | Text | Bluesky | Mastodon | Status | Updated | Result).
- Step 3Find today's postsIn code, not AI: keeps only the rows dated today in your time zone. Rows for other days are left alone (a missed day isn't posted later).
- Step 4Each of today's rowsHandles up to 25 rows dated today, one at a time.
- Step 5Last look at the wordingAI gives each row's text a last look before it goes out and holds only clearly unfinished posts (notes to the team, cut-off sentences). It doesn't rewrite anything.
- Step 6Approved?In code: the row's Status must say Approved (any capitalisation). Rows that say anything else are skipped and left as they are.
- Step 7Check the textIn code: the text is there, has no leftover placeholders (TBD, [LINK]…), fits Mastodon's 500 characters, and the AI's last look didn't hold it.
- Step 8Bluesky ticked?In code: is the row's Bluesky column ticked (TRUE, yes or 1)?
- Step 9Mastodon ticked?In code: is the row's Mastodon column ticked (TRUE, yes or 1)?
- Step 10Fits on Bluesky?In code: Bluesky allows 300 characters.
- Step 11Where does it go?Skips rows that aren't approved, holds rows that failed a check, and posts the rest to the networks ticked on the row.
- Step 12Skipped (not approved)The row is left exactly as it is.
- Step 13Post to BlueskyPublishes the row's text on Bluesky. Skipped when Bluesky isn't connected.
- Step 14Post to MastodonPublishes the same text on Mastodon (public). Skipped when Mastodon isn't connected.
- Step 15Post to Bluesky onlyPublishes the row's text on Bluesky. Skipped when Bluesky isn't connected.
- Step 16Post to Mastodon onlyPublishes the row's text on Mastodon (public). Skipped when Mastodon isn't connected.
- Step 17Posted on Bluesky?In code: did Bluesky return a post link? (No when Bluesky isn't connected or wasn't ticked.)
- Step 18Posted on Mastodon?In code: did Mastodon return a post link? (No when Mastodon isn't connected or wasn't ticked.)
- Step 19Both ticked?In code: were both networks ticked on the row?
- Step 20What went out?Names only the networks the row was really posted to, and says when a ticked network isn't connected.
- Step 21Mark the rowWrites the outcome to the row: Status (Posted to … or Held: why), the time, and the post links with the checks' result. A posted row no longer says Approved, so it's never posted twice.
- Step 22Count what happenedIn code, not AI: which of today's rows were posted (and where), held or skipped, and any that failed.
- Step 23Done for todayThe run history keeps the counts; the sheet shows each row's status.
Example run
What goes in, and what comes out.
Example with fictional data
Comes in
Content calendar row for November 3: text about the new winter menu with a link, Bluesky ticked, Mastodon ticked, Status Approved. Another row for the same day says Draft.
The agent produces
The approved row passes the checks (182 characters) and is posted to Bluesky and Mastodon; its Status becomes Posted to Bluesky and Mastodon with both links. The Draft row is skipped and left unchanged.
What you need
Everything it takes to run it.
About 15 minutes from purchase to live. A checklist above the canvas takes you through each step.
Plan
Included in Enterprise; on other paid plans it's $69 once. Agents run live on paid plans, from Basic ($39/mo).
Your AI key
Connect any of 15 AI providers on your own key. Your provider bills usage directly, at cost; we add no markup.
Apps
- Google SheetsLive
- BlueskyLive
- MastodonLive
Checklist
- A paid plan (agents run live on paid plans).
- An AI provider key (Settings → AI Providers).
- Google Sheets, connected in Settings → Integrations.
- Bluesky, Mastodon or both, connected in Settings → Integrations (the steps for a network you don't connect are skipped).
- A content-calendar tab with the columns Date | Text | Bluesky | Mastodon | Status | Updated | Result.
Setup, about 15 minutes
- Connect your AI provider. The AI steps run on your own key (OpenAI, Anthropic, Google and more). Add one in Settings → AI Providers.
- Connect Google Sheets. Connect the Google account that can open your content calendar (Settings → Integrations → Google Sheets).
- Connect Bluesky, Mastodon or both. Connect the networks you use: Bluesky with your handle and an app password, Mastodon with your server and an access token with read and write scopes (Settings → Integrations). One is enough; the steps for a network you don't connect are skipped.
- Pick the content calendar. Open “Read the content calendar” and pick the account, spreadsheet and tab (columns Date | Text | Bluesky | Mastodon | Status | Updated | Result).
- Pick your Bluesky and/or Mastodon accounts. Open the four posting steps and pick your accounts. Leave a network's steps empty if you don't use it: they're skipped.
- Where to mark each row. Open “Mark the row”: the same account, spreadsheet and tab, and the letter of the Status column.
- Test it with Dry Run. Press Dry Run: the agent runs on sample data with no messages sent and nothing written to your apps.
- Switch the trigger on. Open the trigger, set your time zone (a row's date is “today” in it) and switch the schedule on. It runs every day at 9:00.
Is it a fit?
Who it's for, and what it won't do.
Built for
- Small businesses that plan social posts in Google Sheets
- Agencies posting for clients on Bluesky and Mastodon
- Teams where one person drafts and another approves
What it doesn't do
- It posts on the row's date when the schedule runs, not at a time typed in the sheet, and it doesn't catch up on missed days.
- Text only: no images or video. On Bluesky, #hashtags and @mentions appear as plain text (links are clickable).
- It doesn't write or edit your posts: it publishes what you approved, or holds it.
- Bluesky and Mastodon only.
We list the limits up front so you can decide before you buy.
Price
$69 one-time
Per workspace. It never renews.
- Included at no extra cost on Enterprise.
- Buying and running it live need a paid plan, from Basic ($39/mo).
- Dry Run costs nothing: simulated AI and app calls, nothing sent.
- AI usage is billed by your own provider, at cost. No AI credits to buy from us.
One-time agent purchases aren't covered by the 30-day money-back guarantee. Refund policy
FAQ
Questions about Social Post Scheduler.
Can I choose the exact time a post goes out?
Posts go out on their date when the schedule runs, 9:00 in your time zone by default. You can change the time or add more runs a day on the trigger; a time typed in the sheet isn't used.
What if a post is too long or unfinished?
Code checks the length (300 characters for Bluesky, 500 for Mastodon), blank text and leftover placeholders, and an AI last look holds clearly unfinished posts. Held rows say why in the sheet.
Which apps do I need?
Google Sheets plus Bluesky, Mastodon or both, and your own AI provider key. With only one network connected, rows ticked for the other say so in the sheet. Posts are text only; images aren't supported.
Is it worth it compared with posting by hand?
It's a one-time purchase that never renews, and it removes the daily copy-and-paste. Running it live needs a paid plan; Dry Run lets you test it on sample data first.
What does the sheet look like?
One row per post, with the header row Date | Text | Bluesky | Mastodon | Status | Updated | Result. Date: the day to post (2026-11-03, 11/3/2026 or November 3, 2026). Bluesky and Mastodon: checkboxes (or yes/no). Status: type Approved when the post may go out. Leave Updated and Result empty: the agent fills them.
Can I pick the time of day?
Posts go out on their date when the schedule runs (9:00 in your time zone by default). Change the time on the trigger, or add more runs a day for rows you approve later in the day. A time typed in the sheet isn't used.
What if I miss a day?
Only rows dated today are posted. A row from an earlier day stays as it is; change its date to today to post it.
Can it post images?
No. Bluesky and Mastodon posts are text only for now (links are fine).
Is this a subscription?
No. Social Post Scheduler is a one-time purchase of $69 per workspace and never renews. The Enterprise plan includes it at no extra cost. Running it live needs a paid plan (from Basic ($39/mo)), and your AI provider bills you directly for usage.
Can I test it before it touches real data?
Yes. Once it's set up in your workspace, Dry Run plays every step on sample data with simulated AI and app calls: nothing is sent and nothing in your apps changes. Switch the trigger on only when you're happy.
Put Social Post Scheduler to work.
Free account, no credit card. Your Agents page opens with Social Post Scheduler ready to buy and set up, then Dry Run it before it goes live.