Part 2 of 7 · Social scheduler series ~4 min read

How a post gets drafted

The scheduler only sends what’s in the sheet. So the first job is making it easy to get a post into the sheet in the first place. There are three ways: somebody types a row in the Drive sheet, somebody types a short note and lets the draft-helper rough out the text, or a standing post drops onto the calendar from a template. The first one is obvious. The other two exist because in real life nobody wants to write a full caption from scratch at 8am, and some posts you want to send every single week.

Key takeaways

  • Three intake lanes feed one sheet: the Drive sheet, a draft-helper lane, and a recurring-template lane.
  • The draft-helper turns a short note into post text via Bedrock Haiku 4.5 in your brand voice.
  • Every helper draft goes to a one-tap approval card before it lands in the sheet.
  • Recurring templates drop standing posts onto the calendar on the schedule you set.
  • The sheet stays the canonical store. The other lanes are conveniences that write into it.

Three lanes into one sheet

Three intake lanes funnel into one sheet A diagram with three vertical lane columns at the top and a single unified row at the bottom. Lane one, Drive sheet: somebody types a row directly into the Google Sheet that holds the posts; the drive-sync Lambda mirrors the sheet to S3 every five minutes, and the scheduler reads from there. Lane two, Draft-helper: somebody types a short note describing the post; a helper Lambda calls Bedrock Haiku 4.5 to rough out post text in the brand voice from the voice doc, returning text sized to the chosen channels; the proposed row gets posted to a review card with Approve and Edit buttons; on approve, the row is added to the Drive sheet via the Sheets API. Lane three, Recurring templates: standing posts such as a weekly hours reminder live in a templates section of the rules doc; a template-sync Lambda runs on the schedule each template sets and drops a fresh row onto the calendar; the same proposal-and-approval flow runs before the row is queued. All three lanes converge on the same Drive sheet, which the drive-sync Lambda keeps mirrored to S3 for the scheduler to read. A note at the bottom: the Drive sheet stays the source of truth — the other lanes are conveniences that propose rows for it. Lane 1 · manual Drive sheet • Somebody types a row directly • drive-sync mirrors to S3 every 5 min • Scheduler reads from S3 • Source of truth stays in Drive Lane 2 · Bedrock Haiku Draft-helper • Type a short note describing the post • Helper reads the voice doc • Haiku 4.5 roughs out text sized per channel • One-tap approve → sheet Lane 3 · scheduled Recurring templates • Standing posts live in the rules doc • template-sync drops a row on schedule • Same proposal flow as Lane 2 • On approve → added to sheet Drive posts sheet (source of truth) text · channels · scheduled time · image link · approved flag · status drive-sync mirrors it to S3 every 5 min — scheduler reads from S3 to scheduler, daily tick The Drive sheet stays the source of truth — the other lanes are conveniences that propose rows for it.
Fig 2. Three lanes converge on one Drive sheet. The sheet is the source of truth; the draft-helper and the template lane are conveniences that propose rows for human approval. The drive-sync Lambda mirrors the sheet to S3 so the scheduler can read it without hitting Drive on every tick.

Lane 1: the Drive sheet itself

The simplest lane. Open the posts sheet in Drive, add a row, save. The columns are short: the text, the channels to send to, the scheduled date and time, a link to the image in the same folder, an approval flag, and a status the scheduler keeps up to date. A small Lambda — drive-sync — runs every five minutes, exports the sheet as plain CSV via the Drive API, and writes it to s3://ss-posts-source/posts.csv if the sheet has changed since the last sync. The scheduler reads from S3, not Drive directly. That keeps Drive API calls predictable and gives you S3 versioning for free, so a bad bulk-edit can be rolled back in one click.

This lane covers the cases where you already know exactly what you want to say and when. You type the caption, set the time, drop in the image, and flip the approval flag. Most posts go in this way.

Lane 2: the draft-helper (the lane that saves the most time)

Writing a caption from a blank box is the part everyone puts off. The draft-helper takes the friction out. Type a short note — “remind people we’re closed Monday for the holiday” — into a helper row, pick the channels, and a helper Lambda takes it from there. The Lambda reads your brand tone from the voice doc and calls Bedrock Haiku 4.5 with a short prompt: “Write a social post from this note, in this voice, sized for these channels. Return one version per channel. Do not invent facts the note doesn’t contain.”

The output goes to a small interactive review card: the proposed text per channel, a note on the character count for each, and three buttons — approve, edit, discard. On approve, a Lambda writes the row (or rows) to the Drive sheet via the Sheets API with the approval flag unset, so it still passes through a final approval before it can post. On edit, you get a fillable box pre-populated with the draft. On discard, the proposal is logged and dropped.

The reason every helper draft goes to a human first is simple: a caption the model got slightly wrong is worse than no caption at all. The wrong one will happily post your business’s name next to a sentence you’d never have written. The helper writes; a person decides.

Lane 3: recurring templates

Some posts you want to send on a rhythm. The Friday “weekend hours” reminder. The first-of-the-month “here’s what’s new” note. The Monday motivational line. Typing those out every week is exactly the kind of chore that quietly stops happening.

Lane 3 keeps standing posts in a templates section of the rules doc, each with its own schedule (“every Friday at 9am,” “first Monday of the month”). A small template-sync Lambda runs on those schedules, drops a fresh row onto the calendar a few days ahead, and runs it through the same review card as Lane 2. You get a chance to tweak the wording or skip it for the week before it’s queued. A template you never touch just keeps proposing the same reliable post; one you edit each time still saves you the blank box.

Recurring templates are the most opt-in of the three lanes. A team that doesn’t use them loses nothing; a team that does never forgets the standing posts again.

Why the sheet stays the source of truth

Three lanes in, but only one place where the scheduler actually looks. That’s a deliberate constraint. If two lanes both wrote directly to the scheduler’s state, every “why did this post go out?” question would mean checking three places. Funneling everything through the Drive sheet means there is exactly one row per post, and anyone can read or edit any of it without learning a new tool. The convenience lanes are first-class for getting posts in, but they always pass through the sheet on the way.

Next post: how the scheduler reads the calendar, computes when each post is due, and picks one of four moves.

All posts