Browse the docs

Agent setup guide

Social Post Scheduler

Approved posts in your content-calendar sheet go out on Bluesky and/or Mastodon on their date, and each row is marked Posted.

Available About 15 min to set up

What it does

Approved posts in your content-calendar sheet go out on Bluesky and/or Mastodon on their date, and each row is marked Posted.

  • Every morning, reads your content-calendar sheet in Google Sheets.
  • Finds the rows dated today in code (in your time zone), never by the AI.
  • Posts each row whose Status says Approved to the networks ticked on the row: Bluesky, Mastodon or both. Rows that aren't approved are skipped and left alone.
  • Checks each post in code before it goes out: not blank, no leftover placeholders, at most 300 characters for Bluesky and 500 for Mastodon. An AI last look holds only clearly unfinished posts (notes to the team, cut-off sentences).
  • Marks each row “Posted to …” with the post links, naming only the networks it really went out on (e.g. “Posted to Bluesky (Mastodon not connected)”), or “Held: …” with the reason, so nothing is posted twice.
  • The summary is counted in code from what each step really did (sent, held, skipped, failed), so it never reports a held message as sent.

What it needs

  • 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.

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.

Availability and plans

Available

Its workflow is built and tested, and every app it needs is live. You can get it and set it up now.

Included free on the Enterprise plan; on other paid plans it's a one-time purchase per workspace (the price is on the Agents page). The Agents page in the app always shows its current status.

Before you start

  • A paid plan: agents run live, and the Free plan only runs Dry Runs.
  • An AI provider key (OpenAI, Anthropic, Google and more) in Settings → AI Providers. AI usage is billed by your provider.
  • These apps, connected in Settings → Integrations: Google Sheets, Bluesky and Mastodon.
  • Nothing to send: the agent runs on a schedule.
  • About 15 minutes.

Set it up step by step

Get the agent first (buy it, or it's already yours when your plan includes it), then in Agents → My agents press “Set up this agent”. That creates the agent's workflow in your workspace (it counts towards your plan's workflow limit) and opens the canvas with a setup checklist above it. Each item links to the exact place to go and ticks itself off when it's done.

1. Connect your AI provider

The AI steps run on your own key (OpenAI, Anthropic, Google and more). Add one in Settings → AI Providers.

2. Connect Google Sheets

Connect the Google account that can open your content calendar (Settings → Integrations → Google Sheets).

3. 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.

4. Pick the content calendar

Open “Read the content calendar” and pick the account, spreadsheet and tab (columns Date | Text | Bluesky | Mastodon | Status | Updated | Result).

SettingWhat to enterIn step
Google account (Content calendar)The Google account that can open the spreadsheet. Pick your connected Google Sheets account.“Read the content calendar”
Content calendar spreadsheetPaste the link of the spreadsheet.“Read the content calendar”
Content calendar tabThe tab with one row per post, e.g. Calendar.“Read the content calendar”

5. 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.

SettingWhat to enterIn step
Bluesky accountThe Bluesky account the posts go out from. Leave it empty if you don't use Bluesky: the step is then skipped. Pick your connected Bluesky account, or leave it empty if you don't use Bluesky (the step is then skipped).“Post to Bluesky”
Bluesky account (same one)The same Bluesky account. Leave it empty if you don't use Bluesky: the step is then skipped. Pick your connected Bluesky account, or leave it empty if you don't use Bluesky (the step is then skipped).“Post to Bluesky only”
Mastodon accountThe Mastodon account the posts go out from. Leave it empty if you don't use Mastodon: the step is then skipped. Pick your connected Mastodon account, or leave it empty if you don't use Mastodon (the step is then skipped).“Post to Mastodon”
Mastodon account (same one)The same Mastodon account. Leave it empty if you don't use Mastodon: the step is then skipped. Pick your connected Mastodon account, or leave it empty if you don't use Mastodon (the step is then skipped).“Post to Mastodon only”

6. Where to mark each row

Open “Mark the row”: the same account, spreadsheet and tab, and the letter of the Status column.

SettingWhat to enterIn step
Google account (marking rows)The same Google account. Pick your connected Google Sheets account.“Mark the row”
Content calendar spreadsheet (same one)The same spreadsheet.“Mark the row”
Content calendar tab (same one)The same tab.“Mark the row”
Status column letterThe letter of your Status column; Updated and Result must be the two columns to its right, e.g. E.“Mark the row”

7. Test it with Dry Run

Press Dry Run: the agent runs on sample data with no messages sent and nothing written to your apps.

8. 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.

How it works

The agent is a normal workflow with 23 steps (1 AI step). You can open, edit and monitor it like any other workflow.

  • Every day at 9:00 — Runs on a schedule (cron 0 9 * * *, UTC — change it in the trigger's settings). Runs 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.
  • Read the content calendar — Google Sheets: Read rows. Reads your content-calendar tab (Date | Text | Bluesky | Mastodon | Status | Updated | Result).
  • Find today's posts — Step. In 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).
  • Each of today's rows — Repeats the steps below for each item (up to 25 per run). Handles up to 25 rows dated today, one at a time.
  • [For each item — “Each of today's rows”] Last look at the wording — AI step (runs on your AI provider key). AI 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.
  • [For each item — “Each of today's rows”] Approved? — Step. In code: the row's Status must say Approved (any capitalisation). Rows that say anything else are skipped and left as they are.
  • [For each item — “Each of today's rows”] Check the text — Step. In 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.
  • [For each item — “Each of today's rows”] Bluesky ticked? — Step. In code: is the row's Bluesky column ticked (TRUE, yes or 1)?
  • [For each item — “Each of today's rows”] Mastodon ticked? — Step. In code: is the row's Mastodon column ticked (TRUE, yes or 1)?
  • [For each item — “Each of today's rows”] Fits on Bluesky? — Step. In code: Bluesky allows 300 characters.
  • [For each item — “Each of today's rows”] Where does it go? — Decision: picks the branch to follow. Skips rows that aren't approved, holds rows that failed a check, and posts the rest to the networks ticked on the row.
  • [For each item — “Each of today's rows”] Skipped (not approved) — Kept in the run history. Branch: Not approved. The row is left exactly as it is.
  • [For each item — “Each of today's rows”] Post to Bluesky — Bluesky: Create a post. Branch: Both. Publishes the row's text on Bluesky. Skipped when Bluesky isn't connected.
  • [For each item — “Each of today's rows”] Post to Mastodon — Mastodon: Publish a post. Publishes the same text on Mastodon (public). Skipped when Mastodon isn't connected.
  • [For each item — “Each of today's rows”] Post to Bluesky only — Bluesky: Create a post. Branch: Bluesky. Publishes the row's text on Bluesky. Skipped when Bluesky isn't connected.
  • [For each item — “Each of today's rows”] Post to Mastodon only — Mastodon: Publish a post. Branch: Mastodon. Publishes the row's text on Mastodon (public). Skipped when Mastodon isn't connected.
  • [For each item — “Each of today's rows”] Posted on Bluesky? — Step. In code: did Bluesky return a post link? (No when Bluesky isn't connected or wasn't ticked.)
  • [For each item — “Each of today's rows”] Posted on Mastodon? — Step. In code: did Mastodon return a post link? (No when Mastodon isn't connected or wasn't ticked.)
  • [For each item — “Each of today's rows”] Both ticked? — Step. In code: were both networks ticked on the row?
  • [For each item — “Each of today's rows”] What went out? — Decision: picks the branch to follow. Names only the networks the row was really posted to, and says when a ticked network isn't connected.
  • [For each item — “Each of today's rows”] Mark the row — Google Sheets: Update a row. Branch: Held / No network / Too long / Both / Bluesky (Mastodon not connected) / Bluesky / Mastodon (Bluesky not connected) / Mastodon / Not connected / Other. Writes 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.
  • Count what happened — Step. In code, not AI: which of today's rows were posted (and where), held or skipped, and any that failed.
  • Done for today — Kept in the run history. The run history keeps the counts; the sheet shows each row's status.

Test it with Dry Run

Press Dry Run in the canvas. The agent runs on the sample data stored on its trigger (the “Sample data for Dry Run” box), so you can check every step's output before anything is live.

  • Nothing is sent or written: app actions, emails and Slack posts are simulated, and AI steps don't call your AI provider.
  • For-each loops repeat only the first 3 items.

Go live

  • 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.
  • Scheduled runs start only once the schedule is activated, and can't repeat faster than your plan's minimum interval.
  • The setup checklist adds a “paid plan” item before activation: live runs need a paid plan (the Free plan only runs Dry Runs).
  • When every checklist item is done and the trigger is on, the checklist says “Live — this agent is running”. Follow its runs in the workflow's History tab and in Analytics → Agents.

Questions

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).

Troubleshooting

  • “No AI provider connected” or a rejected key: connect or fix the key in Settings → AI Providers, then press Test there.
  • A checklist item stays unticked: the setting is still empty or still contains its placeholder text. Open the step from the checklist and fill it in.
  • An app step fails with “Needs reconnect”: the account's access was revoked or expired. Reconnect it in Settings → Integrations.
  • It didn't run at the expected time: the schedule must be activated, and its time is in the trigger's timezone.
  • A step failed: open the run in History and check that step in the Trace tab for the error and what it received.

Generated from the agent's own workflow, so it always matches what the agent does. Last updated .