AutomationFlowsMarketing & Ads › Automated TikTok Content Analyzer

Automated TikTok Content Analyzer

Original n8n title: Content Analyzer (tiktok)

Content Analyzer (Tiktok). Uses stickyNote, scheduleTrigger, sort, airtable. Scheduled trigger; 27 nodes.

Cron / scheduled trigger★★★★☆ complexity27 nodesAirtableHTTP RequestGoogle Drive
Marketing & Ads Trigger: Cron / scheduled Nodes: 27 Complexity: ★★★★☆ Added:

This workflow follows the Airtable → HTTP Request recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Content Analyzer (Tiktok)",
  "nodes": [
    {
      "parameters": {
        "content": "## Edit me \nUpdate API keys, tokens, prompts, and additional settings.",
        "height": 340,
        "color": 4
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -420,
        60
      ],
      "typeVersion": 1,
      "id": "faf2255a-c825-462d-b4dc-d8784ada7b70",
      "name": "Sticky Note1"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "daysInterval": 7
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -580,
        200
      ],
      "id": "19ac86b5-25ce-4429-9045-368b2fb3ca26",
      "name": "Schedule Trigger"
    },
    {
      "parameters": {
        "content": "Passing video to Gemini",
        "height": 340,
        "width": 1120,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1320,
        60
      ],
      "typeVersion": 1,
      "id": "f4b19612-18f3-48db-a813-b357b3530253",
      "name": "Sticky Note2"
    },
    {
      "parameters": {
        "content": "Updating database\n",
        "height": 340,
        "width": 1360,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -160,
        60
      ],
      "typeVersion": 1,
      "id": "ca7a9353-6424-4786-9e2a-290b6c6733ae",
      "name": "Sticky Note3"
    },
    {
      "parameters": {
        "content": "Analysis",
        "height": 340,
        "width": 840,
        "color": 7
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2480,
        60
      ],
      "typeVersion": 1,
      "id": "8bd8c059-c9d7-40ba-a28b-b5b54781f4d6",
      "name": "Sticky Note4"
    },
    {
      "parameters": {
        "sortFieldsUi": {
          "sortField": [
            {
              "fieldName": "views",
              "order": "descending"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.sort",
      "typeVersion": 1,
      "position": [
        300,
        200
      ],
      "id": "33a1f635-e7cb-4078-8424-42ac1c663f86",
      "name": "Sort1"
    },
    {
      "parameters": {
        "operation": "search",
        "base": {
          "__rl": true,
          "value": "appHq8rXQgnTUdh9Y",
          "mode": "list",
          "cachedResultName": "Content Research (TikTok)",
          "cachedResultUrl": "https://airtable.com/appHq8rXQgnTUdh9Y"
        },
        "table": {
          "__rl": true,
          "value": "tblxyZurkBnXa6S7z",
          "mode": "list",
          "cachedResultName": "Topics",
          "cachedResultUrl": "https://airtable.com/appHq8rXQgnTUdh9Y/tblxyZurkBnXa6S7z"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        -140,
        200
      ],
      "id": "a8b8c87d-367d-48f9-a830-30f2ceb453b6",
      "name": "Get Topics",
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "operation": "upsert",
        "base": {
          "__rl": true,
          "value": "appHq8rXQgnTUdh9Y",
          "mode": "list",
          "cachedResultName": "Content Research (TikTok)",
          "cachedResultUrl": "https://airtable.com/appHq8rXQgnTUdh9Y"
        },
        "table": {
          "__rl": true,
          "value": "tbln80uUyABnJ27hU",
          "mode": "list",
          "cachedResultName": "Reels",
          "cachedResultUrl": "https://airtable.com/appHq8rXQgnTUdh9Y/tbln80uUyABnJ27hU"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "reelId": "={{ $json.id }}",
            "videoViewCount": "={{ $json.views }}",
            "commentsCount": "={{ $json.comments }}",
            "timestamp": "={{ $json.uploadedAtFormatted.toDateTime().toLocaleString(DateTime.DATETIME_FULL) }}",
            "caption": "={{ $json.title }}",
            "hashtags": "={{ $json.hashtags.join() }}",
            "likesCount": "={{ $json.likes }}",
            "videoUrl": "={{ $json.video.url }}",
            "user": "={{ $json.channel.username }}"
          },
          "matchingColumns": [
            "reelId"
          ],
          "schema": [
            {
              "id": "id",
              "displayName": "id",
              "required": false,
              "defaultMatch": true,
              "display": true,
              "type": "string",
              "readOnly": true,
              "removed": true
            },
            {
              "id": "timestamp",
              "displayName": "timestamp",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "reelId",
              "displayName": "reelId",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "user",
              "displayName": "user",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "caption",
              "displayName": "caption",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "hashtags",
              "displayName": "hashtags",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "videoViewCount",
              "displayName": "videoViewCount",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "number",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "likesCount",
              "displayName": "likesCount",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "number",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "commentsCount",
              "displayName": "commentsCount",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "number",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "videoUrl",
              "displayName": "videoUrl",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "format",
              "displayName": "format",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "Tutorial",
                  "value": "Tutorial"
                },
                {
                  "name": "Review-Showcase",
                  "value": "Review-Showcase"
                },
                {
                  "name": "Challenge",
                  "value": "Challenge"
                },
                {
                  "name": "Behind-the-scenes",
                  "value": "Behind-the-scenes"
                },
                {
                  "name": "Reaction",
                  "value": "Reaction"
                },
                {
                  "name": "Vlog",
                  "value": "Vlog"
                },
                {
                  "name": "Before-After",
                  "value": "Before-After"
                },
                {
                  "name": "Q&A",
                  "value": "Q&A"
                },
                {
                  "name": "Unboxing or Hauls",
                  "value": "Unboxing or Hauls"
                },
                {
                  "name": "Skit",
                  "value": "Skit"
                },
                {
                  "name": "Collaboration",
                  "value": "Collaboration"
                },
                {
                  "name": "Other",
                  "value": "Other"
                },
                {
                  "name": "Giveaway",
                  "value": "Giveaway"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "hook",
              "displayName": "hook",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "visual hook",
              "displayName": "visual hook",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "analysis",
              "displayName": "analysis",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        740,
        200
      ],
      "id": "b65b460b-1f2b-4fe7-bbcb-0164105c02c4",
      "name": "Add/Update Tiktoks",
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "url": "={{ $json.fields.videoUrl }}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1400,
        120
      ],
      "id": "ee32024e-6669-41ca-9a6c-9175c41b4577",
      "name": "Download file from TikTok"
    },
    {
      "parameters": {
        "content": "**Scraper** \n\nhttps://apify.com/apidojo/tiktok-scraper\n\nYou can change dateRange to \"YESTERDAY\", \"THIS_MONTH\",\n\"THIS_WEEK\",\n\"LAST_THREE_MONTHS\", \"LAST_SIX_MONTHS\"\"ALL_TIME\"",
        "height": 220
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        680
      ],
      "typeVersion": 1,
      "id": "b14cf466-1aec-44bb-8b03-a18584a77d95",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "**Apify**\n\nCreate an Apify account\nhttps://apify.com\n\nCreate an Apify access token https://console.apify.com/settings/integrations\n",
        "height": 220
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        20,
        420
      ],
      "typeVersion": 1,
      "id": "b8063b60-cf5a-45f5-b2fb-4451c3a0dc96",
      "name": "Sticky Note5"
    },
    {
      "parameters": {
        "content": "**Gemini**\n\nCreate an API key for Gemini https://aistudio.google.com/app/apikey\n\nGoogle AI Studio\nhttps://aistudio.google.com/\n\n",
        "height": 220,
        "width": 280
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1820,
        420
      ],
      "typeVersion": 1,
      "id": "203b36ce-bf82-4f4d-9133-172c42cd155b",
      "name": "Sticky Note6"
    },
    {
      "parameters": {
        "content": "**Airtable**\n\n\nCopy the Airtable database and create an account https://airtable.com/appHq8rXQgnTUdh9Y/shrDl5A7Mv7UxWi2K \n*Click \u201cCopy Base\u201d to copy*\n\nAccess Token https://airtable.com/create/tokens\nand give it permission\n- data.records:read\n- data.records:write\n- schema.bases:read\n\n\nCreate Airtable Credential within n8n\n",
        "height": 360,
        "width": 260
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -280,
        420
      ],
      "typeVersion": 1,
      "id": "3f22d112-6bdf-41a0-a873-14236eb5c585",
      "name": "Sticky Note7"
    },
    {
      "parameters": {
        "operation": "download",
        "fileId": {
          "__rl": true,
          "value": "={{ $('Upload file').item.json.id }}",
          "mode": "id"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        2060,
        120
      ],
      "id": "8c97f54c-3b47-4bc5-8443-d218c4a5031c",
      "name": "Download file",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "={{ $json.fields.user }}+{{ $json.id }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "folderId": {
          "__rl": true,
          "value": "https://drive.google.com/drive/folders/10umZzSpcYo6l_lxUDoO5eAss76dyIhrj",
          "mode": "url"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.googleDrive",
      "typeVersion": 3,
      "position": [
        1620,
        120
      ],
      "id": "b2a71b73-4389-48de-a2f5-fafe2a01e49b",
      "name": "Upload file",
      "credentials": {
        "googleDriveOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://generativelanguage.googleapis.com/upload/v1beta/files",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "key",
              "value": "={{ $('Config').first().json.GeminiKey }}"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "X-Goog-Upload-Protocol",
              "value": "resumable"
            },
            {
              "name": "X-Goog-Upload-Command",
              "value": "start"
            },
            {
              "name": "X-Goog-Upload-Header-Content-Length",
              "value": "={{ $json.size }}"
            },
            {
              "name": "X-Goog-Upload-Header-Content-Type",
              "value": "={{ $json.mimeType }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n\"file\": {\n\"display_name\": \"{{ $json.name }}\"\n}\n}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        1840,
        120
      ],
      "id": "11f029b0-0f37-4806-854d-9531a318231b",
      "name": "Gemini: Set up upload"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "={{ $('Gemini: Set up upload').item.json.headers['x-goog-upload-url'] }}",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "key",
              "value": "={{ $('Config').first().json.GeminiKey }}"
            }
          ]
        },
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Content-Length",
              "value": "={{ $('Upload file').item.json.size }}"
            },
            {
              "name": "X-Goog-Upload-Offset",
              "value": "0"
            },
            {
              "name": "X-Goog-Upload-Command",
              "value": "upload, finalize"
            }
          ]
        },
        "sendBody": true,
        "contentType": "binaryData",
        "inputDataFieldName": "=data",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        2280,
        120
      ],
      "id": "0b7b8b19-5540-473e-8505-c982b0e25fef",
      "name": "Gemini: Upload file"
    },
    {
      "parameters": {
        "amount": 60
      },
      "type": "n8n-nodes-base.wait",
      "typeVersion": 1.1,
      "position": [
        2720,
        120
      ],
      "id": "eca1789c-4bea-459d-b026-d34af64022a6",
      "name": "Wait"
    },
    {
      "parameters": {
        "operation": "update",
        "base": {
          "__rl": true,
          "value": "appHq8rXQgnTUdh9Y",
          "mode": "list",
          "cachedResultName": "Content Research (TikTok)",
          "cachedResultUrl": "https://airtable.com/appHq8rXQgnTUdh9Y"
        },
        "table": {
          "__rl": true,
          "value": "tbln80uUyABnJ27hU",
          "mode": "list",
          "cachedResultName": "Reels",
          "cachedResultUrl": "https://airtable.com/appHq8rXQgnTUdh9Y/tbln80uUyABnJ27hU"
        },
        "columns": {
          "mappingMode": "defineBelow",
          "value": {
            "reelId": "={{ $('Get Tiktoks').item.json.id }}",
            "style": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].style }}",
            "tone": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].tone }}",
            "hook": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].hook }}",
            "visual hook": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].visualHook }}",
            "CTA": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].CTA }}",
            "analysis": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].analysis }}",
            "format": "={{ JSON.parse($json.candidates[0].content.parts[0].text)[0].category }}"
          },
          "matchingColumns": [
            "reelId"
          ],
          "schema": [
            {
              "id": "id",
              "displayName": "id",
              "required": false,
              "defaultMatch": true,
              "display": true,
              "type": "string",
              "readOnly": true,
              "removed": true
            },
            {
              "id": "timestamp",
              "displayName": "timestamp",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "reelId",
              "displayName": "reelId",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "user",
              "displayName": "user",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "caption",
              "displayName": "caption",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "hashtags",
              "displayName": "hashtags",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "videoViewCount",
              "displayName": "videoViewCount",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "number",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "likesCount",
              "displayName": "likesCount",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "number",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "commentsCount",
              "displayName": "commentsCount",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "number",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "videoUrl",
              "displayName": "videoUrl",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": true
            },
            {
              "id": "format",
              "displayName": "format",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "Tutorial",
                  "value": "Tutorial"
                },
                {
                  "name": "Review-Showcase",
                  "value": "Review-Showcase"
                },
                {
                  "name": "Challenge",
                  "value": "Challenge"
                },
                {
                  "name": "Behind-the-scenes",
                  "value": "Behind-the-scenes"
                },
                {
                  "name": "Reaction",
                  "value": "Reaction"
                },
                {
                  "name": "Vlog",
                  "value": "Vlog"
                },
                {
                  "name": "Before-After",
                  "value": "Before-After"
                },
                {
                  "name": "Q&A",
                  "value": "Q&A"
                },
                {
                  "name": "Unboxing-or-Hauls",
                  "value": "Unboxing-or-Hauls"
                },
                {
                  "name": "Skit",
                  "value": "Skit"
                },
                {
                  "name": "Collaboration",
                  "value": "Collaboration"
                },
                {
                  "name": "Other",
                  "value": "Other"
                },
                {
                  "name": "Giveaway",
                  "value": "Giveaway"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "style",
              "displayName": "style",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "User-generated",
                  "value": "User-generated"
                },
                {
                  "name": "Professionally-produced",
                  "value": "Professionally-produced"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "tone",
              "displayName": "tone",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "options",
              "options": [
                {
                  "name": "High-Energy",
                  "value": "High-Energy"
                },
                {
                  "name": "Funny-Playful",
                  "value": "Funny-Playful"
                },
                {
                  "name": "Informative-Educational",
                  "value": "Informative-Educational"
                },
                {
                  "name": "Emotional-Vulnerable",
                  "value": "Emotional-Vulnerable"
                },
                {
                  "name": "Cool-Confident",
                  "value": "Cool-Confident"
                },
                {
                  "name": "Rant-Frustrated",
                  "value": "Rant-Frustrated"
                },
                {
                  "name": "Romantic-Sentimental",
                  "value": "Romantic-Sentimental"
                },
                {
                  "name": "Inspirational-Motivational",
                  "value": "Inspirational-Motivational"
                },
                {
                  "name": "Calming-Soothing",
                  "value": "Calming-Soothing"
                }
              ],
              "readOnly": false,
              "removed": false
            },
            {
              "id": "hook",
              "displayName": "hook",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "visual hook",
              "displayName": "visual hook",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "CTA",
              "displayName": "CTA",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            },
            {
              "id": "analysis",
              "displayName": "analysis",
              "required": false,
              "defaultMatch": false,
              "canBeUsedToMatch": true,
              "display": true,
              "type": "string",
              "readOnly": false,
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {}
      },
      "type": "n8n-nodes-base.airtable",
      "typeVersion": 2.1,
      "position": [
        3160,
        200
      ],
      "id": "9a3668b1-7e92-48fc-9396-1ac385d19e03",
      "name": "Add analysis",
      "credentials": {
        "airtableTokenApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://generativelanguage.googleapis.com/v1beta/models/gemini-1.5-pro:generateContent",
        "sendQuery": true,
        "queryParameters": {
          "parameters": [
            {
              "name": "key",
              "value": "={{ $('Config').first().json.GeminiKey }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n    \"contents\": [\n        {\n            \"parts\": [\n                {\n                    \"text\": \"{{$('Config').first().json.analysisPrompt}}\"\n                },\n                {\n                    \"file_data\": {\n                        \"mime_type\": \"{{ $('Save Values').item.json.mimeType }}\",\n                        \"file_uri\": \"{{ $('Save Values').item.json.geminiFileUrl }}\"\n                    }\n                }\n            ]\n\n        }\n    ],\n    \"generationConfig\": {\n        \"response_mime_type\": \"application/json\",\n        \"response_schema\": {\n            \"type\": \"ARRAY\",\n            \"items\": {\n                \"type\": \"OBJECT\",\n                \"properties\": {\n                    \"analysis\": {\n                        \"type\": \"STRING\"\n                    },\n                    \"category\": {\n                        \"type\": \"STRING\"\n                    },\n                    \"hook\": {\n                        \"type\": \"STRING\"\n                    },\n                    \"visualHook\": {\n                        \"type\": \"STRING\"\n                    },\n                    \"style\": {\n                        \"type\": \"STRING\"\n                    },\n                    \"CTA\": {\n                        \"type\": \"STRING\"\n                    },\n                    \"tone\": {\n                        \"type\": \"STRING\"\n                    }\n                },\n                \"required\": [\n                    \"analysis\",\n                    \"category\",\n                    \"hook\",\n                    \"visualHook\",\n                    \"style\",\n                    \"CTA\",\n                    \"tone\"\n                ]\n            }\n        }\n    }\n}",
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        2940,
        120
      ],
      "id": "b4f1979e-7bee-4891-b535-e65fcf328c5f",
      "name": "Gemini: Analyze",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "170c7186-644d-47f9-9b48-bd4d10a47c40",
              "name": "geminiFileUrl",
              "value": "={{ $json.file.uri }}",
              "type": "string"
            },
            {
              "id": "2064aedb-aee8-48fa-8e37-448816afa46f",
              "name": "mimeType",
              "value": "={{ $json.file.mimeType }}",
              "type": "string"
            },
            {
              "id": "50feff58-2b22-4dd7-8588-ca65b0065cb0",
              "name": "googleDriveUrl",
              "value": "={{ $('Upload file').first().json.webViewLink }}",
              "type": "string"
            },
            {
              "id": "d99d5d13-a23b-471b-87d5-ec86d89be4be",
              "name": "name",
              "value": "={{ $json.file.name }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        2500,
        120
      ],
      "id": "09025028-d559-4fa4-be99-7c437760e17e",
      "name": "Save Values"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "n8n-nodes-base.splitInBatches",
      "typeVersion": 3,
      "position": [
        1180,
        195
      ],
      "id": "39d4d569-039e-4ec2-9150-c91702a6da00",
      "name": "Loop Over Items"
    },
    {
      "parameters": {
        "maxItems": "={{ $('Config').first().json.getTop }}"
      },
      "type": "n8n-nodes-base.limit",
      "typeVersion": 1,
      "position": [
        520,
        195
      ],
      "id": "e74bde21-7a9b-4c02-bf2b-d67082bd1166",
      "name": "Limit: Top N"
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://api.apify.com/v2/acts/5K30i8aFccKNF5ICs/run-sync-get-dataset-items",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Accept",
              "value": "application/json"
            },
            {
              "name": "Authorization",
              "value": "=Bearer {{ $('Config').item.json.ApifyKey }}"
            }
          ]
        },
        "sendBody": true,
        "specifyBody": "json",
        "jsonBody": "={\n  \"customMapFunction\": \"(object) => { return {...object} }\",\n  \"dateRange\": \"THIS_WEEK\",\n  \"keywords\": [\n    \"{{ $json.Name }}\"\n  ],\n  \"location\": \"US\",\n  \"maxItems\": {{ $('Config').item.json.videosCount }}\n} ",
        "options": {
          "redirect": {
            "redirect": {
              "maxRedirects": "=21"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.2,
      "position": [
        80,
        195
      ],
      "id": "cd922d8e-ccf3-4beb-92a3-13a21a11afda",
      "name": "Get Tiktoks"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "e6b56ab7-ab20-4ffd-8b57-cdd2915e1dcb",
              "name": "ApifyKey",
              "value": "",
              "type": "string"
            },
            {
              "id": "98276af2-18a4-458b-acdd-65f4a23200d7",
              "name": "GeminiKey",
              "value": "",
              "type": "string"
            },
            {
              "id": "9d842c98-dbc6-4862-ae59-12775dd4f6bb",
              "name": "getTop",
              "value": 15,
              "type": "number"
            },
            {
              "id": "8062cef5-55cd-4a6e-a2d7-be4c74d6956d",
              "name": "videosCount",
              "value": 5,
              "type": "number"
            },
            {
              "id": "fcde1437-dfd5-4c66-bd89-2f0934f8233e",
              "name": "analysisPrompt",
              "value": "Provide an analysis of the TikTok video based solely on the following criteria: 1. Determine which single category best fits the video based on its content and potential connection to the video\u2019s success. Choose only one from: Tutorial, Review-Showcase, Giveaway, Challenge, Behind-the-scenes, Reaction, Vlog, Before-After, Q&A, Unboxing-or-Hauls, Skit, Collaboration. If none apply, select Other. 2. Determine Hook and Visual Hook and why it grabs the viewer's attention. 3 Determine content type. Choose only from User-generated or Professionally-produced. 4. Determine presence and effectiveness of any CTA (e.g., \u201cfollow,\u201d \u201ccomment,\u201d \u201cshare\u201d) 5. Given the video's popularity, explain in one sentence what makes it effective. 6. Categorize the video by tone. Select a single category best fits the video based on its content and potential connection to the video\u2019s success. Choose only one from: High-Energy, Funny-Playful, Informative-Educational, Cool-Confident, Calming-Soothing, Rant-Frustrated, Romantic-Sentimental, Inspirational-Motivational.",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -360,
        195
      ],
      "id": "0a46c8fd-6373-4a57-989e-4988ac8886bb",
      "name": "Config"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "886ec1ce-a8cc-4b06-8c0c-b3b53bb2c448",
              "leftValue": "={{ $json.fields.analysis }}",
              "rightValue": "",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.filter",
      "typeVersion": 2.2,
      "position": [
        960,
        195
      ],
      "id": "dfc5f80c-1e0c-472c-a18d-bb37c9466702",
      "name": "Analyzed yet?"
    },
    {
      "parameters": {
        "content": "**Google Drive**\n\nCreate new Credentials\nhttps://docs.n8n.io/integrations/builtin/credentials/google/oauth-single-service/?utm_source=n8n_app&utm_medium=credential_settings&utm_campaign=create_new_credentials_modal",
        "height": 220
      },
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1540,
        420
      ],
      "typeVersion": 1,
      "id": "77fc096e-7c36-4526-a261-e5b02730f30a",
      "name": "Sticky Note8"
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sort1": {
      "main": [
        [
          {
            "node": "Limit: Top N",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Topics": {
      "main": [
        [
          {
            "node": "Get Tiktoks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add/Update Tiktoks": {
      "main": [
        [
          {
            "node": "Analyzed yet?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file from TikTok": {
      "main": [
        [
          {
            "node": "Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download file": {
      "main": [
        [
          {
            "node": "Gemini: Upload file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Upload file": {
      "main": [
        [
          {
            "node": "Gemini: Set up upload",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini: Set up upload": {
      "main": [
        [
          {
            "node": "Download file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini: Upload file": {
      "main": [
        [
          {
            "node": "Save Values",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Gemini: Analyze",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add analysis": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Gemini: Analyze": {
      "main": [
        [
          {
            "node": "Add analysis",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save Values": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Over Items": {
      "main": [
        [],
        [
          {
            "node": "Download file from TikTok",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Limit: Top N": {
      "main": [
        [
          {
            "node": "Add/Update Tiktoks",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Tiktoks": {
      "main": [
        [
          {
            "node": "Sort1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Config": {
      "main": [
        [
          {
            "node": "Get Topics",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Analyzed yet?": {
      "main": [
        [
          {
            "node": "Loop Over Items",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "b57fbdf8-2d50-40a7-b065-d43b418c061c",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "q0mve9w52mQjz8SI",
  "tags": []
}

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

How this works

This workflow automates the analysis of TikTok content by pulling video data from Airtable, sorting it by relevance, and storing insights in Google Drive for easy review, saving content creators hours of manual organisation each week. It's ideal for social media managers or marketers tracking TikTok trends and performance metrics without technical expertise. The key step involves fetching and updating TikTok records in Airtable via scheduled triggers, ensuring your content library stays current and actionable.

Use this workflow when you need regular, hands-off monitoring of TikTok topics and uploads, such as weekly performance reports for a brand's channel. Avoid it for real-time analysis or non-Airtable data sources, where simpler manual tools might suffice. Common variations include adding HTTP requests for direct TikTok API pulls or integrating email notifications for urgent trend alerts.

About this workflow

Content Analyzer (Tiktok). Uses stickyNote, scheduleTrigger, sort, airtable. Scheduled trigger; 27 nodes.

Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →

More Marketing & Ads workflows → · Browse all categories →

Related workflows

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

Marketing & Ads

Viral TikToks. Uses httpRequest, airtable, scheduleTrigger, splitInBatches. Scheduled trigger; 25 nodes.

HTTP Request, Airtable
Marketing & Ads

This workflow is a comprehensive solution for digital marketers, performance agencies, and e-commerce brands looking to scale their creative testing process on Meta Ads efficiently. It eliminates the

Google Drive, HTTP Request, Google Sheets
Marketing & Ads

GoBot - Scheduled Content Posting. Uses scheduleTrigger, airtable, splitInBatches, httpRequest. Scheduled trigger; 6 nodes.

Airtable, HTTP Request
Marketing & Ads

GoBot - Daily Analytics Collection. Uses httpRequest, airtable. Scheduled trigger; 7 nodes.

HTTP Request, Airtable
Marketing & Ads

Workflow A — WhatsApp Lead Intake & Qualification. Uses postgres, httpRequest, errorTrigger. Scheduled trigger; 67 nodes.

Postgres, HTTP Request, Error Trigger