{
  "id": "ihRr3D93RtAF6AWh",
  "name": "Auto Repurpose YouTube Shorts to TikTok & Instagram Using Blotato",
  "tags": [],
  "nodes": [
    {
      "id": "a85e7b88-c23e-4e07-84ff-b352fcd8fa30",
      "name": "Upload Media to Blotato",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "position": [
        1040,
        816
      ],
      "parameters": {
        "resource": "media",
        "useBinaryData": true
      },
      "credentials": {},
      "typeVersion": 2
    },
    {
      "id": "5552dc9c-627d-42c4-8026-4db9bd1b0184",
      "name": "Blotato Post to Instagram",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "onError": "continueErrorOutput",
      "maxTries": 2,
      "position": [
        1264,
        624
      ],
      "parameters": {
        "options": {},
        "accountId": {},
        "postContentText": "={{ $('Loop').item.json.title }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {},
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "f25c9eeb-a434-4c07-9a81-0c1557fa746c",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        720
      ],
      "parameters": {
        "color": 7,
        "width": 896,
        "height": 288,
        "content": "## Download Video from Youtube with yt-dlp"
      },
      "typeVersion": 1
    },
    {
      "id": "3733e675-c480-4965-aecc-6a4f70c83937",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        608
      ],
      "parameters": {
        "color": 7,
        "width": 960,
        "height": 400,
        "content": "## Upload File to Blotato then Post to Tiktok & Instagram"
      },
      "typeVersion": 1
    },
    {
      "id": "57b77a18-2a46-4abf-9ffc-f65cfe95f4d7",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1456,
        592
      ],
      "parameters": {
        "color": 7,
        "width": 656,
        "height": 400,
        "content": "## Cleanup Local File & Update Status in Sheets"
      },
      "typeVersion": 1
    },
    {
      "id": "0589eb87-2b7e-4bde-aca7-44ae839d3905",
      "name": "Remove Local File",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        1488,
        816
      ],
      "parameters": {
        "command": "=rm {{ $('Get File Path Location').item.json.stdout }}"
      },
      "typeVersion": 1
    },
    {
      "id": "4e32f1af-fb80-4ff8-8bef-a95a4ca3f116",
      "name": "Get Youtube Video List",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -416,
        256
      ],
      "parameters": {
        "url": "=https://www.googleapis.com/youtube/v3/search?key={{$env.YOUTUBE_API_KEY}}&part=snippet&channelId={{$env.YOUTUBE_CHANNEL_ID}}&type=video&order=date&maxResults=10",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "80825182-4a37-4b76-be18-cdea6317329e",
      "name": "Insert List to Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        512,
        272
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "caption",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "lastupdate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "lastupdate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "autoMapInputData",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {},
        "documentId": {}
      },
      "credentials": {},
      "typeVersion": 4.7
    },
    {
      "id": "a2c13a4e-172f-4060-8c62-ee2e8638e212",
      "name": "Filter by Status Not Processed",
      "type": "n8n-nodes-base.if",
      "position": [
        -240,
        832
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "0f2e6ff6-dd09-41a4-b4a2-93b92e8478fd",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.status }}",
              "rightValue": "not-processed"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "9cfefa3f-0b5e-4f0b-9cca-8eca1feb526d",
      "name": "Read Binary Video",
      "type": "n8n-nodes-base.readWriteFile",
      "position": [
        864,
        816
      ],
      "parameters": {
        "options": {},
        "fileSelector": "={{ $json.stdout }}"
      },
      "typeVersion": 1
    },
    {
      "id": "a7592674-faad-40f2-90df-cf337eca5f34",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -192,
        256
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "items"
      },
      "typeVersion": 1
    },
    {
      "id": "c8deb3de-f82d-4c87-95f6-0e5eb22d496a",
      "name": "Loop",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -16,
        816
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "be444feb-9b9a-4b68-8247-ae72cb94eee2",
      "name": "Get File Path Location",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        448,
        832
      ],
      "parameters": {
        "command": "=find yt -type f -name \"{{$node['Loop'].json.id}}*\""
      },
      "typeVersion": 1
    },
    {
      "id": "19f090d9-79bd-4177-89bc-3d13d61101fb",
      "name": "Blotato Post to Tiktok",
      "type": "@blotato/n8n-nodes-blotato.blotato",
      "onError": "continueErrorOutput",
      "maxTries": 2,
      "position": [
        1264,
        816
      ],
      "parameters": {
        "options": {},
        "platform": "tiktok",
        "accountId": {},
        "postContentText": "={{ $('Loop').item.json.title }}",
        "postContentMediaUrls": "={{ $json.url }}"
      },
      "credentials": {},
      "retryOnFail": true,
      "typeVersion": 2
    },
    {
      "id": "504c8bc2-e71d-40df-863e-9f1546e75190",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -496,
        144
      ],
      "parameters": {
        "color": 7,
        "width": 1184,
        "height": 352,
        "content": "## Grab Youtube Video List, Store to Google Spreadsheet"
      },
      "typeVersion": 1
    },
    {
      "id": "8959c88a-415f-4e1a-93a5-5748f5770a33",
      "name": "Read from Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -464,
        832
      ],
      "parameters": {
        "options": {},
        "sheetName": {},
        "documentId": {}
      },
      "credentials": {},
      "typeVersion": 4.7
    },
    {
      "id": "80cf8072-3dfd-4605-9860-82a08a08ae6e",
      "name": "Update Sheets Error",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1760,
        640
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "={{ $json.id }}",
            "status": "={{ $json.status }}",
            "lastupdate": "={{$now}}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "caption",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "lastupdate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "lastupdate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {},
        "documentId": {}
      },
      "credentials": {},
      "typeVersion": 4.7
    },
    {
      "id": "ad84cc0c-f739-44e0-b650-d29821d64fe6",
      "name": "Update Sheets Success",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1936,
        816
      ],
      "parameters": {
        "columns": {
          "value": {
            "id": "={{ $json.id }}",
            "status": "={{ $json.status }}",
            "lastupdate": "={{$now}}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "id",
              "defaultMatch": true,
              "canBeUsedToMatch": true
            },
            {
              "id": "url",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "url",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "title",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "title",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "caption",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "caption",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "status",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "status",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "lastupdate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "lastupdate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "id"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {},
        "documentId": {}
      },
      "credentials": {},
      "typeVersion": 4.7
    },
    {
      "id": "e332709b-7ebf-4701-b5a4-a5e22600cdae",
      "name": "Data Status for Update Sheets Error",
      "type": "n8n-nodes-base.set",
      "position": [
        1536,
        640
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "727367a2-0c71-41f7-aafe-928c75ea4f0d",
              "name": "status",
              "type": "string",
              "value": "error"
            },
            {
              "id": "c326cabc-72f0-47ce-9d89-5464ef8ec82c",
              "name": "id",
              "type": "string",
              "value": "={{ $('Loop').item.json.id }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "e111df25-220d-4db5-9993-ba6b5b258a62",
      "name": "Data Status for Update Sheets Success",
      "type": "n8n-nodes-base.set",
      "position": [
        1712,
        816
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "727367a2-0c71-41f7-aafe-928c75ea4f0d",
              "name": "status",
              "type": "string",
              "value": "done-uploaded"
            },
            {
              "id": "c326cabc-72f0-47ce-9d89-5464ef8ec82c",
              "name": "id",
              "type": "string",
              "value": "={{ $('Loop').item.json.id }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "0779717c-e517-4580-b15b-63857f69c5f9",
      "name": "Schedule Trigger Upload",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -672,
        832
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2c9ee2e6-925b-4d6f-9135-2492c5f2c925",
      "name": "Schedule Trigger Get Youtube Video List",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -640,
        256
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "hours",
              "hoursInterval": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "38e86320-0176-451f-8ee3-871f5df1dd7d",
      "name": "Loop List",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        32,
        256
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "26302186-0a18-4046-a0cf-02fe9d4c1227",
      "name": "Data for Store Video List to Sheets",
      "type": "n8n-nodes-base.set",
      "position": [
        272,
        272
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "94dda3f9-dc84-43c4-a42e-e1e226844f73",
              "name": "id",
              "type": "string",
              "value": "={{ $json.id.videoId }}"
            },
            {
              "id": "9659fe0e-cd09-474d-a4b5-b77a71645f37",
              "name": "url",
              "type": "string",
              "value": "=https://youtube.com/shorts/{{ $json.id.videoId }}"
            },
            {
              "id": "8a940917-563c-4682-aa4d-419fe03fe554",
              "name": "title",
              "type": "string",
              "value": "={{ $json.snippet.title }}"
            },
            {
              "id": "24635a0d-29d0-4b5f-abe3-394e635c738d",
              "name": "caption",
              "type": "string",
              "value": "={{ $json.snippet.description }}"
            },
            {
              "id": "3ebd7c3a-22b8-4c47-8cfd-30970ac5ae34",
              "name": "status",
              "type": "string",
              "value": "not-processed"
            },
            {
              "id": "f84ed1f2-65c6-4b94-b1c1-96a4d3698756",
              "name": "lastupdate",
              "type": "string",
              "value": "={{$now}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "b1644c5d-67a2-4acf-aa1c-fef6d020df3e",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1264,
        144
      ],
      "parameters": {
        "width": 496,
        "height": 704,
        "content": "This workflow automatically mirrors your YouTube to TikTok and Instagram, so you don\u2019t have to manually download and re-upload your content across platforms.\n\nIt fetches new videos from your YouTube channel, checks whether they have already been processed, downloads them locally using yt-dlp, and then uploads or schedules them via Blotato. Once successfully published, the workflow logs everything into Google Sheets and removes the local file to keep your storage clean.\n\nThis template is designed for creators, agencies, and social media managers who want a simple and reliable way to repurpose short-form content across multiple platforms.\n\n### \u2699\ufe0f How It Works\n1. The workflow runs on a schedule (e.g., every 8 hours).\n2. It retrieves the latest videos from your YouTube channel.\n3. It checks Google Sheets to avoid duplicate uploads by Video ID.\n4. New Shorts are downloaded using yt-dlp.\n5. The video is uploaded (or scheduled) via Blotato to TikTok and Instagram.\n6. The workflow logs the upload results.\n7. The local file is deleted after a successful upload.\n\n### \ud83d\udee0 Requirements\n- A YouTube Data API key\n- A Google Sheets connection\n- Blotato API credentials\n- Self-hosted n8n instance (required for yt-dlp execution)\n- yt-dlp installed on your server\n- Make 'youtube' directory for Download location"
      },
      "typeVersion": 1
    },
    {
      "id": "f53a4325-c20f-4278-a407-0b6165b50a35",
      "name": "Download YouTube Shorts via yt-dlp",
      "type": "n8n-nodes-base.executeCommand",
      "position": [
        224,
        832
      ],
      "parameters": {
        "command": "=yt-dlp -f best -o \"youtube/{{ $json.id }}.%(ext)s\" \"https://youtube.com/shorts/{{ $json.id }}\""
      },
      "typeVersion": 1
    },
    {
      "id": "00c3e438-d0f5-49de-b4f0-cd0c52700de2",
      "name": "Check File Video Exist",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        832
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "a8048e87-2fc1-419c-99a8-4209b767cd81",
              "operator": {
                "type": "string",
                "operation": "exists",
                "singleValue": true
              },
              "leftValue": "={{ $json.stdout }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "50aa908b-4b42-40d4-a005-46c371fc0fe7",
  "connections": {
    "Loop": {
      "main": [
        [],
        [
          {
            "node": "Download YouTube Shorts via yt-dlp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop List": {
      "main": [
        [],
        [
          {
            "node": "Data for Store Video List to Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Loop List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read from Sheets": {
      "main": [
        [
          {
            "node": "Filter by Status Not Processed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Read Binary Video": {
      "main": [
        [
          {
            "node": "Upload Media to Blotato",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Remove Local File": {
      "main": [
        [
          {
            "node": "Data Status for Update Sheets Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert List to Sheets": {
      "main": [
        [
          {
            "node": "Loop List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Blotato Post to Tiktok": {
      "main": [
        [
          {
            "node": "Remove Local File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Data Status for Update Sheets Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check File Video Exist": {
      "main": [
        [
          {
            "node": "Read Binary Video",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Loop",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get File Path Location": {
      "main": [
        [
          {
            "node": "Check File Video Exist",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Youtube Video List": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger Upload": {
      "main": [
        [
          {
            "node": "Read from Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload Media to Blotato": {
      "main": [
        [
          {
            "node": "Blotato Post to Tiktok",
            "type": "main",
            "index": 0
          },
          {
            "node": "Blotato Post to Instagram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Blotato Post to Instagram": {
      "main": [
        [
          {
            "node": "Remove Local File",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Data Status for Update Sheets Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter by Status Not Processed": {
      "main": [
        [
          {
            "node": "Loop",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Download YouTube Shorts via yt-dlp": {
      "main": [
        [
          {
            "node": "Get File Path Location",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Status for Update Sheets Error": {
      "main": [
        [
          {
            "node": "Update Sheets Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data for Store Video List to Sheets": {
      "main": [
        [
          {
            "node": "Insert List to Sheets",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Data Status for Update Sheets Success": {
      "main": [
        [
          {
            "node": "Update Sheets Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger Get Youtube Video List": {
      "main": [
        [
          {
            "node": "Get Youtube Video List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}