AutomationFlowsSocial Media › Automate Instagram Stories Publishing From Google Sheets with Meta Graph API

Automate Instagram Stories Publishing From Google Sheets with Meta Graph API

ByiMan @iman on n8n.io

This workflow automates posting Instagram Stories directly from a list of video URLs in a Google Sheet. Simply add a video link to the sheet, and this template will schedule and post it for you. It's designed to be a "set it and forget it" solution for your content strategy.

Event trigger★★★★☆ complexity19 nodesGoogle SheetsHTTP RequestFacebook Graph Api
Social Media Trigger: Event Nodes: 19 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #8785 — we link there as the canonical source.

This workflow follows the Facebookgraphapi → Google Sheets 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 →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "ca8d9fd3-1e78-4e59-8038-c3e240e1a933",
      "name": "\ud83d\udcd6 SETUP GUIDE",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -16,
        -112
      ],
      "parameters": {
        "width": 736,
        "height": 384,
        "content": "\ud83c\udfac **Instagram Story Automation Template**\n\n**What this does:** Automatically posts Instagram Stories from videos listed in a Google Sheet.\n\n**Quick Setup (5 minutes):**\n1\ufe0f\u20e3 Configure the \u2699\ufe0f Config node with your Instagram Business ID and Sheet details\n2\ufe0f\u20e3 Connect your Google Sheets and Facebook Graph API credentials\nYou can download my template here:\nhttps://imanetworks.ch/wp-content/uploads/2025/09/Instagram-Videos-Template.xlsx\n\n3\ufe0f\u20e3 Add video URLs to your Google Sheet\n4\ufe0f\u20e3 Test with Manual Trigger, then enable Schedule\n\n**For Non-Technical Users:**\n\u2022 You only need to edit the \u2699\ufe0f Config node once\n\u2022 After setup, just add videos to your Google Sheet\n\u2022 The workflow handles everything automatically\n\n**Need Help?** Check the troubleshooting section below!"
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "id": "2bc10b0a-49c6-438b-be8d-39dcecc210bc",
      "name": "\u2699\ufe0f Configuration Hub",
      "type": "n8n-nodes-base.set",
      "notes": "\ud83d\udd27 **SETUP REQUIRED** - Replace these values:\n\n\u2022 **IG_BUSINESS_ID**: Your Instagram Business Account ID\n  \u2192 Find in Facebook Business Manager > Instagram Accounts\n  \u2192 It's a long number (e.g., 17841450311185426)\n\n\u2022 **GRAPH_VERSION**: Facebook API version (usually v21.0 or newer)\n  \u2192 Check https://developers.facebook.com/docs/graph-api\n\n\u2022 **SHEET_DOC_ID**: Your Google Sheet ID from the URL\n  \u2192 Copy from: docs.google.com/spreadsheets/d/[THIS_PART]/edit\n\n\u2022 **SHEET_TAB_NAME**: The exact name of your sheet tab\n  \u2192 Default: \"Instagram Videos\" (case-sensitive)\n\n\u26a0\ufe0f **Important**: Only change these values once during setup!",
      "position": [
        368,
        352
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "cfg-1",
              "name": "IG_BUSINESS_ID",
              "type": "string",
              "value": "Your Instagram ID"
            },
            {
              "id": "cfg-2",
              "name": "GRAPH_VERSION",
              "type": "string",
              "value": "v23.0"
            },
            {
              "id": "cfg-3",
              "name": "SHEET_DOC_ID",
              "type": "string",
              "value": "Google Sheet ID (you can see it in the url of your sheet)"
            },
            {
              "id": "cfg-4",
              "name": "SHEET_TAB_NAME",
              "type": "string",
              "value": "Instagram Videos"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "9df8e039-b164-45e7-9555-58d8435e6c55",
      "name": "\ud83d\ude80 Manual Start",
      "type": "n8n-nodes-base.manualTrigger",
      "notes": "\ud83c\udfaf **FOR TESTING**\n\nClick the \u25b6\ufe0f button to test your workflow immediately.\n\n**When to use:**\n\u2022 First-time setup testing\n\u2022 Checking if credentials work\n\u2022 Testing new videos before scheduling\n\n**Non-technical tip**: Always test manually before enabling the schedule!",
      "position": [
        0,
        288
      ],
      "parameters": {},
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "5f866e09-81ce-474f-965d-905f0bf7aae5",
      "name": "\u23f0 Auto Schedule",
      "type": "n8n-nodes-base.scheduleTrigger",
      "notes": "\ud83d\udd50 **AUTOMATIC POSTING**\n\nCurrently set to run daily at 8:30 PM.\n\n**To change the time:**\n1. Click this node\n2. Adjust 'triggerAtHour' (0-23, where 20 = 8 PM)\n3. Adjust 'triggerAtMinute' (0-59)\n\n**Examples:**\n\u2022 9:00 AM = Hour: 9, Minute: 0\n\u2022 2:30 PM = Hour: 14, Minute: 30\n\u2022 11:45 PM = Hour: 23, Minute: 45\n\n**Tip**: Choose times when your audience is most active!",
      "position": [
        0,
        496
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 20,
              "triggerAtMinute": 30
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 1.2
    },
    {
      "id": "047a3a06-0dc3-4ab1-bdc9-7a39ab2c9c24",
      "name": "\ud83d\udcca Sheet Requirements",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        -112
      ],
      "parameters": {
        "width": 480,
        "height": 384,
        "content": "\ud83d\udccb **Google Sheet Format Requirements**\n\n**Required Columns:**\n\u2022 **Path** \u2192 Direct video URL (must be publicly accessible)\n\u2022 **Posted** \u2192 Leave empty for new videos\n\n**Video Requirements:**\n\u2022 Format: MP4\n\u2022 Max duration: 60 seconds\n\u2022 Aspect ratio: 9:16 (vertical) recommended\n\u2022 Max file size: 4GB\n\u2022 URL must not require login/authentication\n\n**Example Row:**\n| Path | Posted |\n|------|--------|\n| https://example.com/video.mp4 | |\n\n**After posting, 'Posted' will show 'true'**"
      },
      "notesInFlow": false,
      "typeVersion": 1
    },
    {
      "id": "fa49cbfe-4746-4bad-acb7-f3db282bf84b",
      "name": "\ud83d\udcca Fetch Videos from Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "\ud83d\udce5 **CREDENTIAL SETUP REQUIRED**\n\n**What it does:** Reads all videos from your Google Sheet\n\n**Setup Steps:**\n1. Click the 'Credential for Google Sheets' dropdown\n2. Select 'Create New Credential'\n3. Choose 'Google Sheets OAuth2 API'\n4. Click 'Connect my account' and sign in\n5. Grant permissions to access your sheets\n\n**Troubleshooting:**\n\u2022 Error 403: Check sheet sharing permissions\n\u2022 'Sheet not found': Verify SHEET_TAB_NAME in Config\n\u2022 No data: Ensure sheet has headers 'Path' and 'Posted'",
      "position": [
        800,
        448
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "mode": "name",
          "value": "={{ $json.SHEET_TAB_NAME }}"
        },
        "documentId": {
          "mode": "list",
          "value": "={{ $json.SHEET_DOC_ID }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.5,
      "alwaysOutputData": true
    },
    {
      "id": "e98b5339-cd2a-454f-980d-6585c79a67af",
      "name": "\ud83c\udfb2 Randomize Order",
      "type": "n8n-nodes-base.sort",
      "notes": "\ud83d\udd00 **SMART SELECTION**\n\n**What it does:** Shuffles your video list randomly\n\n**Why this helps:**\n\u2022 Prevents always posting the first video\n\u2022 Creates variety in your content schedule\n\u2022 Ensures fair rotation of all videos\n\n**No setup needed** - this works automatically!\n\n**Note:** The workflow will still skip videos already marked as 'Posted'",
      "position": [
        1040,
        448
      ],
      "parameters": {
        "type": "random"
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "7f427af0-2f29-43c8-9fbf-59e8e0fe60fc",
      "name": "\ud83d\udd04 Process Each Video",
      "type": "n8n-nodes-base.splitInBatches",
      "notes": "\ud83d\udd0d **VIDEO PROCESSOR**\n\n**What it does:** Checks each video one by one to find unposted content\n\n**How it works:**\n1. Takes the shuffled list\n2. Examines each video's 'Posted' status\n3. Finds the first video that hasn't been posted\n4. Processes only that video\n\n**No configuration needed** - this is automatic!\n\n**Result:** Only posts one new video per run",
      "position": [
        1280,
        448
      ],
      "parameters": {
        "options": {}
      },
      "notesInFlow": true,
      "typeVersion": 3
    },
    {
      "id": "46174ca9-894c-47f2-9a3c-1a2176bcb8b0",
      "name": "\u2753 Already Posted Check",
      "type": "n8n-nodes-base.if",
      "notes": "\ud83d\udea6 **SMART FILTER**\n\n**What it does:** Checks if this video was already posted\n\n**Logic:**\n\u2022 **If Posted = 'true'** \u2192 Skip this video, check next one\n\u2022 **If Posted is empty/false** \u2192 Continue to post this video\n\n**Why this matters:**\n\u2022 Prevents duplicate posts\n\u2022 Automatically tracks what's been shared\n\u2022 Saves you from manual tracking\n\n**No setup needed** - works automatically!",
      "position": [
        1568,
        448
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cond-posted",
              "operator": {
                "type": "string",
                "operation": "notContains"
              },
              "leftValue": "={{ $json.posted_story }}",
              "rightValue": "true"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.2
    },
    {
      "id": "c446ed83-b373-4887-b639-f30bb4a50721",
      "name": "\ud83c\udfaf Prepare Video Data",
      "type": "n8n-nodes-base.set",
      "notes": "\ud83d\udccb **DATA PREPARATION**\n\n**What it does:** Organizes the video information for Instagram\n\n**Variables created:**\n\u2022 **instagram_business_id**: Your Instagram account ID\n\u2022 **video_url**: The video file location\n\u2022 **api_version**: Facebook API version to use\n\n**Why this step:** Makes the data clean and ready for Instagram's API\n\n**No configuration needed** - uses values from your Config node automatically!",
      "position": [
        1808,
        320
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a1",
              "name": "instagram_business_id",
              "type": "string",
              "value": "={{ $json.IG_BUSINESS_ID || $('\u2699\ufe0f Configuration Hub').item.json.IG_BUSINESS_ID }}"
            },
            {
              "id": "a2",
              "name": "video_url",
              "type": "string",
              "value": "={{ $json.source_url }}"
            },
            {
              "id": "a3",
              "name": "api_version",
              "type": "string",
              "value": "={{ $json.GRAPH_VERSION || $('\u2699\ufe0f Configuration Hub').item.json.GRAPH_VERSION }}"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 3.4
    },
    {
      "id": "7b86b176-296f-4e7b-8525-a0f42c53f8f8",
      "name": "\ud83d\udcf1 Video Requirements",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1664,
        -112
      ],
      "parameters": {
        "width": 400,
        "height": 376,
        "content": "\ud83d\udcf1 **Instagram Story Requirements**\n\n**Video Specs:**\n\u2022 Format: MP4, MOV\n\u2022 Duration: 1-60 seconds\n\u2022 Resolution: 1080x1920 (9:16 ratio)\n\u2022 Max file size: 4GB\n\u2022 Frame rate: 30 fps max\n\n**URL Requirements:**\n\u2022 Must be publicly accessible\n\u2022 No login/password required\n\u2022 HTTPS recommended\n\u2022 Direct link to video file\n\n**Common Issues:**\n\u2022 Google Drive/Dropbox share links won't work\n\u2022 Password-protected videos will fail\n\u2022 Very large files may timeout\n\n**Tip:** Test your URL in a browser first!"
      },
      "typeVersion": 1
    },
    {
      "id": "7182482a-dc7a-477f-ad28-8fbee137029c",
      "name": "\ud83d\udce4 Create Story Container",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "\ud83c\udfd7\ufe0f **CREDENTIAL SETUP REQUIRED**\n\n**What it does:** Creates an Instagram Story container (not published yet)\n\n**Setup Steps:**\n1. Click 'Credential for Facebook Graph API'\n2. Select 'Create New Credential'\n3. Enter your Facebook App credentials:\n   \u2022 App ID (from Facebook Developers)\n   \u2022 App Secret (from Facebook Developers)\n4. Grant Instagram permissions\n\n**What happens:** Instagram downloads and processes your video\n\n**Result:** Returns a container ID for the next step",
      "position": [
        2080,
        368
      ],
      "parameters": {
        "url": "={{ 'https://graph.facebook.com/' + $('\u2699\ufe0f Configuration Hub').item.json.GRAPH_VERSION + '/' + $('\ud83c\udfaf Prepare Video Data').item.json['instagram_business_id'] + '/media' }}",
        "method": "POST",
        "options": {},
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "media_type",
              "value": "STORIES"
            },
            {
              "name": "video_url",
              "value": "={{ $json['video_url'] }}"
            }
          ]
        },
        "nodeCredentialType": "facebookGraphApi"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "5063827b-044c-42c4-be40-81cb50f1b643",
      "name": "\ud83d\udd0d Check Processing Status",
      "type": "n8n-nodes-base.httpRequest",
      "notes": "\u23f3 **STATUS MONITOR**\n\n**What it does:** Checks if Instagram finished processing your video\n\n**Possible statuses:**\n\u2022 **IN_PROGRESS**: Still processing (wait more)\n\u2022 **FINISHED**: Ready to publish \u2705\n\u2022 **ERROR**: Something went wrong \u274c\n\n**Why this step:** Instagram needs time to encode/validate your video\n\n**No configuration needed** - uses the same Facebook credentials as previous step",
      "position": [
        2368,
        368
      ],
      "parameters": {
        "url": "={{ 'https://graph.facebook.com/' + $('\u2699\ufe0f Configuration Hub').item.json.GRAPH_VERSION + '/' + $('\ud83d\udce4 Create Story Container').item.json.id }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true,
              "responseFormat": "json"
            }
          }
        },
        "sendQuery": true,
        "authentication": "predefinedCredentialType",
        "queryParameters": {
          "parameters": [
            {
              "name": "fields",
              "value": "status_code,status"
            }
          ]
        },
        "nodeCredentialType": "facebookGraphApi"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.2
    },
    {
      "id": "3520c4de-e2dc-4739-8ed5-5c6f15e805cd",
      "name": "\u2705 Ready to Publish?",
      "type": "n8n-nodes-base.if",
      "notes": "\ud83d\udea6 **PUBLISH GATE**\n\n**What it checks:** Is the video ready for publishing?\n\n**Two paths:**\n\u2022 **TRUE (status = FINISHED)** \u2192 Proceed to publish\n\u2022 **FALSE (still processing)** \u2192 Wait 30 seconds and check again\n\n**Why this matters:**\n\u2022 Publishing too early = failure\n\u2022 This ensures your video is properly processed\n\n**Automatic loop:** Will keep checking until ready or timeout",
      "position": [
        2640,
        368
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cond-finished",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.body.status_code }}",
              "rightValue": "FINISHED"
            }
          ]
        }
      },
      "notesInFlow": true,
      "typeVersion": 2.2
    },
    {
      "id": "5b05c0c2-34cf-413d-bad9-87a35bfd5935",
      "name": "\u23f0 Wait 30 Seconds",
      "type": "n8n-nodes-base.wait",
      "notes": "\u23f8\ufe0f **PATIENCE IS KEY**\n\n**What it does:** Waits 30 seconds before checking status again\n\n**Why 30 seconds:**\n\u2022 Gives Instagram time to process\n\u2022 Prevents overwhelming their servers\n\u2022 Most videos process within 1-3 minutes\n\n**Adjustable:** You can change the wait time if needed\n\u2022 Smaller videos: 15-20 seconds\n\u2022 Larger videos: 45-60 seconds\n\n**Note:** The workflow will loop until processing is complete",
      "position": [
        2688,
        896
      ],
      "parameters": {
        "amount": 30
      },
      "notesInFlow": true,
      "typeVersion": 1.1
    },
    {
      "id": "1dc888c6-26a9-48a2-b7d4-47a65a264ea2",
      "name": "\ud83c\udf89 Publish to Instagram",
      "type": "n8n-nodes-base.facebookGraphApi",
      "notes": "\ud83d\ude80 **THE MOMENT OF TRUTH**\n\n**What it does:** Publishes your video as an Instagram Story\n\n**This step:**\n\u2022 Takes the processed video container\n\u2022 Makes it live on your Instagram account\n\u2022 Your followers can now see the story\n\n**Success indicators:**\n\u2022 Returns a media ID\n\u2022 No error messages\n\u2022 Story appears on your Instagram profile\n\n**Uses the same Facebook credentials** as previous steps",
      "position": [
        2928,
        368
      ],
      "parameters": {
        "edge": "media_publish",
        "node": "={{ $('\ud83c\udfaf Prepare Video Data').item.json['instagram_business_id'] }}",
        "options": {
          "queryParameters": {
            "parameter": [
              {
                "name": "creation_id",
                "value": "={{ $('\ud83d\udce4 Create Story Container').item.json.id }}"
              }
            ]
          }
        },
        "graphApiVersion": "={{ $('\u2699\ufe0f Configuration Hub').item.json.GRAPH_VERSION }}",
        "httpRequestMethod": "POST"
      },
      "credentials": {
        "facebookGraphApi": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 1
    },
    {
      "id": "08e727a9-baa5-4028-8d5d-c1d62b7b0d40",
      "name": "\u270f\ufe0f Mark as Posted",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "\ud83d\udcdd **RECORD KEEPING**\n\n**What it does:** Updates your Google Sheet to mark this video as posted\n\n**How it works:**\n1. Finds the row with the matching video URL\n2. Sets the 'Posted' column to 'true'\n3. Prevents the same video from being posted again\n\n**Why this matters:**\n\u2022 Automatic tracking\n\u2022 No duplicate posts\n\u2022 Clear record of what's been shared\n\n**Uses the same Google Sheets credentials** as the fetch step",
      "position": [
        3200,
        368
      ],
      "parameters": {
        "columns": {
          "value": {
            "source_url": "={{ $('\ud83c\udfaf Prepare Video Data').item.json.video_url }}",
            "posted_story": "\"true\""
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "media_type",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "media_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "mime_type",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "mime_type",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "source_url",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "source_url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "posted_reels",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "posted_reels",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "posted_story",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "posted_story",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "source_url"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "mode": "name",
          "value": "={{ $('\u2699\ufe0f Configuration Hub').item.json.SHEET_TAB_NAME }}"
        },
        "documentId": {
          "mode": "list",
          "value": "={{ $('\u2699\ufe0f Configuration Hub').item.json.SHEET_DOC_ID }}"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "notesInFlow": true,
      "typeVersion": 4.5
    },
    {
      "id": "9b340387-74b9-4245-a20c-7a5f4074f4c2",
      "name": "\ud83d\udd27 Troubleshooting",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2896,
        528
      ],
      "parameters": {
        "width": 500,
        "height": 560,
        "content": "\ud83d\udea8 **Troubleshooting Guide**\n\n**Common Issues:**\n\n**1. Workflow stops at processing:**\n\u2022 Video URL not accessible publicly\n\u2022 Video doesn't meet Instagram requirements\n\u2022 Check video format (MP4 recommended)\n\n**2. 'Sheet not found' error:**\n\u2022 Verify SHEET_DOC_ID in Config\n\u2022 Check SHEET_TAB_NAME spelling (case-sensitive)\n\u2022 Ensure sheet is accessible to your Google account\n\n**3. Facebook API errors:**\n\u2022 Verify Instagram Business Account connection\n\u2022 Check app permissions in Facebook Developers\n\u2022 Ensure account has Instagram Content Publishing permission\n\n**4. Posted column not updating:**\n\u2022 Confirm Path values are unique in sheet\n\u2022 Check Google Sheets permissions\n\u2022 Verify credential connections\n\n**Need more help?** Check n8n community forums or documentation."
      },
      "typeVersion": 1
    },
    {
      "id": "9dab79de-3039-4330-94fe-d7fc02bfb5a4",
      "name": "\u2705 Setup Checklist",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        240,
        560
      ],
      "parameters": {
        "width": 440,
        "height": 536,
        "content": "\ud83c\udf93 **Setup Checklist for Non-Technical Users**\n\n**Before you start:**\n\u2610 Instagram Business Account (not personal)\n\u2610 Facebook Business Manager access\n\u2610 Google account with Sheets access\n\u2610 Videos in MP4 format, publicly hosted\n\n**Required Credentials:**\n\u2610 Facebook Developer App (free)\n\u2610 Google Sheets OAuth connection\n\u2610 Instagram Business Account linked to Facebook\n\n**One-time setup:**\n\u2610 Replace values in \u2699\ufe0f Configuration Hub\n\u2610 Connect Facebook Graph API credential\n\u2610 Connect Google Sheets credential\n\u2610 Test with Manual Trigger\n\u2610 Enable Schedule Trigger\n\n**Ongoing usage:**\n\u2610 Add video URLs to Google Sheet\n\u2610 Leave 'Posted' column empty for new videos\n\u2610 Check Instagram for posted stories\n\n**That's it! The workflow handles everything else automatically.**"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "\u23f0 Auto Schedule": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Configuration Hub",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\ude80 Manual Start": {
      "main": [
        [
          {
            "node": "\u2699\ufe0f Configuration Hub",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u23f0 Wait 30 Seconds": {
      "main": [
        [
          {
            "node": "\ud83d\udd0d Check Processing Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83c\udfb2 Randomize Order": {
      "main": [
        [
          {
            "node": "\ud83d\udd04 Process Each Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2705 Ready to Publish?": {
      "main": [
        [
          {
            "node": "\ud83c\udf89 Publish to Instagram",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\u23f0 Wait 30 Seconds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83c\udfaf Prepare Video Data": {
      "main": [
        [
          {
            "node": "\ud83d\udce4 Create Story Container",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd04 Process Each Video": {
      "main": [
        [],
        [
          {
            "node": "\u2753 Already Posted Check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2699\ufe0f Configuration Hub": {
      "main": [
        [
          {
            "node": "\ud83d\udcca Fetch Videos from Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\u2753 Already Posted Check": {
      "main": [
        [
          {
            "node": "\ud83c\udfaf Prepare Video Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "\ud83d\udd04 Process Each Video",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83c\udf89 Publish to Instagram": {
      "main": [
        [
          {
            "node": "\u270f\ufe0f Mark as Posted",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udce4 Create Story Container": {
      "main": [
        [
          {
            "node": "\ud83d\udd0d Check Processing Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udcca Fetch Videos from Sheet": {
      "main": [
        [
          {
            "node": "\ud83c\udfb2 Randomize Order",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "\ud83d\udd0d Check Processing Status": {
      "main": [
        [
          {
            "node": "\u2705 Ready to Publish?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

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.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates posting Instagram Stories directly from a list of video URLs in a Google Sheet. Simply add a video link to the sheet, and this template will schedule and post it for you. It's designed to be a "set it and forget it" solution for your content strategy.

Source: https://n8n.io/workflows/8785/ — original creator credit. Request a take-down →

More Social Media workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

Social Media

This workflow is ideal for individuals, marketers, agencies, and brands who want to effortlessly automate the entire blogging and social media process—from idea generation to promotion. Its primary go

Execute Workflow Trigger, Notion, OpenAI Chat +13
Social Media

This workflow is built for creators, solopreneurs, SaaS founders, and agencies looking to automate their social media content process from idea to publication. It combines the power of OpenAI, Google

OpenAI Chat, Tool Workflow, Agent +15
Social Media

A production-ready n8n workflow that generates AI avatar videos from images and text using VEED Fabric 1.0, with flexible multi-platform publishing capabilities. Process any number of videos: Sequenti

Google Sheets, HTTP Request, OpenAI +6
Social Media

AI Social Media Promoter – Automated Blog Sharing Workflow This workflow is built for bloggers, creators, and marketing teams who want to automatically promote new blog content across Instagram, Faceb

Output Parser Structured, Rss Feed Read Trigger, OpenAI Chat +6
Social Media

This AI-powered workflow streamlines your social media posting process, transforming hours of manual caption writing, image uploading, and scheduling into a fully automated system. You define the topi

Google Sheets, Twitter, Facebook Graph Api +3