Work  /  Marketing & Content  /  15

Content Repurposing Line with a Human Approval Gate

Agencies · Coaching · Media · SaaS · Personal brands

Built — counted from the workflow JSON in the repository; not yet run against live accounts

70nodes
5workflows
16sticky notes
69connections
A video recording turning into a row of posts, with a person’s approval between them.

The problem

You record one good thing a week. The clips, posts, captions and newsletter never get made, because each one is 20 minutes of unrewarding work.

The tools that promise to fix this auto-post — which is how a brand account ends up with something nobody wanted on it.

How it runs

  1. Transcribe

    01 / 07 Workflow 1 of 5 · Ingest & Transcribe · 20 nodes

    A video, a podcast or a long post comes in and becomes one timestamped transcript.

  2. Find the moments

    02 / 07 Workflow 2 of 5 · Segment & Rank · 11 nodes

    Windows are cut from the real transcript; the model only picks window IDs, and anything it cannot anchor is dropped.

  3. Keep the best five

    03 / 07 Workflow 2 of 5 · Segment & Rank · 11 nodes

    At most five moments per source, because a review queue of 40 is not reviewed — it is ignored.

  4. Draft against the rules

    04 / 07 Workflow 3 of 5 · Draft & Rules Check · 13 nodes

    Copy for each platform is drafted from the brand rules file, then checked in code for banned words and claims that need review.

    banned word → blocked, never queued

  5. A person approves

    05 / 07 Workflow 4 of 5 · Approval Queue · 9 nodes

    Every draft waits in Slack with its full copy showing; nothing publishes without a tap.

  6. The only way out

    06 / 07 Workflow 5 of 5 · Approve / Reject Callback · 17 nodes

    A verified signature, a status re-read from the sheet, the approved branch: the one path to publishing.

  7. Learn from a no

    07 / 07 Workflow 5 of 5 · Approve / Reject Callback · 17 nodes

    A rejection note is meant to be appended to the brand rules, so the same correction applies from the next run.

The five workflows, as built

Every node with its icon, as on the n8n canvasstarts a runa model or a parser, wired into the node above itHover a node for its name and type

  • 01Ingest & Transcribe

    20 nodes · 24 connections · 5 notes

    Form: New Source Asset · n8n Form TriggerForm: NewSource AssetManual: Test With Sample Source · Manual TriggerManual: TestWith Sample…Code: Sample Source Defaults · CodeCode: SampleSource…Code: Normalize Intake · CodeCode:Normalize…Route By Source Type · SwitchRoute BySource TypeHTTP: Fetch Blog HTML · HTTP RequestHTTP: FetchBlog HTMLCode: Extract Article Text & Paragraph Segments · CodeCode: ExtractArticle Text &…Extraction Long Enough? · IfExtractionLong Enough?HTTP: AssemblyAI - Submit Transcription · HTTP RequestHTTP:AssemblyAI…Code: Extract Transcript ID & Guard Submit Errors · CodeCode: ExtractTranscript ID…Submit OK? · IfSubmit OK?Wait 15s Before Poll · WaitWait 15sBefore PollHTTP: AssemblyAI - Get Transcript Status · HTTP RequestHTTP:AssemblyAI…Code: Check Poll Status & Guard Attempt Count · CodeCode: CheckPoll Status &…Transcription Completed? · IfTranscriptionCompleted?Poll Failed Or Timed Out? · IfPoll Failed OrTimed Out?Code: Build Transcript From AssemblyAI · CodeCode: BuildTranscript…Code: Assemble Canonical Transcript Record · CodeCode: AssembleCanonical…Notify: Ingestion Failed · SlackNotify:Ingestion…Execute Workflow: Segment & Rank · Execute WorkflowExecuteWorkflow:…

    form or manual in, transcribe, one canonical record

  • 02Segment & Rank

    11 nodes · 10 connections · 3 notes

    Receive Transcript · When Executed by Another WorkflowReceiveTranscriptBuild Candidate Windows · CodeBuild CandidateWindowsSelect Candidate Moments · Basic LLM ChainSelect CandidateMomentsSelection Model · OpenAI Chat ModelSelection ModelMoment Schema (Locked) · Structured Output ParserMoment Schema(Locked)Anchor Moments To Real Timestamps · CodeAnchor Moments ToReal TimestampsAny Anchored Moments? · IfAny AnchoredMoments?Notify — Nothing Usable In This Source · SlackNotify — NothingUsable In This…Rank And Take Top N · CodeRank And Take TopNStore Candidate Moments · Google SheetsStore CandidateMomentsExecute: Draft & Rules Check · Execute WorkflowExecute: Draft &Rules Check

    windows cut, the model picks IDs, anchored, top five

  • 03Draft & Rules Check

    13 nodes · 12 connections · 3 notes

    Receive Moment · When Executed by Another WorkflowReceive MomentFetch Brand Rules · Google DriveFetch Brand RulesParse Brand Rules · CodeParse Brand RulesDraft Per Platform · Basic LLM ChainDraft PerPlatformDrafting Model · OpenAI Chat ModelDrafting ModelDraft Schema (Locked) · Structured Output ParserDraft Schema(Locked)Apply Brand Rules Check · CodeApply Brand RulesCheckRoute By Check Result · IfRoute By CheckResultLog Blocked Draft · Google SheetsLog Blocked DraftNotify — Draft Blocked By Rules · SlackNotify — DraftBlocked By RulesMark Ready For Review · Edit FieldsMark Ready ForReviewStore Drafts · Google SheetsStore DraftsExecute: Approval Queue · Execute WorkflowExecute: ApprovalQueue

    the brand rules in, drafts out, a check in code

  • 04Approval Queue

    9 nodes · 7 connections · 2 notes

    Receive Drafts For Review · When Executed by Another WorkflowReceive DraftsFor ReviewBuild Approval Card · CodeBuild ApprovalCardPost Approval Card To Slack · SlackPost ApprovalCard To SlackQueued For Review · No OperationQueued For ReviewStale Review Nudge · Schedule TriggerStale ReviewNudgeRead Pending Older Than 48h · Google SheetsRead PendingOlder Than 48hAnything Stale? · IfAnything Stale?Post Reminder · SlackPost ReminderNothing Stale · No OperationNothing Stale

    the review card, and a nudge at 48 hours

  • 05Approve / Reject Callback

    17 nodes · 16 connections · 3 notes

    Slack Action Callback · WebhookSlack ActionCallbackVerify Slack Signature · CodeVerify SlackSignatureSignature Valid? · IfSignature Valid?Refuse Unsigned Request · Respond to WebhookRefuse UnsignedRequestParse Decision · CodeParse DecisionLook Up Draft · Google SheetsLook Up DraftStill Pending? · IfStill Pending?Respond — Already Actioned · Respond to WebhookRespond — AlreadyActionedApproved? · IfApproved?Mark Approved · Google SheetsMark ApprovedPublish To Platform · HTTP RequestPublish ToPlatformLog Published · Google SheetsLog PublishedRespond — Published · Respond to WebhookRespond —PublishedCapture Rejection Note · CodeCapture RejectionNoteAppend Note To Brand Rules · Google DriveAppend Note ToBrand RulesMark Rejected · Google SheetsMark RejectedRespond — Rejected And Learned · Respond to WebhookRespond —Rejected And…

    the signed callback: publish, or learn

70 executing nodes, by type

Code 16If 10Google Sheets 8Slack 5HTTP Request 4Respond to Webhook 4Execute Workflow 3When Executed by Another Workflow 3Other 17

The gates, 11 If and Switch nodes, decide whether anything happens next: a countable part of the system, not a claim about it. The 16 sticky notes carry the reasoning on the canvas, at the point it applies.

The guards, and what each one prevents

HoverTap a card to read what it prevents.

  • One path to publishing

    A backwards walk from the publish node returns exactly one path, and every step of it is a gate. That is a property of the graph, not a promise about it.

  • The model never writes a timestamp

    It cannot count seconds. It picks a window already cut from the transcript, and the clip’s text is the window’s own words, not a paraphrase.

  • The rules check is code

    A prompt asking the model not to use a banned word is a request. Banned words match on word boundaries — “cure” does not fire on “accurate” — and one blocked draft blocks the whole moment.

  • A rules file that will not parse stops everything

    A silently empty ban list would pass every check.

  • Signed, then re-read

    The callback verifies Slack’s signature and its freshness, and re-reads the draft’s status, because a Slack button stays clickable after it is pressed.

Limits, stated plainly

  • Built, not yet deployed. Every file imports cleanly and the single path to publishing was verified by walking the graph; there has been no run against real Slack and Buffer accounts.
  • Clip rendering is not built. The pipeline produces verified start and end times; rendering vertical clips needs FFmpeg on a host, or a paid render API — a decision with cost.
  • Only the first draft of a set is published, through Buffer. Fanning out per platform is one node’s work, once the platforms are known.
  • Transcription is AssemblyAI. The rejection-note loop is wired but not yet fed: the approval card still needs a field for the note.

Built with

  • n8n
  • AssemblyAI
  • OpenAI
  • Google Drive
  • Google Sheets
  • Slack
  • Buffer