This workflow corresponds to n8n.io template #17103 — we link there as the canonical source.
This workflow follows the Airtable → HTTP Request recipe pattern — see all workflows that pair these two integrations.
The workflow JSON
Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →
{
"meta": {
"templateCredsSetupCompleted": false
},
"name": "Daily AI Social Post \u2014 Airtable + Claude + AI Image + Buffer",
"tags": [],
"nodes": [
{
"id": "0901417d-375a-4a5e-b498-00d6fe3ed584",
"name": "Schedule Trigger Posts",
"type": "n8n-nodes-base.scheduleTrigger",
"notes": "Runs every day at 08:00 (workflow timezone). Change the hour/interval here to adjust your posting rhythm.",
"position": [
0,
176
],
"parameters": {
"rule": {
"interval": [
{
"triggerAtHour": 8
}
]
}
},
"notesInFlow": true,
"typeVersion": 1.3
},
{
"id": "e9de245c-3f78-40bc-8dbb-6e86a5ca8e24",
"name": "Get Post Ideas",
"type": "n8n-nodes-base.airtable",
"notes": "Reads every row from the 'Topics' table where Active = TRUE. This is your idea bank: one topic per row in a field called 'Topic'.",
"position": [
224,
176
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "YOUR_AIRTABLE_BASE_ID"
},
"table": {
"__rl": true,
"mode": "id",
"value": "YOUR_TOPICS_TABLE_ID",
"cachedResultName": "Topics"
},
"options": {},
"operation": "search",
"filterByFormula": "{Active} = TRUE()"
},
"notesInFlow": true,
"typeVersion": 2.2
},
{
"id": "5c8dead2-f2bd-4e0a-9b1a-d9e50706eb6f",
"name": "Check History Posts",
"type": "n8n-nodes-base.airtable",
"notes": "Fetches the last 14 published posts (sorted by Date, newest first). Used to avoid repeating a topic too soon. 'Always output data' is ON so an empty table does not stop the run.",
"position": [
448,
176
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "YOUR_AIRTABLE_BASE_ID"
},
"sort": {
"property": [
{
"field": "Date",
"direction": "desc"
}
]
},
"limit": 14,
"table": {
"__rl": true,
"mode": "id",
"value": "YOUR_POSTS_TABLE_ID",
"cachedResultName": "Posts"
},
"options": {},
"operation": "search",
"returnAll": false
},
"notesInFlow": true,
"typeVersion": 2.2,
"alwaysOutputData": true
},
{
"id": "39d5b18c-250c-494e-bc22-0528173ddfcc",
"name": "Filter and Choose Post Topic",
"type": "n8n-nodes-base.code",
"notes": "Compares the idea bank against the last 14 published posts, keeps only the topics that were NOT used recently and picks one at random. Outputs { topic, isValid }.",
"position": [
672,
176
],
"parameters": {
"jsCode": "// 1. Haal de beschikbare topics op uit de 'Get Ideas' node\nconst availableRecords = $('Get Post Ideas').all();\nconst availableTopics = availableRecords.map(item => {\n return item.json.Topic || item.json.topic || (item.json.fields ? item.json.fields.Topic : undefined);\n}).filter(t => t !== undefined);\n\n// 2. Haal de LAATSTE 14 posts op uit de 'Check History Posts' node\nconst historyRecords = $('Check History Posts').all();\nconst recentTopics = historyRecords.map(item => {\n return item.json.Topic || item.json.topic || (item.json.fields ? item.json.fields.Topic : undefined);\n}).filter(t => t !== undefined);\n\n// 3. Filter: Hou alleen de onderwerpen over die NIET in de afgelopen 14 dagen zijn gepost\nconst freshTopics = availableTopics.filter(topic => !recentTopics.includes(topic));\n\n// 4. Als ALLE beschikbare opties in de afgelopen 14 dagen al zijn gebruikt\nif (freshTopics.length === 0) {\n return [{\n json: {\n topic: \"Alle beschikbare topics zijn de afgelopen 14 dagen al gepost!\",\n isValid: false\n }\n }];\n}\n\n// 5. Kies een willekeurig onderwerp uit de \"toegestane\" lijst\nconst chosenTopic = freshTopics[Math.floor(Math.random() * freshTopics.length)];\n\nreturn [{\n json: {\n topic: chosenTopic,\n isValid: true\n }\n}];"
},
"notesInFlow": true,
"typeVersion": 2
},
{
"id": "b2dd94ca-4a94-4381-876a-0c1312cf5199",
"name": "Is Valid Post?",
"type": "n8n-nodes-base.if",
"notes": "TRUE branch = a fresh topic was found, continue. FALSE branch = every topic was already used in the last 14 runs, stop safely.",
"position": [
896,
176
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 3,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c47f4a42-4f78-4660-a026-936af9adea14",
"operator": {
"type": "boolean",
"operation": "equals"
},
"leftValue": "={{ $json.isValid }}",
"rightValue": true
}
]
}
},
"notesInFlow": true,
"typeVersion": 2.3
},
{
"id": "409dc16b-17b1-493f-b003-601a64008b8a",
"name": "No Operation, do nothing",
"type": "n8n-nodes-base.noOp",
"notes": "Dead end on purpose: nothing is published when no fresh topic is available. Add more rows to the Topics table (or a Slack/Email node here) if you want an alert.",
"position": [
1120,
272
],
"parameters": {},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "b1031160-3bcb-4141-9d31-43453e3ced85",
"name": "Claude - Write Post Text",
"type": "n8n-nodes-base.httpRequest",
"notes": "Calls the Anthropic Messages API and writes the caption for the chosen topic. EDIT THE PROMPT INSIDE THE JSON BODY: replace the brand context, tone of voice and rules with your own.",
"position": [
1120,
80
],
"parameters": {
"url": "https://api.anthropic.com/v1/messages",
"method": "POST",
"options": {},
"jsonBody": "={\n \"model\": \"claude-sonnet-5\",\n \"max_tokens\": 500,\n \"messages\": [\n {\n \"role\": \"user\",\n \"content\": \"Je bent een ervaren content schrijver voor 'Kijkes'.\\n\\nBEDRIJFSCONTEXT:\\nKijkes is GEEN traditioneel webdesignbureau. Wij bouwen automatisch, razendsnel en zonder gedoe professionele websites voor Belgische ondernemers (kmo's) die nu nog geen online aanwezigheid hebben. \\n\\nONZE AANBOD (verwerk dit subtiel als het past bij het onderwerp):\\n- Starter (\u20ac39/md + \u20ac299 opstart): Gewoon snel en simpel online staan met een professionele, mobielvriendelijke site.\\n- Pro (\u20ac59/md + \u20ac499 opstart): Voor wie meer klanten wil (inclusief contactformulier en koppeling met Google Bedrijfsprofiel).\\n- Groei (\u20ac129/md + \u20ac699 opstart): Volledige automatisering (beheerd Google Bedrijfsprofiel, automatische reviews en gemiste oproep die direct een sms stuurt).\\n\\nOPDRACHT:\\nSchrijf een sterke LinkedIn post in het Nederlands.\\n\\nONDERWERP: {{ $json.topic }}\\n\\nSTRIKTE REGELS:\\n- Lengte: Tussen de 120 en 180 woorden.\\n- Emojis: Maximaal 2 of 3 subtiele, professionele emoji's (bijv. \ud83d\ude80, \ud83d\udcbc of \ud83d\udcf1). Geen overdaad.\\n- Hashtags: Absoluut GEEN hashtags.\\n- Toon: Professioneel, to the point, simpel en vlot geschreven (geen ingewikkeld jargon).\\n- Structuur: Begin met een sterke openingszin, focus op de snelle oplossing zonder gedoe, en eindig ALTIJD met een prikkelende vraag.\\n\\nGeef ALLEEN de tekst van de post terug, zonder inleiding of extra opmerkingen.\"\n }\n ]\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"authentication": "predefinedCredentialType",
"headerParameters": {
"parameters": [
{
"name": "anthropic-version",
"value": "2023-06-01"
}
]
},
"nodeCredentialType": "anthropicApi"
},
"notesInFlow": true,
"typeVersion": 4.4
},
{
"id": "93c9a61b-86a9-4fd5-b43b-b9b0140a6c01",
"name": "Put Text in Variable",
"type": "n8n-nodes-base.set",
"notes": "Extracts the plain text out of the Anthropic API response and stores it as 'postText', so later nodes can reference it cleanly.",
"position": [
1344,
80
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "ae899b15-0887-42ee-ac55-9cfec431c8a3",
"name": "postText",
"type": "string",
"value": "={{ $json.content[1]?.text || $json.content[0]?.text }}"
}
]
}
},
"notesInFlow": true,
"typeVersion": 3.4
},
{
"id": "e3d41bfd-648f-4cc8-bf9d-f5f130df32af",
"name": "ChatGPT - Generate Image",
"type": "n8n-nodes-base.httpRequest",
"notes": "Generates a 1024x1024 branded illustration with the OpenAI image API. The prompt reuses the chosen topic and the generated caption, so image and text always match. Edit the style/colours in the prompt.",
"position": [
1568,
80
],
"parameters": {
"url": "https://api.openai.com/v1/images/generations",
"method": "POST",
"options": {},
"sendBody": true,
"sendHeaders": true,
"authentication": "predefinedCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "model",
"value": "gpt-image-2"
},
{
"name": "size",
"value": "1024x1024"
},
{
"name": "prompt",
"value": "=A professional, modern SaaS vector illustration for a tech company named 'Kijkes', which provides automated, lightning-fast website creation and online tools for Belgian small businesses.\n\nCORE CONCEPT:\nKijkes is about fast, hassle-free web delivery, launching offline companies online instantly, and providing automated growth tools (like Google Business and automated reviews).\n\nTHEME & TEXT INCLUSION:\nThe main subject of this post is: \"{{ $node[\"Is Valid Post?\"].json.topic }}\".\nInside the image, clearly and cleanly render one logical, highly relevant Dutch word integrated into the design (for example: \"ONLINE!\", \"KIJKES\", \"SNEL\", or \"WEBSITE\"). Ensure perfect typography and correct spelling.\n\nINSPIRATION FROM CONTENT:\nUse the specific theme of this text to shape the main object of the illustration:\n\"{{ $json.postText }}\"\n\nCOLOR PALETTE (Mandatory):\n- Main Color: #6c54f7 (Vibrant Purple)\n- Secondary Color: #b8affa (Soft Lavender-grey)\n- Accents: Deep Charcoal/Black and Pure White\n\nSTYLE DETAILS:\n- Clean 2D vector art with smooth, modern gradients.\n- Visually dynamic: Create a central, recognizable metaphor for speed, instant automation, and hassle-free web creation (like a website popping up instantly out of a clean box, a digital dashboard launching, or a fast automated setup).\n- Constraints: White background only. No photorealism. No corporate logos. No random gibberish text."
}
]
},
"headerParameters": {
"parameters": [
{
"name": "Content-Type",
"value": "application/json"
}
]
},
"nodeCredentialType": "openAiApi"
},
"notesInFlow": true,
"typeVersion": 4.4
},
{
"id": "f34b11a3-557e-4576-a8d9-36333ec3e851",
"name": "Base64 to PNG",
"type": "n8n-nodes-base.convertToFile",
"notes": "The image API returns base64. This node converts data[0].b64_json into a real binary PNG file so it can be uploaded.",
"position": [
1792,
80
],
"parameters": {
"options": {
"fileName": "kijkes-image.png"
},
"operation": "toBinary",
"sourceProperty": "data[0].b64_json"
},
"notesInFlow": true,
"typeVersion": 1.1
},
{
"id": "3ecc0207-b9d2-4224-9c1f-5d004b7aaaed",
"name": "Upload Post to ImgBB",
"type": "n8n-nodes-base.httpRequest",
"notes": "Social APIs need a public image URL, not a file. ImgBB hosts the PNG and returns that URL. Paste your own free ImgBB API key in the 'key' query parameter (or swap this node for S3 / Cloudinary / Drive).",
"position": [
2016,
80
],
"parameters": {
"url": "https://api.imgbb.com/1/upload",
"method": "POST",
"options": {},
"sendBody": true,
"sendQuery": true,
"contentType": "multipart-form-data",
"bodyParameters": {
"parameters": [
{
"name": "image",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
},
"queryParameters": {
"parameters": [
{
"name": "key",
"value": "YOUR_IMGBB_API_KEY"
}
]
}
},
"notesInFlow": true,
"typeVersion": 4.4
},
{
"id": "eae5b822-712a-4ee5-9f87-e433e163744a",
"name": "Create LinkedIn Post",
"type": "@bufferapp/n8n-nodes-buffer.buffer",
"notes": "Sends caption + image URL to Buffer for the LinkedIn channel. Fill in your own Buffer organization ID and channel ID.",
"position": [
2240,
80
],
"parameters": {
"imageUrl": "={{ $json.data.image.url }}",
"postText": "={{ $('Put Text in Variable').item.json.postText }}",
"resource": "post",
"channelId": "YOUR_LINKEDIN_CHANNEL_ID|linkedin",
"attachmentType": "image",
"organizationId": "YOUR_BUFFER_ORGANIZATION_ID"
},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "60dd2003-11c9-412b-8fcf-fbcb97ba4cdd",
"name": "Create Instagram Post",
"type": "@bufferapp/n8n-nodes-buffer.buffer",
"notes": "Sends the same caption + image URL to Buffer for the Instagram channel. Fill in your own Buffer organization ID and channel ID.",
"position": [
2464,
80
],
"parameters": {
"imageUrl": "={{ $('Upload Post to ImgBB').item.json.data.image.url }}",
"postText": "={{ $('Put Text in Variable').item.json.postText }}",
"resource": "post",
"channelId": "YOUR_INSTAGRAM_CHANNEL_ID|instagram",
"attachmentType": "image",
"organizationId": "YOUR_BUFFER_ORGANIZATION_ID"
},
"notesInFlow": true,
"typeVersion": 1
},
{
"id": "ae2f3b8e-2fd8-41d7-ac87-2c57097bae5c",
"name": "Log Posted Content",
"type": "n8n-nodes-base.airtable",
"notes": "Writes topic, caption and image URL to the 'Posts' table. This is what makes the 14-day anti-repeat memory work, so do not remove it.",
"position": [
2688,
80
],
"parameters": {
"base": {
"__rl": true,
"mode": "id",
"value": "YOUR_AIRTABLE_BASE_ID"
},
"table": {
"__rl": true,
"mode": "id",
"value": "YOUR_POSTS_TABLE_ID",
"cachedResultName": "Posts"
},
"columns": {
"value": {
"Post": "={{ $('Put Text in Variable').item.json.postText }}",
"Topic": "={{ $('Is Valid Post?').item.json.topic }}",
"Image URL": "={{ $('Upload Post to ImgBB').item.json.data.image.url }}"
},
"schema": [
{
"id": "Date",
"type": "dateTime",
"display": true,
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Date",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Topic",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Topic",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image URL",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image URL",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Platform",
"type": "array",
"display": true,
"options": [
{
"name": "LinkedIn",
"value": "LinkedIn"
},
{
"name": "Instagram",
"value": "Instagram"
}
],
"removed": true,
"readOnly": false,
"required": false,
"displayName": "Platform",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "create"
},
"notesInFlow": true,
"typeVersion": 2.2
},
{
"id": "sticky-01",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
-620,
-420
],
"parameters": {
"color": 4,
"width": 520,
"height": 620,
"content": "## \ud83d\udcc5 Daily AI Social Post Engine\n\nFully automated: every morning this workflow picks a topic it has not used recently, writes the caption with **Claude**, generates a matching **AI image**, and schedules it to **LinkedIn + Instagram** via Buffer.\n\n**Flow**\n1. Schedule trigger (daily 08:00)\n2. Read topic ideas from Airtable\n3. Read the last 14 posts (history)\n4. Pick a topic that was not used recently\n5. Claude writes the caption\n6. OpenAI generates the image\n7. Image is hosted on ImgBB (public URL)\n8. Buffer schedules LinkedIn + Instagram\n9. Airtable logs what was posted\n\n**Cost per run:** ~1 Claude call + 1 image generation.\n\n\u26a0\ufe0f No credentials are included. See the setup note below."
},
"typeVersion": 1
},
{
"id": "sticky-02",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
-620,
220
],
"parameters": {
"color": 3,
"width": 520,
"height": 420,
"content": "## \u2699\ufe0f Setup (5 min)\n\n**1. Credentials to create (all removed from this template):**\n- Airtable Personal Access Token\n- Anthropic (Claude) API key\n- OpenAI API key\n- Buffer\n- (no Cloudinary needed in this workflow)\n\n**2. Placeholders to replace:**\n- `YOUR_AIRTABLE_BASE_ID` + table IDs (pick your base/table from the dropdown)\n- `YOUR_BUFFER_ORGANIZATION_ID` and the channel IDs\n- `YOUR_IMGBB_API_KEY` in the *Upload Post to ImgBB* node (free key at imgbb.com)\n\n**3. Airtable base:** see the \"Airtable setup\" note below the flow \ud83d\udc47\n\n**4. Make it yours:** edit the prompts in the Claude node and the *ChatGPT - Generate Image* node \u2014 they currently contain example brand context."
},
"typeVersion": 1
},
{
"id": "sticky-03",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-60,
420
],
"parameters": {
"color": 3,
"width": 1000,
"height": 900,
"content": "## \ud83d\uddc2\ufe0f Airtable setup \u2014 1 base, 3 tables\n\nCreate **one** Airtable base (e.g. \"Content Engine\") with these three tables. The same base is used by both the daily-post and the weekly-video workflow.\n\n### 1. `Topics` \u2014 your idea bank (shared by both workflows)\n| Field | Type | What it holds |\n|---|---|---|\n| `Topic` | Single line text | One content idea per row, e.g. \"Why small businesses lose customers without a website\" |\n| `Active` | Checkbox | Only checked rows are used. Uncheck to retire an idea without deleting it. |\n\nFill this table with 20-40 ideas. The workflow randomly picks one per run.\n\n### 2. `Posts` \u2014 history of published image posts\n### 3. `Reels` \u2014 history of published videos\nBoth tables have the same fields (Reels does not need `Image URL`):\n| Field | Type | Written by |\n|---|---|---|\n| `Date` | **Created time** | Airtable itself (automatic) |\n| `Topic` | Single line text | The topic that was picked from `Topics` |\n| `Post` | Long text | The caption Claude generated |\n| `Image URL` | URL | The public image URL *(Posts table only)* |\n\n\u26a0\ufe0f **`Date` must be a \"Created time\" field**, not a normal date field \u2014 the workflow never writes it, but it sorts on it to find the last 14 items. Without it the anti-repetition check breaks.\n\n### Why two history tables?\nPosts and videos keep separate memories, so the same topic can appear as an image post and as a video without blocking each other.\n\n### How the anti-repetition works\n`Topics` (all active ideas) \u2212 last 14 rows of `Posts`/`Reels` = the pool it picks from. When the pool is empty, the run stops at the NoOp node instead of repeating content. So: keep at least ~15 active topics in the bank."
},
"typeVersion": 1
},
{
"id": "sticky-04",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-60,
-100
],
"parameters": {
"color": 7,
"width": 1120,
"height": 240,
"content": "### 1\ufe0f\u20e3 Pick a fresh topic\nLoad all active ideas, compare them with the last 14 published posts and randomly choose one that has not been used recently. This is the anti-repetition memory of the engine."
},
"typeVersion": 1
},
{
"id": "sticky-05",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
1080,
-100
],
"parameters": {
"color": 5,
"width": 900,
"height": 240,
"content": "### 2\ufe0f\u20e3 Generate the content\nClaude writes the caption, then OpenAI creates an on-brand illustration based on that same caption + topic, so text and visual always match. The base64 image is converted into a real PNG file."
},
"typeVersion": 1
},
{
"id": "sticky-06",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
2000,
-100
],
"parameters": {
"color": 6,
"width": 880,
"height": 240,
"content": "### 3\ufe0f\u20e3 Publish & remember\nThe PNG gets a public URL (ImgBB), Buffer schedules it on LinkedIn and Instagram, and Airtable logs the result so this topic is blocked for the next 14 runs."
},
"typeVersion": 1
},
{
"id": "sticky-07",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1264,
240
],
"parameters": {
"color": 2,
"width": 420,
"height": 140,
"content": "### \ud83d\udeab Nothing to post\nAll topics were used in the last 14 posts. Add more rows to the Topics table."
},
"typeVersion": 1
}
],
"active": false,
"settings": {
"timezone": "Europe/Brussels",
"binaryMode": "separate",
"callerPolicy": "workflowsFromSameOwner",
"executionOrder": "v1"
},
"connections": {
"Base64 to PNG": {
"main": [
[
{
"node": "Upload Post to ImgBB",
"type": "main",
"index": 0
}
]
]
},
"Get Post Ideas": {
"main": [
[
{
"node": "Check History Posts",
"type": "main",
"index": 0
}
]
]
},
"Is Valid Post?": {
"main": [
[
{
"node": "Claude - Write Post Text",
"type": "main",
"index": 0
}
],
[
{
"node": "No Operation, do nothing",
"type": "main",
"index": 0
}
]
]
},
"Log Posted Content": {
"main": [
[]
]
},
"Check History Posts": {
"main": [
[
{
"node": "Filter and Choose Post Topic",
"type": "main",
"index": 0
}
]
]
},
"Create LinkedIn Post": {
"main": [
[
{
"node": "Create Instagram Post",
"type": "main",
"index": 0
}
]
]
},
"Put Text in Variable": {
"main": [
[
{
"node": "ChatGPT - Generate Image",
"type": "main",
"index": 0
}
]
]
},
"Upload Post to ImgBB": {
"main": [
[
{
"node": "Create LinkedIn Post",
"type": "main",
"index": 0
}
]
]
},
"Create Instagram Post": {
"main": [
[
{
"node": "Log Posted Content",
"type": "main",
"index": 0
}
]
]
},
"Schedule Trigger Posts": {
"main": [
[
{
"node": "Get Post Ideas",
"type": "main",
"index": 0
}
]
]
},
"ChatGPT - Generate Image": {
"main": [
[
{
"node": "Base64 to PNG",
"type": "main",
"index": 0
}
]
]
},
"Claude - Write Post Text": {
"main": [
[
{
"node": "Put Text in Variable",
"type": "main",
"index": 0
}
]
]
},
"Filter and Choose Post Topic": {
"main": [
[
{
"node": "Is Valid Post?",
"type": "main",
"index": 0
}
]
]
}
}
}
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
This workflow runs daily and pulls active topics from Airtable, uses Anthropic Claude to write a LinkedIn-style caption, generates a matching illustration with the OpenAI Images API, hosts the image on ImgBB, schedules posts to LinkedIn and Instagram via Buffer, and logs the…
Source: https://n8n.io/workflows/17103/ — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Comment Capture Engine. Uses airtable, httpRequest. Scheduled trigger; 52 nodes.
Social Media AI Agent - Telegram. Uses httpRequest, airtable, linkedIn, twitter. Scheduled trigger; 26 nodes.
Convert your customer satisfaction into high-converting social media content with this fully automated social proof pipeline. This workflow scans your database for top-tier reviews, generates a brande
Linkedin Automation. Uses airtable, telegram, scheduleTrigger, stickyNote. Scheduled trigger; 15 nodes.
🧠 Problem This Solves Manually sharing Medium articles to LinkedIn daily can be repetitive and time-consuming. This automation: