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