This workflow corresponds to n8n.io template #5943 — we link there as the canonical source.
This workflow follows the Airtable → Google Drive 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 →
{
"name": "social media content publishing",
"tags": [],
"nodes": [
{
"id": "b286e753-d483-4288-b777-55b4aaaa3a98",
"name": "\ud83d\udcca Content Database (Media)",
"type": "n8n-nodes-base.airtable",
"notes": "\ud83d\udccb Fetches media and content from Airtable\n\u2022 Table: Youtube tool (tblRnaXqxrvcQhqBw)\n\u2022 Record: recuoYjg4icStHsMK\n\u2022 Contains: Video/image file IDs, social content\n\u2022 Fields: Short form Video, Image for socials\n\ud83d\udd17 Feeds into media download and upload pipeline",
"position": [
1440,
300
],
"parameters": {
"id": "={{ $json.query.RecordId }}",
"base": {
"mode": "list",
"value": "appTFomwpoQ8GVsSo"
},
"table": {
"mode": "list",
"value": "tblRnaXqxrvcQhqBw"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "70607089-3c8d-42ec-8626-d51740cb9c75",
"name": "\ud83d\udcf9 Video Upload to Postiz",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udd04 Uploads video files to Postiz storage\n\u2022 Endpoint: POST /upload\n\u2022 Content-Type: multipart-form-data\n\u2022 Input: Binary video data from Google Drive\n\u2022 Output: Postiz file ID and path\n\u2022 Required: Videos must be uploaded before posting\n\u26a0\ufe0f Cannot use external URLs in Postiz posts",
"position": [
1880,
100
],
"parameters": {
"url": "=https://postiz.yourdomain.com/api/public/v1/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "file",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "044473a4-12ba-48f1-ba2a-f6cea1d7d157",
"name": "\ud83d\udcbe Save Video Path",
"type": "n8n-nodes-base.airtable",
"notes": "\ud83d\udd04 Updates Airtable with Postiz video path\n\u2022 Operation: Update record\n\u2022 Field: 'postiz video' = upload response path\n\u2022 Maintains data consistency across systems\n\u2022 Enables future reference to uploaded videos\n\ud83d\udcdd Links Google Drive \u2192 Postiz \u2192 Airtable chain",
"position": [
2100,
100
],
"parameters": {
"base": {
"mode": "list",
"value": "appTFomwpoQ8GVsSo"
},
"table": {
"mode": "list",
"value": "tblRnaXqxrvcQhqBw"
},
"columns": {
"value": {
"id": "={{ $('\ud83d\udcca Content Database (Media)').item.json.id }}",
"postiz video": "={{ $json.path }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "recordid",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "recordid",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "google drive",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "google drive",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "transcript",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "transcript",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "initial script",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "initial script",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "start",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "upload media",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "upload media",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Post to socials",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Post to socials",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Post shorts",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Post shorts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_title",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_description",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_thumbnail_text",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_thumbnail_text",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "twitter single",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "twitter single",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "twitter_thread",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "twitter_thread",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "linkedin_post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "linkedin_post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "facebook_post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "facebook_post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "facebook_story_caption",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "facebook_story_caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "instagram_post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "instagram_post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "instagram_reel",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "instagram_reel",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "tiktok_caption",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "tiktok_caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_shorts_caption",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_shorts_caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Short form Video",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Short form Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image for socials",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image for socials",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "postiz image",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "postiz image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "postiz video",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "postiz video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Record ID",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Record ID",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"typeVersion": 2.1
},
{
"id": "052ba337-dba8-4451-8ca2-39862314fa4b",
"name": "\ud83d\uddbc\ufe0f Image Upload to Postiz",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udd04 Uploads image files to Postiz storage\n\u2022 Endpoint: POST /upload\n\u2022 Content-Type: multipart-form-data\n\u2022 Input: Binary image data from Google Drive\n\u2022 Output: Postiz file ID and path for posts\n\u2022 Supports: JPG, PNG, GIF formats\n\ud83d\udcf1 Used across Instagram, Twitter, LinkedIn, Facebook",
"position": [
1880,
300
],
"parameters": {
"url": "=https://postiz.yourdomain.com/api/public/v1/upload",
"method": "POST",
"options": {},
"sendBody": true,
"contentType": "multipart-form-data",
"authentication": "genericCredentialType",
"bodyParameters": {
"parameters": [
{
"name": "file",
"parameterType": "formBinaryData",
"inputDataFieldName": "data"
}
]
},
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "98f5db1d-92da-4120-9ad6-d615d4112f94",
"name": "\ud83d\udcbe Save Image Path",
"type": "n8n-nodes-base.airtable",
"notes": "\ud83d\udd04 Updates Airtable with Postiz image path\n\u2022 Operation: Update record\n\u2022 Field: 'postiz image' = upload response path\n\u2022 Used by all image-based social posts\n\u2022 Maintains referential integrity\n\ud83d\udcca Enables tracking of media usage across platforms",
"position": [
2100,
300
],
"parameters": {
"base": {
"mode": "list",
"value": "appTFomwpoQ8GVsSo"
},
"table": {
"mode": "list",
"value": "tblRnaXqxrvcQhqBw"
},
"columns": {
"value": {
"id": "={{ $('\ud83d\udcca Content Database (Media)').item.json.id }}",
"postiz image": "={{ $json.path }}"
},
"schema": [
{
"id": "id",
"type": "string",
"display": true,
"readOnly": true,
"required": false,
"displayName": "id",
"defaultMatch": true
},
{
"id": "Name",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Name",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "recordid",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "recordid",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "google drive",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "google drive",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "transcript",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "transcript",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "initial script",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "initial script",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "start",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "start",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "upload media",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "upload media",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Post to socials",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Post to socials",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Post shorts",
"type": "boolean",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Post shorts",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_title",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_title",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_description",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_description",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_thumbnail_text",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_thumbnail_text",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "twitter single",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "twitter single",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "twitter_thread",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "twitter_thread",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "linkedin_post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "linkedin_post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "facebook_post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "facebook_post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "facebook_story_caption",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "facebook_story_caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "instagram_post",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "instagram_post",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "instagram_reel",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "instagram_reel",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "tiktok_caption",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "tiktok_caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "youtube_shorts_caption",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "youtube_shorts_caption",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Short form Video",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Short form Video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Image for socials",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "Image for socials",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "postiz image",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "postiz image",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "postiz video",
"type": "string",
"display": true,
"removed": false,
"readOnly": false,
"required": false,
"displayName": "postiz video",
"defaultMatch": false,
"canBeUsedToMatch": true
},
{
"id": "Record ID",
"type": "string",
"display": true,
"removed": false,
"readOnly": true,
"required": false,
"displayName": "Record ID",
"defaultMatch": false,
"canBeUsedToMatch": true
}
],
"mappingMode": "defineBelow",
"matchingColumns": [
"id"
],
"attemptToConvertTypes": false,
"convertFieldsToString": false
},
"options": {},
"operation": "update"
},
"typeVersion": 2.1
},
{
"id": "e93e3769-7209-4134-ba6c-586e440b2c86",
"name": "\ud83d\udce5 Download Video from Drive",
"type": "n8n-nodes-base.googleDrive",
"notes": "\u2601\ufe0f Downloads video from Google Drive\n\u2022 Input: Google Drive file ID from Airtable\n\u2022 Field: 'Short form Video'\n\u2022 Output: Binary video data\n\u2022 Formats: MP4, MOV, AVI supported\n\ud83d\udd17 Feeds directly into Postiz upload pipeline",
"position": [
1660,
100
],
"parameters": {
"fileId": "{{FILEID_ID}}",
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "ec6aa9d3-584a-4fb7-a526-765b48e5b2cf",
"name": "\ud83d\udce5 Download Image from Drive",
"type": "n8n-nodes-base.googleDrive",
"notes": "\u2601\ufe0f Downloads image from Google Drive\n\u2022 Input: Google Drive file ID from Airtable\n\u2022 Field: 'Image for socials'\n\u2022 Output: Binary image data\n\u2022 Used across all visual social platforms\n\ud83d\udcf1 Optimized for social media dimensions",
"position": [
1660,
300
],
"parameters": {
"fileId": "{{FILEID_ID}}",
"options": {},
"operation": "download"
},
"credentials": {
"googleDriveOAuth2Api": {
"name": "<your credential>"
}
},
"typeVersion": 3
},
{
"id": "eed5e518-e6ba-4a07-89a5-eb254edcd4ec",
"name": "\ud83d\udcdd Workflow Documentation",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
0
],
"parameters": {
"width": 2390,
"height": 900,
"content": " ## \ud83d\udcdd POSTIZ MEDIA UPLOAD WORKFLOW\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\n\ud83c\udfaf PURPOSE:\nAutomated media upload pipeline that downloads videos and images from Google Drive and uploads them to Postiz storage for social media posting.\n\n\ud83d\udd04 WORKFLOW PROCESS:\n1. Webhook triggers the workflow\n2. Fetch media metadata from Airtable\n3. Download video + image from Google Drive\n4. Upload both files to Postiz storage\n5. Save Postiz file paths back to Airtable\n\n\ud83d\udd27 TECHNICAL DETAILS:\n\u2022 API: Postiz /upload endpoint (multipart-form-data)\n\u2022 Storage: Converts Google Drive files \u2192 Postiz URLs\n\u2022 Integration: Updates Airtable with Postiz paths\n\u2022 Required: All media must be uploaded before posting\n\n\n\n\n\n\n\n\n\u26a0\ufe0f CRITICAL NOTES:\n\u2022 Cannot use external URLs in Postiz posts\n\u2022 Files must be uploaded to google drive first - id referenced in airtable\n\u2022 Enables reference tracking for all platforms\n\n\ud83d\udcca DATA FLOW:\nGoogle Drive \u2192 Download \u2192 Postiz Upload \u2192 Airtable Update\n\n\ud83d\udd17 CONNECTS TO:\nMain social media posting workflows that reference these uploaded file paths for Instagram, Twitter, LinkedIn, Facebook, and YouTube posting.\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"
},
"typeVersion": 1
},
{
"id": "005cadcd-777a-4718-a4fd-8c601c7030c1",
"name": "\ud83d\udd17 integrations",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udccb Fetches all connected social media integrations from Postiz\n\u2022 Gets integration IDs for Instagram, Twitter, LinkedIn, etc.\n\u2022 Required for platform-specific posting\n\u2022 Returns: id, name, identifier, disabled status",
"position": [
1080,
1380
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/integrations",
"options": {},
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "2d6f74c0-e556-4700-97bc-1b1e2237e03e",
"name": "\ud83d\udd00 Platform Router",
"type": "n8n-nodes-base.switch",
"notes": "\ud83c\udfaf Routes integrations to appropriate posting workflows\n\u2022 Instagram: cmcotolny0001pnal2i86mkrh\n\u2022 Twitter Alt: cmcg6ifpn001hmx9gakul0358\n\u2022 Twitter Main: cmcf026ts0001mx9g6o8t5xc4\n\u2022 LinkedIn: linkedin-page identifier\n\u2022 Facebook: facebook identifier\n\u2022 YouTube: youtube identifier\n\u26a0\ufe0f Integration IDs are unique per Postiz installation",
"position": [
1320,
1320
],
"parameters": {
"rules": {
"values": [
{
"outputKey": "instagram",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "3fc7d2c2-cd01-46ec-b4d1-6e4966722314",
"operator": {
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.id }}",
"rightValue": "=cmcotolny0001pnal2i86mkrh"
}
]
},
"renameOutput": true
},
{
"outputKey": "x alt",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "6236f9fa-bd4c-46c3-bfbb-4d50c7461fcb",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.id }}",
"rightValue": "cmcg6ifpn001hmx9gakul0358"
}
]
},
"renameOutput": true
},
{
"outputKey": "x main",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "c0c50e74-7492-4009-9abc-9240cb69d135",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.id }}",
"rightValue": "cmcf026ts0001mx9g6o8t5xc4"
}
]
},
"renameOutput": true
},
{
"outputKey": "linkedin-page",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "88d69331-8d87-48ef-85de-75404b9569d3",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.identifier }}",
"rightValue": "linkedin-page"
}
]
},
"renameOutput": true
},
{
"outputKey": "facebook",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "d5f1681e-2384-46f4-adcb-65ccc08e7606",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.identifier }}",
"rightValue": "facebook"
}
]
},
"renameOutput": true
},
{
"outputKey": "youtube",
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "047aae0a-c0f8-44b2-bc41-203287526cb5",
"operator": {
"name": "filter.operator.equals",
"type": "string",
"operation": "equals"
},
"leftValue": "={{ $json.identifier }}",
"rightValue": "youtube"
}
]
},
"renameOutput": true
}
]
},
"options": {}
},
"typeVersion": 3.2
},
{
"id": "7f44b9a2-fa18-4f85-8e8b-0df193e817e3",
"name": "\ud83d\udc26 X/Twitter Posts",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcf1 Posts to Twitter/X using Postiz API\n\u2022 Uses cleaned 'twitter single' content from Airtable\n\u2022 Includes image from 'postiz image' field\n\u2022 Posts immediately (type: 'now')\n\u2022 Settings: type='post' for regular tweets\n\ud83d\udca1 Content must be cleaned to prevent JSON errors",
"position": [
1820,
1180
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"order\": \"\",\n \"shortLink\": true,\n \"inter\": 0,\n \n \"tags\": [\n {\n \"value\": \"\",\n \"label\": \"\"\n }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json['twitter single'] }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json.postiz_twitter }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"type\": \"post\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "25817540-d225-432b-9e09-b766d2817947",
"name": "\ud83d\udcbc LinkedIn Publisher",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcca Posts professional content to LinkedIn\n\u2022 Uses cleaned 'linkedin_post' content (processed by Code2)\n\u2022 Targets LinkedIn Pages (business accounts)\n\u2022 Professional formatting and tone\n\u2022 Image support for visual content\n\u2705 Content cleaning prevents JSON formatting errors",
"position": [
1840,
1540
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"order\": \"\",\n \"shortLink\": true,\n \"inter\": 0,\n \n \"tags\": [\n {\n \"value\": \"\",\n \"label\": \"\"\n }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $json.linkedin_post }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json['postiz image'] }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"type\": \"post\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "4b40a5d7-d62e-4ad8-be51-cad72578c102",
"name": "\ud83d\udc26 X/Twitter Alt Account",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcf1 Alternative Twitter/X account posting\n\u2022 Duplicate of main Twitter posting for secondary account\n\u2022 Uses same 'twitter single' content\n\u2022 Different integration ID for alt account\n\u2022 Maintains consistency across multiple X accounts\n\ud83d\udd04 Part of multi-account social strategy",
"position": [
1840,
1360
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"order\": \"\",\n \"shortLink\": true,\n \"inter\": 0,\n \n \"tags\": [\n {\n \"value\": \"\",\n \"label\": \"\"\n }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json['twitter single'] }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json.postiz_twitter }}\"\n\n }\n ]\n }\n ]\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d1ae77ee-cd24-4556-a2b8-cbc6e03a0890",
"name": "\ud83e\uddf9 Instagram Content Cleaner",
"type": "n8n-nodes-base.code",
"notes": "\u26a0\ufe0f CRITICAL: Fixes JSON formatting issues\n\u2022 Removes line breaks (\\n), carriage returns (\\r), tabs (\\t)\n\u2022 Replaces multiple spaces with single spaces\n\u2022 Prevents 'JSON parameter needs to be valid JSON' errors\n\u2022 Essential for Instagram caption processing\n\ud83d\udeab Without this: API calls fail with malformed JSON",
"position": [
1540,
1080
],
"parameters": {
"jsCode": "// \ud83e\uddf9 INSTAGRAM CONTENT CLEANER\n// Critical: Prevents 'JSON parameter needs to be valid JSON' errors\nlet content = $('\ud83d\udcca Content Database (Posts)').item.json.instagram_post;\n\ncontent = content\n .replace(/[\\n\\r\\t]+/g, ' ') // Replace all line breaks and tabs with spaces\n .replace(/\\s{2,}/g, ' ') // Replace multiple spaces with single space\n .trim(); // Remove leading/trailing whitespace\n\nreturn [{\n json: {\n ...items[0].json,\n instagram_post: content\n }\n}];"
},
"typeVersion": 2
},
{
"id": "4df5a42d-013a-4842-a917-2e079da7a486",
"name": "\ud83d\udcf8 Instagram Publisher",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcf1 Posts visual content to Instagram\n\u2022 Uses cleaned 'instagram_caption' (processed by Code1)\n\u2022 Requires image for all Instagram posts\n\u2022 Tags: 'instagram' for tracking\n\u2022 Settings: type='post' for feed posts\n\u2705 Working configuration with proper content cleaning",
"position": [
1820,
1000
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"shortLink\": true,\n \"tags\": [\n { \"value\": \"instagram\", \"label\": \"Instagram\" }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $json.instagram_post }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json['postiz image'] }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"type\": \"post\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "c5ae7985-3f36-4225-bb64-4c2b674a2fe0",
"name": "\ud83d\udcca Content Database (Posts)",
"type": "n8n-nodes-base.airtable",
"notes": "\ud83d\udccb Fetches social media content from Airtable\n\u2022 Same table/record as media source\n\u2022 Contains: platform-specific post content\n\u2022 Fields: instagram_caption, linkedin_post, twitter single, faceboook\n\u2022 Feeds content into cleaning and posting workflows\n\ud83d\udd04 Central content repository for all platforms",
"position": [
740,
1380
],
"parameters": {
"id": "={{ $json.query.RecordId }}",
"base": {
"mode": "list",
"value": "appTFomwpoQ8GVsSo"
},
"table": {
"mode": "list",
"value": "tblRnaXqxrvcQhqBw"
},
"options": {}
},
"credentials": {
"airtableTokenApi": {
"name": "<your credential>"
}
},
"typeVersion": 2.1
},
{
"id": "a0f582b4-aa2c-4bc0-b9cb-2033d5e23d09",
"name": "\ud83e\uddf9 LinkedIn Content Cleaner",
"type": "n8n-nodes-base.code",
"notes": "\u26a0\ufe0f CRITICAL: Fixes JSON formatting for LinkedIn\n\u2022 Same cleaning logic as Instagram cleaner\n\u2022 Removes problematic characters: \\n, \\r, \\t\n\u2022 Prevents API failures with malformed JSON\n\u2022 Essential for LinkedIn professional content\n\ud83d\udcbc Maintains professional formatting while ensuring JSON validity",
"position": [
1640,
1540
],
"parameters": {
"jsCode": "// \ud83e\uddf9 LINKEDIN CONTENT CLEANER\n// Critical: Prevents 'JSON parameter needs to be valid JSON' errors\nlet content = $('\ud83d\udcca Content Database (Posts)').item.json.linkedin_post;\n\ncontent = content\n .replace(/[\\n\\r\\t]+/g, ' ') // Replace all line breaks and tabs with spaces\n .replace(/\\s{2,}/g, ' ') // Replace multiple spaces with single space\n .trim(); // Remove leading/trailing whitespace\n\nreturn [{\n json: {\n ...items[0].json,\n linkedin_post: content\n }\n}];"
},
"typeVersion": 2
},
{
"id": "5efa8626-343b-4ac9-a489-596d3404fd07",
"name": "\ud83d\udcd8 Facebook Publisher",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcf1 Posts content to Facebook\n\u2022 Uses cleaned 'faceboook' content (processed by Code3)\n\u2022 Supports both images and videos\n\u2022 Similar functionality to Instagram\n\u2022 Settings: type='post' for feed posts\n\ud83d\udd35 Part of Meta ecosystem alongside Instagram",
"position": [
1840,
1740
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"order\": \"\",\n \"shortLink\": true,\n \"inter\": 0,\n \n \"tags\": [\n {\n \"value\": \"\",\n \"label\": \"\"\n }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $json.faceboook_post }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Posts)').item.json['postiz image'] }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"type\": \"post\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "805df154-3f9e-493c-b950-7c2b59fe62e7",
"name": "\ud83e\uddf9 Facebook Content Cleaner",
"type": "n8n-nodes-base.code",
"notes": "\u26a0\ufe0f CRITICAL: Fixes JSON formatting for Facebook\n\u2022 Cleans 'faceboook' field from Airtable\n\u2022 Same regex patterns as other cleaners\n\u2022 Prevents JSON parsing errors in API calls\n\u2022 Essential for Facebook posting reliability\n\ud83d\udcd8 Part of Meta content processing pipeline",
"position": [
1640,
1740
],
"parameters": {
"jsCode": "// \ud83e\uddf9 FACEBOOK CONTENT CLEANER\n// Critical: Prevents 'JSON parameter needs to be valid JSON' errors\nlet content = $('\ud83d\udcca Content Database (Posts)').item.json.facebook_post;\n\ncontent = content\n .replace(/[\\n\\r\\t]+/g, ' ') // Replace all line breaks and tabs with spaces\n .replace(/\\s{2,}/g, ' ') // Replace multiple spaces with single space\n .trim(); // Remove leading/trailing whitespace\n\nreturn [{\n json: {\n ...items[0].json,\n faceboook_post: content\n }\n}];"
},
"typeVersion": 2
},
{
"id": "197238c4-a400-4d12-858d-e5a0379f7a77",
"name": "\ud83d\udcdd Complete Workflow Guide",
"type": "n8n-nodes-base.stickyNote",
"position": [
0,
980
],
"parameters": {
"color": 3,
"width": 2400,
"height": 1200,
"content": "## \ud83d\udcf1 SOCIAL MEDIA POSTING WORKFLOW\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\n\n\ud83c\udfaf PURPOSE:\nAutomated multi-platform social media posting using Postiz API. Distributes content across Instagram, Twitter/X (2 accounts), LinkedIn, and Facebook with platform-specific content cleaning and formatting.\n\n\ud83d\udd04 COMPLETE WORKFLOW PROCESS:\n1. \ud83d\udcca Fetch social media content from Airtable database\n2. \ud83d\udd17 Get integration IDs for all connected social platforms\n3. \ud83d\udd00 Route each platform to appropriate content processor\n4. \ud83e\uddf9 Clean content to prevent JSON formatting errors\n5. \ud83d\udcf1 Post to respective social media platforms simultaneously\n\n\ud83d\udccb PLATFORM COVERAGE:\n\u2022 \ud83d\udcf8 Instagram (Visual content + captions)\n\u2022 \ud83d\udc26 Twitter/X Main Account (Text + images)\n\u2022 \ud83d\udc26 Twitter/X Alt Account (Duplicate posting)\n\u2022 \ud83d\udcbc LinkedIn (Professional content)\n\u2022 \ud83d\udcd8 Facebook (Meta ecosystem posting)\n\n\u26a0\ufe0f CRITICAL CONTENT CLEANING:\n\u2022 Removes line breaks (\\n), carriage returns (\\r), tabs (\\t)\n\u2022 Replaces multiple spaces with single spaces\n\u2022 Prevents 'JSON parameter needs to be valid JSON' errors\n\u2022 ESSENTIAL: Without cleaning, all API calls fail!\n\n\ud83d\udd27 TECHNICAL SPECIFICATIONS:\n\u2022 API: Postiz /posts endpoint (POST)\n\u2022 Authentication: HTTP Header Auth\n\u2022 Content-Type: application/json\n\u2022 Posting Type: Immediate ('now') + 1 minute delay\n\u2022 Media: References pre-uploaded Postiz image paths\n\u2022 Rate Limit: 30 requests/hour (API beta limitation)\n\n\ud83d\udd17 DATA SOURCES:\n\u2022 Content: Airtable \n\u2022 Media: Pre-uploaded via separate media upload workflow\n\u2022 Fields: instagram_caption, linkedin_post, twitter single, faceboook\n\u2022 Images: References 'postiz image' field paths\n\n\u26a1 EXECUTION FLOW:\nAirtable \u2192 Integrations \u2192 Platform Router \u2192 Content Cleaners \u2192 Social Publishers\n\n\ud83d\udea8 TROUBLESHOOTING:\n\u2022 JSON Errors: Check content cleaning nodes\n\u2022 500 Errors: Verify integration IDs and account connections\n\u2022 Missing Media: Ensure media upload workflow ran first\n\u2022 Rate Limits: Space out executions (30/hour limit)\n\n\ud83d\udd04 DEPENDENCIES:\n\u2022 Requires: Media upload workflow (for image/video paths)\n\u2022 Connects to: Analytics and monitoring workflows\n\u2022 Updates: Airtable with posting status and URLs\n\n\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501\u2501"
},
"typeVersion": 1
},
{
"id": "4fcdcc17-949a-4b2f-ae70-a22e0f2da504",
"name": "\ud83c\udfac YouTube Publisher",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcfa Posts content to YouTube (Note: Uses Facebook content)\n\u2022 Currently using 'faceboook' content field\n\u2022 Uses 'postiz image' instead of video\n\u2022 May need adjustment for proper YouTube video posting\n\u2022 YouTube typically requires video content, not images\n\u26a0\ufe0f Configuration may need refinement for YouTube specifics",
"position": [
1880,
2940
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"order\": \"\",\n \"shortLink\": true,\n \"inter\": 0,\n \"tags\": [\n {\n \"value\": \"\",\n \"label\": \"\"\n }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $('\ud83d\udcca Content Database (Video)').item.json.youtube_shorts_caption }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Video)').item.json['postiz video'] }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"__type\": \"youtube\",\n \"title\": \"{{ $('\ud83d\udcca Content Database (Video)').item.json.youtube_title }}\",\n \"type\": \"public\",\n \"tags\": [\"tag1\", \"tag2\"],\n \"categoryId\": \"22\",\n \"madeForKids\": false\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "48f59939-c58a-4837-8377-a412cbb2439e",
"name": "\ud83e\uddf9 Facebook Video Cleaner",
"type": "n8n-nodes-base.code",
"notes": "\u26a0\ufe0f CRITICAL: Content cleaner for Facebook videos\n\u2022 Processes Facebook content for video posts\n\u2022 References 'Airtable' node (video workflow)\n\u2022 Same cleaning regex as other cleaners\n\u2022 Prevents JSON formatting errors\n\ud83d\udcf9 Part of Facebook video content pipeline",
"position": [
1580,
2680
],
"parameters": {
"jsCode": "// \ud83e\uddf9 FACEBOOK VIDEO CONTENT CLEANER\n// Critical: Prevents 'JSON parameter needs to be valid JSON' errors\nlet content = $('\ud83d\udcca Content Database (Video)').item.json.facebook_story_caption;\n\ncontent = content\n .replace(/[\\n\\r\\t]+/g, ' ') // Replace all line breaks and tabs with spaces\n .replace(/\\s{2,}/g, ' ') // Replace multiple spaces with single space\n .trim(); // Remove leading/trailing whitespace\n\nreturn [{\n json: {\n ...items[0].json,\n facebook_story_caption: content\n }\n}];"
},
"typeVersion": 2
},
{
"id": "243b21a0-540c-4069-ac04-26b8ef107ebb",
"name": "\ud83d\udcd8 Facebook Video Publisher",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcf1 Posts video content to Facebook\n\u2022 Uses Facebook content with '11111' test suffix\n\u2022 References 'postiz video' for video content\n\u2022 Part of Facebook video strategy\n\u2022 Same API structure as other platforms\n\ud83c\udfac Facebook video content distribution",
"position": [
1880,
2680
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"order\": \"\",\n \"shortLink\": true,\n \"inter\": 0,\n \n \"tags\": [\n {\n \"value\": \"\",\n \"label\": \"\"\n }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $('\ud83d\udcca Content Database (Video)').item.json.facebook_story_caption }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Video)').item.json['postiz video'] }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"type\": \"post\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "d5d60a64-f453-4ebb-b72d-7bf3a2e94f10",
"name": "\ud83d\udcca Content Database (Video)",
"type": "n8n-nodes-base.airtable",
"notes": "\ud83d\udccb Content source for video workflow\n\u2022 Same table/record as other Airtable nodes\n\u2022 Provides content for video-based posts\n\u2022 Contains uploaded video paths ('postiz video')\n\u2022 Feeds into video content processing\n\ud83c\udfac Specialized for video content distribution",
"position": [
880,
2740
],
"parameters": {
"id": "={{ $json.query.RecordId }}",
"base": {
"mode": "list",
"value": "appTFomwpoQ8GVsSo"
},
"table": {
"mode": "list",
"value": "tblRnaXqxrvcQhqBw"
},
"options": {}
},
"typeVersion": 2.1
},
{
"id": "4c773e3c-6c88-41ea-b9a4-12f22a32f812",
"name": "\ud83d\udcf9 Instagram Video Publisher",
"type": "n8n-nodes-base.httpRequest",
"notes": "\ud83d\udcf1 Posts video content to Instagram\n\u2022 Uses cleaned caption from video cleaner\n\u2022 References 'postiz video' field (uploaded video)\n\u2022 Can be used for Reels or regular video posts\n\u2022 Same structure as image posts but with video\n\ud83c\udfac Supports Instagram's video content strategy",
"position": [
1880,
2460
],
"parameters": {
"url": "https://postiz.yourdomain.com/api/public/v1/posts",
"method": "POST",
"options": {},
"jsonBody": "={\n \"type\": \"now\",\n \"date\": \"{{ $now.plus(1, 'minute').toISO() }}\",\n \"shortLink\": true,\n \"tags\": [\n { \"value\": \"instagram\", \"label\": \"Instagram\" }\n ],\n \"posts\": [\n {\n \"integration\": {\n \"id\": \"{{ $json.id }}\"\n },\n \"value\": [\n {\n \"content\": \"{{ $json.instagram_reel }}\",\n \"image\": [\n {\n \"id\": \"1\",\n \"path\": \"{{ $('\ud83d\udcca Content Database (Video)').item.json['postiz video'] }}\"\n }\n ]\n }\n ],\n \"settings\": {\n \"type\": \"post\"\n }\n }\n ]\n}",
"sendBody": true,
"specifyBody": "json",
"authentication": "genericCredentialType",
"genericAuthType": "httpHeaderAuth"
},
"credentials": {
"httpHeaderAuth": {
"name": "<your credential>"
}
},
"typeVersion": 4.2
},
{
"id": "72144a39-2990-46a3-a034-7f876351f8b0",
"name": "\ud83e\uddf9 Instagram Video Cleaner",
"type": "n8n-nodes-base.code",
"notes": "\u26a0\ufe0f CRITICAL: Content cleaner for video workflow\n\u2022 Same cleaning logic as image workflow\n\u2022 Processes Instagram captions for video posts\n\u2022 References different Airtable node ('Airtable' vs 'Airtable2')\n\u2022 Prevents JSON errors in video posting\n\ud83d\udcf9 Part of video-specific content pipeline",
"position": [
1580,
2460
],
"parameters": {
"jsCode": "// \ud83e\uddf9 INSTAGRAM VIDEO CONTENT CLEANER\n// Critical: Prevents 'JSON parameter needs to be valid JSON' errors\nlet content = $('\ud83d\udcca Content Database (Video)').item.json.instagra
Credentials you'll need
Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.
airtableTokenApigoogleDriveOAuth2ApihttpHeaderAuth
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
About this workflow
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Source: https://n8n.io/workflows/5943/ — 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.
Stop manually copy-pasting client data into Word templates. This workflow automates the entire invoicing process, handling complex line items, VAT calculations, PDF generation, and CRM syncing in unde
This workflow automatically saves Zoom meeting recordings to Google Drive and logs all important details into Airtable for easy tracking. Perfect for teams that want a searchable meeting archive. Zoom
This premium n8n workflow harnesses the power of DataForSEO's API combined with Airtable's relational database capabilities to transform your keyword research process, providing deeper insights for co
This workflow automates the entire lifecycle of a service-based client, combining four distinct business flows into a single view: Intake Leads: Receives a webhook from your form builder, validates th
It intelligently syncs confirmed sales orders from your Airtable base to QuickBooks, automatically creating new customers if they don't exist before generating a perfectly matched invoice. It then log