Case Study
Concept BuildSocial Media Production Engine
A two-part n8n system that turns a cold lead list into LinkedIn, Facebook, and Instagram content — grounded in what each lead's own website actually talks about, not a template repeated across every name on the list.
Concept Build — Not a Client Project
The modeled result below uses a reasonable range for manual research-and-drafting time (20–30 minutes per lead), not measured data from a live engagement. If this gets attached to a real client rollout, their actual per-lead time and batch volume should be swapped in before any of this copy goes client-facing.
At a Glance
01
Executive Summary
A cold lead list is usually used once, for outreach, and then sits idle. This concept build puts it back to work: it scrapes every lead's site, turns what those companies actually say about themselves into five distinct content angles, and — once a human approves an angle — writes a LinkedIn post, a Facebook post, and an Instagram caption from it in parallel.
At a modeled 25 minutes of manual research and drafting per lead (range 20–30 minutes) across a batch of 50 leads, this replaces roughly 20 hours of manual work per batch. That figure is an illustrative estimate based on a reasonable time range, not a confirmed client result.
02
The Problem
Turning a lead list into social content usually means a person opening each company's website, figuring out what they actually do and care about, and drafting a post around it by hand. That research step is the easiest thing to skip under time pressure, and skipping it leaves a generic template repeated across every lead, which reads exactly like what it is.
- Cold lead lists get used once for outreach, then sit idle
- The research step — reading each site to find what a company actually cares about — is the first thing dropped under time pressure
- Without it, the fallback is one generic template repeated across every name on the list
- Even when the research gets done, writing for three platforms triples the work, so one platform gets the good version and the rest get copy-paste
03
The Approach
Separate idea generation from content writing. The system runs in two stages instead of one pass. Part 1 scrapes every lead's site and turns the combined content into five distinct angles per batch: cheap to generate, nothing committed yet. Part 2 only runs once a human picks a specific angle worth using, and that is when the system spends effort writing three platform-specific versions. Content generation that nobody will use never happens.
Ground every angle in the lead's actual site, not a prompt template. Each batch's five angles come from scraping and combining the real text of every site in that batch, so the audience appeal and messaging points are specific to what those companies say about themselves rather than a generic industry angle applied to everyone on the list.
Catch API shape mismatches before they silently break downstream steps. Two response-shape gotchas would otherwise have failed quietly. The OpenAI Responses API (v2.3) returns generated content at output[0].content[0].text rather than the older message.content shape, so the angle array lived at output.0.content.0.text.angles. Get that path wrong and the “split into five rows” step just returns nothing, with no obvious error. Separately, Airtable's get-record operation nests all fields under fields["Field Name"] while create-record does not. Mixing the two up in Part 2's angle-lookup step would have silently read undefined into every generated post instead of the actual angle text.
04
Architecture
| Layer | Implementation |
|---|---|
| Lead source | Google Sheet trimmed to Company Name + Website, from a raw Apollo CSV export |
| Scraping | HTTP Request node per lead, continue-on-error so one dead site never halts the batch |
| Idea generation | OpenAI GPT-4.1 (Responses API), one call per batch, returns 5 structured angles as JSON |
| Review layer | Airtable "Possible Angles" table plus a manually-added button field that triggers Part 2 via webhook |
| Content generation | 3 parallel GPT-4.1 branches (LinkedIn / Facebook / Instagram) per approved angle |
| Output | Airtable "Created Content" table, each row tagged by platform |
05
Modeled Results
Modeled illustration based on a 20–30 minute per-lead baseline and a 50-lead batch. Not measured data from a live engagement.
06
Why This Matters
The instinct with content is to generate more of it. The better move is to generate less, later. Splitting idea generation from writing means the expensive step only runs on ideas a human has already judged worth using, and the cheap step can afford to be thorough because nothing is committed yet. The human stays where judgment actually belongs: picking the angle.
The rest of the work was not the AI part. It was the two response shapes that fail silently: a JSON path one level off, and an Airtable operation that nests fields differently depending on which one you call. Neither throws an error. Both just quietly hand the next step nothing. That is usually where the real work is, in the details that look fine right up until the output is empty and nothing tells you why.
Stack

