{
  "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
          }
        ]
      ]
    }
  }
}