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 →
{
"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.
httpBearerAuthhttpCustomAuth
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 →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Relatórios aos Laboratórios. Uses httpRequest, gmail, formTrigger. Scheduled trigger; 54 nodes.
YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.
14310 Send Overdue Invoice Payment Reminders With Ifirma Gmail Postgrid And Slack. Uses httpRequest, stopAndError, slack, gmail. Scheduled trigger; 53 nodes.
Addendo — Blog Automatico Don Jacinto Nahual. Uses httpRequest, redis, github, gmail. Scheduled trigger; 51 nodes.
Addendo — Blog Automatico Don Jacinto Nahual. Uses httpRequest, redis, github, gmail. Scheduled trigger; 51 nodes.