AutomationFlowsEmail & Gmail › E-commerce - Pull Bestseller of the Week and Generate Video with Google Veo 3

E-commerce - Pull Bestseller of the Week and Generate Video with Google Veo 3

E-commerce - Pull Bestseller of the Week and Generate Video with Google VEO 3. Uses httpRequest, gmail. Scheduled trigger; 21 nodes.

Cron / scheduled trigger★★★★☆ complexity21 nodesHTTP RequestGmail
Email & Gmail Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ Added:

This workflow follows the Gmail → 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
{
  "id": "xxjvJIcWqHC1t9FU",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "E-commerce - Pull Bestseller of the Week and Generate Video with Google VEO 3",
  "tags": [
    {
      "id": "6OaASw2bkjvGJYfM",
      "name": "E-Commerce",
      "createdAt": "2025-11-15T18:16:11.694Z",
      "updatedAt": "2025-11-15T18:16:11.694Z"
    },
    {
      "id": "r2J8HDdF1EXu4FtQ",
      "name": "Google-VEO-3",
      "createdAt": "2025-11-15T18:14:57.032Z",
      "updatedAt": "2025-11-15T18:14:57.032Z"
    },
    {
      "id": "rapjVlcQ0SoPnEXg",
      "name": "AI-Video",
      "createdAt": "2025-11-15T18:14:48.492Z",
      "updatedAt": "2025-11-15T18:14:48.492Z"
    }
  ],
  "nodes": [
    {
      "id": "1754418e-842b-4abc-bdb5-346a7af25a82",
      "name": "Every week on monday morning",
      "type": "n8n-nodes-base.scheduleTrigger",
      "disabled": true,
      "position": [
        0,
        80
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 21
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "49e015ee-eac4-4e19-91de-2bec48e34fc9",
      "name": "Test Trigger while building the workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        -224
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "8835ff62-b7eb-46a7-acac-88feca4c8b33",
      "name": "Get weekly bestseller from Algolia",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        352,
        -224
      ],
      "parameters": {
        "url": "https://ALGOLIA_APP_ID.algolia.net/1/indexes/unicorns_prod_products/query",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "genericCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "params",
              "value": "hitsPerPage=1"
            }
          ]
        },
        "genericAuthType": "httpCustomAuth"
      },
      "credentials": {
        "httpBearerAuth": {
          "name": "<your credential>"
        },
        "httpCustomAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "8dc00a09-331a-434c-9050-9cc843b81f89",
      "name": "If no video for that product",
      "type": "n8n-nodes-base.if",
      "position": [
        640,
        -224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "5dc716d8-c032-4a12-a2cd-33b22ab437f3",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.hits[0].hasVideo }}",
              "rightValue": "false"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "35a556b2-3af7-43c9-9120-a32d3abd54d2",
      "name": "Image URL is present",
      "type": "n8n-nodes-base.if",
      "position": [
        944,
        -224
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e70943ac-a10b-403e-a4bb-47e7421f8a46",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.hits[0].images[0] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fa0524f1-1568-440e-82e9-49280016d638",
      "name": "Check image availability",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        1296,
        -240
      ],
      "parameters": {
        "url": "={{ $json.hits[0].images[0] }}",
        "options": {
          "response": {
            "response": {
              "fullResponse": true
            }
          }
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "728688c5-4245-41e9-bbba-6ed6f8ca6874",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        960,
        112
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "d0c253d1-ff1e-4539-8c8b-6812334ca79e",
      "name": "Tell admin that bestseller has no image",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1376,
        96
      ],
      "parameters": {
        "sendTo": "admin@example.com",
        "message": "=Shop - Best seller has no image: {{ $json.hits[0].sku }}",
        "options": {},
        "subject": "=Shop - Best seller has no image: {{ $json.hits[0].sku }}",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "cdce35f8-8e1f-46de-a2b7-6dc4104de63d",
      "name": "Tell admin that bestseller has broken image",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1808,
        112
      ],
      "parameters": {
        "sendTo": "admin@example.com",
        "message": "=Shop - Best seller has broken image: {{ $json.hits[0].sku }}",
        "options": {},
        "subject": "=Shop - Best seller has broken image: {{ $json.hits[0].sku }}",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "c46a408f-93ad-4945-a22a-91bbb23bdd97",
      "name": "Image is present and valid",
      "type": "n8n-nodes-base.if",
      "position": [
        1600,
        -256
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3a9d468b-1c32-4c2e-ab48-0fd754c4307a",
              "operator": {
                "type": "number",
                "operation": "equals"
              },
              "leftValue": "={{ $json.statusCode }}",
              "rightValue": 200
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2d29e29f-5533-4220-a6a5-34997510fadd",
      "name": "Convert image to base64 for VEO 3",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        2144,
        -272
      ],
      "parameters": {
        "options": {},
        "operation": "binaryToPropery"
      },
      "typeVersion": 1.1
    },
    {
      "id": "df040539-5d2a-4ee8-8fc2-5ddb7c9916c5",
      "name": "Generate video with Google VEO 3",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2400,
        -272
      ],
      "parameters": {
        "url": "https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT-ID-GOOGLE-CLOUD/locations/us-central1/publishers/google/models/veo-3.0-generate-001:predictLongRunning",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"instances\": [\n    {\n      \"prompt\": \"A short cinematic product video shot in a studio. A product rests motionless on a flat surface. The camera moves slowly in a smooth dolly orbit around it to reveal multiple angles over about 6 seconds. Use soft white studio lighting, a neutral background, and shallow depth of field for a realistic and professional look. The framing should be centered and medium close-up, with gentle camera motion like a slider or gimbal shot.\",\n      \"image\": {\n        \"bytesBase64Encoded\": \"{{ $json.data }}\",\n        \"mimeType\": \"image/jpeg\"\n      }\n    }\n  ],\n  \"parameters\": {\n    \"aspectRatio\": \"9:16\",\n    \"durationSeconds\": 6,\n    \"sampleCount\": 1,\n    \"resizeMode\": \"pad\",\n    \"storageUri\": \"gs://GOOGLE_STORAGE_BUCKET_NAME/outputs/\"\n  }\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleCloudNaturalLanguageOAuth2Api"
      },
      "typeVersion": 4.3
    },
    {
      "id": "5c8cbeec-7be3-4b01-b6d4-ad76bad0fe5e",
      "name": "Wait for video generation",
      "type": "n8n-nodes-base.wait",
      "position": [
        2608,
        -272
      ],
      "parameters": {
        "amount": 60
      },
      "typeVersion": 1.1
    },
    {
      "id": "b3b64d35-a5d8-4c86-9bac-aef17c4134e4",
      "name": "Checking if we're done",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2816,
        -272
      ],
      "parameters": {
        "url": "https://us-central1-aiplatform.googleapis.com/v1/projects/PROJECT-ID-GOOGLE-CLOUD/locations/us-central1/publishers/google/models/veo-3.0-generate-001:fetchPredictOperation",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"operationName\": \"{{ $json.name }}\"\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleCloudNaturalLanguageOAuth2Api"
      },
      "typeVersion": 4.3
    },
    {
      "id": "b3f352b1-d2c5-445f-86ed-9ca29130ef82",
      "name": "Finished ?",
      "type": "n8n-nodes-base.if",
      "position": [
        3024,
        -272
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bc2d5054-b343-44ba-88f7-ab4295b0aa2a",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.done }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2f324e9c-68e3-44a1-9579-6bd7f7a031ff",
      "name": "Wait more",
      "type": "n8n-nodes-base.wait",
      "position": [
        3232,
        -160
      ],
      "parameters": {
        "amount": 30
      },
      "typeVersion": 1.1
    },
    {
      "id": "6e7407d9-e840-42e4-8598-226977c71845",
      "name": "Get video name and storage bucket",
      "type": "n8n-nodes-base.set",
      "position": [
        3232,
        -368
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "a2bfc7e1-588f-47f8-87c4-12c20e799f08",
              "name": "=bucketName",
              "type": "string",
              "value": "={{$json.response.videos[0].gcsUri.match(/^gs:\\/\\/([^/]+)\\/(.+)$/)[1]}}"
            },
            {
              "id": "6b1e96f4-a731-4c37-a44c-8260cb1fc5e6",
              "name": "objectName",
              "type": "string",
              "value": "={{ $json.response.videos[0].gcsUri.match(/^gs:\\/\\/([^/]+)\\/(.+)$/)[2]}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d7140d66-ca5e-4be6-a545-bbc039445339",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        3520,
        -368
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1
    },
    {
      "id": "64c06571-b93b-49bb-bb80-41f62bd1954e",
      "name": "Downloading the MP4 file",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3712,
        -368
      ],
      "parameters": {
        "url": "=https://storage.googleapis.com/{{ $json.data[0].bucketName }}/{{ $json.data[0].objectName }}",
        "options": {},
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "googleCloudStorageOAuth2Api"
      },
      "typeVersion": 4.3
    },
    {
      "id": "c9573d6d-d087-49ac-b9c6-c5efd24e4d8c",
      "name": "Drop video in Supabase Bucket",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        3920,
        -368
      ],
      "parameters": {
        "url": "=https://YOUR_SUPABASE_PROJECT.supabase.co/storage/v1/object/unicorns-images/{{ $('Get weekly bestseller from Algolia').item.json.hits[0].objectID }}.mp4",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "binaryData",
        "inputDataFieldName": "data",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "supabaseApi"
      },
      "typeVersion": 4.3
    },
    {
      "id": "1e7eedb0-8104-4e78-a80b-3f21f52bc59d",
      "name": "Index in Algolia",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        4128,
        -368
      ],
      "parameters": {
        "url": "https://ALGOLIA_APP_ID-dsn.algolia.net/1/indexes/unicorns_prod_products/batch",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"requests\": [\n    {\n      \"action\": \"partialUpdateObject\",\n      \"body\": {\n        \"objectID\": \"{{ $('Get weekly bestseller from Algolia').item.json.hits[0].objectID }}\",\n        \"videos\": [\n          \"https://YOUR_SUPABASE_PROJECT.supabase.co/storage/v1/object/public/{{ $json.Key }}\"\n        ],\n        \"hasVideo\": true\n      }\n    }\n  ]\n} ",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpCustomAuth"
      },
      "typeVersion": 4.3
    }
  ],
  "connections": {
    "Aggregate": {
      "main": [
        [
          {
            "node": "Downloading the MP4 file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait more": {
      "main": [
        [
          {
            "node": "Checking if we're done",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Finished ?": {
      "main": [
        [
          {
            "node": "Get video name and storage bucket",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait more",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Image URL is present": {
      "main": [
        [
          {
            "node": "Check image availability",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Tell admin that bestseller has no image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Checking if we're done": {
      "main": [
        [
          {
            "node": "Finished ?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check image availability": {
      "main": [
        [
          {
            "node": "Image is present and valid",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Tell admin that bestseller has broken image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Downloading the MP4 file": {
      "main": [
        [
          {
            "node": "Drop video in Supabase Bucket",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait for video generation": {
      "main": [
        [
          {
            "node": "Checking if we're done",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Image is present and valid": {
      "main": [
        [
          {
            "node": "Convert image to base64 for VEO 3",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Tell admin that bestseller has broken image",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If no video for that product": {
      "main": [
        [
          {
            "node": "Image URL is present",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Drop video in Supabase Bucket": {
      "main": [
        [
          {
            "node": "Index in Algolia",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Generate video with Google VEO 3": {
      "main": [
        [
          {
            "node": "Wait for video generation",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert image to base64 for VEO 3": {
      "main": [
        [
          {
            "node": "Generate video with Google VEO 3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get video name and storage bucket": {
      "main": [
        [
          {
            "node": "Aggregate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get weekly bestseller from Algolia": {
      "main": [
        [
          {
            "node": "If no video for that product",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Test Trigger while building the workflow": {
      "main": [
        [
          {
            "node": "Get weekly bestseller from Algolia",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

E-commerce - Pull Bestseller of the Week and Generate Video with Google VEO 3. Uses httpRequest, gmail. Scheduled trigger; 21 nodes.

Source: https://github.com/Voyagerroc-Automation/giant-automation-library/blob/main/workflows/01-video-generation/ecommerce-bestseller-veo3-pipeline.json — original creator credit. Request a take-down →

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

Relatórios aos Laboratórios. Uses httpRequest, gmail, formTrigger. Scheduled trigger; 54 nodes.

HTTP Request, Gmail, Form Trigger
Email & Gmail

YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.

Gmail, Google Drive, Google Sheets +1
Email & Gmail

14310 Send Overdue Invoice Payment Reminders With Ifirma Gmail Postgrid And Slack. Uses httpRequest, stopAndError, slack, gmail. Scheduled trigger; 53 nodes.

HTTP Request, Stop And Error, Slack +1
Email & Gmail

Addendo — Blog Automatico Don Jacinto Nahual. Uses httpRequest, redis, github, gmail. Scheduled trigger; 51 nodes.

HTTP Request, Redis, GitHub +1
Email & Gmail

Addendo — Blog Automatico Don Jacinto Nahual. Uses httpRequest, redis, github, gmail. Scheduled trigger; 51 nodes.

HTTP Request, Redis, GitHub +1