internet money (nano banana)
Shared 11/30/2025
344 views
Visual Workflow
JSON Code
{
"id": "bTbKaGatdauayF6G",
"meta": {
"instanceId": "162f93b0084d31a899385ee0965356c60b41fe5853dcd87efd89b524b9e9fd79",
"templateCredsSetupCompleted": true
},
"name": "internet money (nano banana)",
"tags": [],
"nodes": [
{
"id": "d46f19a5-cf22-4a2f-8092-2bf75c51e7d3",
"name": "Sticky Note4",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1392,
-1008
],
"parameters": {
"color": 7,
"width": 896,
"height": 656,
"content": "## Image Prompt Automation\n\nThis first automation is here to auto-generate a clean Nano Banana Pro prompt for every shot marked as “Not started” in your Notion database.\n\nFor an example of how your Notion database should be setup, see mine [here](https://www.notion.so/2b755c8ec0668011a144dc5461cc7d35?v=2b755c8ec06681dd9a79000c12e3e8c3&source=copy_link)\n\n1: Pull shots \n2: Analyze target photo \n3: Combine analysis + character/outfit refs \n4: Generate 100–400 char prompt using [OpenRouter](https://openrouter.ai/)\n5: write it back to Notion + mark shot “Photo TBD.”\n\nOutcome: Each shot gets a tight, consistent prompt that preserves environment/style/accessories while swapping the character + outfit 1:1\n\nGet your Google Gemini API Key [here](https://ai.google.dev/gemini-api/docs/gemini-3?thinking=high)"
},
"typeVersion": 1
},
{
"id": "52348160-6e7f-44c3-a03a-d9a8d7a5d996",
"name": "When clicking ‘Execute workflow’",
"type": "n8n-nodes-base.manualTrigger",
"position": [
-224,
-816
],
"parameters": {},
"typeVersion": 1
},
{
"id": "2fd2651a-0306-48b7-b59e-6a11fcd852ff",
"name": "Add Reference Photos",
"type": "n8n-nodes-base.set",
"position": [
656,
-816
],
"parameters": {
"options": {},
"assignments": {
"assignments": [
{
"id": "97ee3d1e-5545-4c69-ae22-0bd520d35b43",
"name": "Target Photo",
"type": "string",
"value": "={{ $json.property_target_photo }}"
},
{
"id": "42d234b0-9c74-471c-9fa0-eff5206a9aaf",
"name": "Character Photo Description",
"type": "string",
"value": "={{ $json.property_character_description }}"
},
{
"id": "ad98745a-b722-4522-9451-2ae30ce0e50e",
"name": "Outfit/Product ",
"type": "string",
"value": "={{ $json.property_outfit_description }}"
}
]
}
},
"typeVersion": 3.4
},
{
"id": "e767aad6-d6a3-4189-837c-cc09a33375de",
"name": "Loop Over Items",
"type": "n8n-nodes-base.splitInBatches",
"position": [
416,
-816
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "7ac4360e-9dd1-4eca-8568-320bebfbb97c",
"name": "Shot Selection",
"type": "n8n-nodes-base.notion",
"position": [
-32,
-816
],
"parameters": {
"filters": {
"conditions": [
{
"key": "Status|status",
"condition": "equals",
"statusValue": "Not started"
}
]
},
"options": {},
"resource": "databasePage",
"matchType": "allFilters",
"operation": "getAll",
"databaseId": {
"__rl": true,
"mode": "list",
"value": "2b755c8e-c066-8011-a144-dc5461cc7d35",
"cachedResultUrl": "https://www.notion.so/2b755c8ec0668011a144dc5461cc7d35",
"cachedResultName": "internet money"
},
"filterType": "manual"
},
"credentials": {
"notionApi": {
"id": "8W7fGjc0h1cJbiGi",
"name": "Notion account"
}
},
"typeVersion": 2.2
},
{
"id": "3eb80c92-0806-4a89-a5cb-ac4877289dd4",
"name": "Analyze Target Image",
"type": "@n8n/n8n-nodes-langchain.googleGemini",
"position": [
896,
-816
],
"parameters": {
"text": "=Analyze only the:\n1. subject in the image \n2. their complete outfit and wardrobe\n3. any visual effect",
"modelId": {
"__rl": true,
"mode": "list",
"value": "models/gemini-3-pro-preview",
"cachedResultName": "models/gemini-3-pro-preview"
},
"options": {},
"resource": "image",
"imageUrls": "=https://drive.google.com/uc?export=download&id={{ $json['Target Photo'].match(/\\/d\\/([A-Za-z0-9_-]+)\\//)?.[1]}}",
"operation": "analyze"
},
"credentials": {
"googlePalmApi": {
"id": "FKzVkH7E7Xyb31j0",
"name": "Google Gemini(PaLM) Api account"
}
},
"typeVersion": 1
},
{
"id": "a2ed4b9a-2a9b-4af2-b3c2-e72b11a232a2",
"name": "Image Prompt Gen",
"type": "@n8n/n8n-nodes-langchain.chainLlm",
"position": [
1440,
-816
],
"parameters": {
"text": "=Target Image Analysis: {{ $json.content.parts[0].text }}\n\nCharacter Reference Photo Description: {{ $('Add Reference Photos').item.json['Character Photo Description'] }}\n\nOutfit Produuct Photo Description: {{ $('Add Reference Photos').item.json['Outfit/Product '] }}",
"batching": {},
"messages": {
"messageValues": [
{
"message": "=Your job is simple:\n\ncreate an image prompt between 100-400 characters that simply explains to Nano Banana Pro to replace the subject in the target photo (analysis will be in the user prompt) with my desired character in the desired outfit.\n\nThe goal is to keep the enviornment, image style and ACCESSORIES the exact same and only do a 1:1 switch of the character and the clothes they're wearing. Both the character and the outfit will be attached an image so there's no need for a long description of them.\n\nThere is a quick description of both the character reference image and the outfit reference image included in the user message.\n\n\nHere is an example of an ideal, simplistic output:\n\n\"replace the man in the denim jacket and cornrow brainds in the reference photo with the handsome bearded man in the headshot wearing the arrival jeans and arrival t shirt in the same pose and environment. keep the same stylized motion blur visual effect, dark angular sunglassess and stud earrings.\"\n\n\n****\nINCLUDE NO QUOTES IN YOUR OUTPUT. ONLY THE TEXT."
}
]
},
"promptType": "define"
},
"typeVersion": 1.7
},
{
"id": "7996cf06-6640-49a8-a7f8-df70e83c989f",
"name": "Updated Shot",
"type": "n8n-nodes-base.notion",
"position": [
1776,
-816
],
"parameters": {
"pageId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Shot Selection').item.json.id }}"
},
"options": {},
"resource": "databasePage",
"operation": "update",
"propertiesUi": {
"propertyValues": [
{
"key": "Image Prompt|title",
"title": "={{ $json.text }}"
},
{
"key": "Status|status",
"statusValue": "Photo TBD"
}
]
}
},
"credentials": {
"notionApi": {
"id": "8W7fGjc0h1cJbiGi",
"name": "Notion account"
}
},
"typeVersion": 2.2
},
{
"id": "e4658502-a9d5-48af-ab02-064a7d8add67",
"name": "Nano Banana Pro V2",
"type": "n8n-nodes-base.httpRequest",
"position": [
816,
16
],
"parameters": {
"url": "https://queue.fal.run/fal-ai/nano-banana-pro/edit",
"method": "POST",
"options": {},
"jsonBody": "={\n \"prompt\": \"{{ $json.property_image_prompt }}\",\n \"num_images\": \"2\",\n \"aspect_ratio\": \"9:16\",\n \"output_format\": \"png\",\n \"image_urls\": [{{ $json.combined_drive_export_urls }}\n ],\n \"resolution\": \"2K\"\n}",
"sendBody": true,
"sendHeaders": true,
"specifyBody": "json",
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Key ac2b2faf-9eb6-46f9-aa87-b7ad8193116f:2f72412affb9c540d90182368b53d2e8"
}
]
}
},
"typeVersion": 4.2
},
{
"id": "6cf17168-b3e2-4c23-987d-bb6f45b13ddd",
"name": "Shot List",
"type": "n8n-nodes-base.notion",
"position": [
-48,
16
],
"parameters": {
"filters": {
"conditions": [
{
"key": "Status|status",
"condition": "equals",
"statusValue": "Photo TBD"
}
]
},
"options": {},
"resource": "databasePage",
"matchType": "allFilters",
"operation": "getAll",
"databaseId": {
"__rl": true,
"mode": "list",
"value": "2b755c8e-c066-8011-a144-dc5461cc7d35",
"cachedResultUrl": "https://www.notion.so/2b755c8ec0668011a144dc5461cc7d35",
"cachedResultName": "internet money"
},
"filterType": "manual"
},
"credentials": {
"notionApi": {
"id": "8W7fGjc0h1cJbiGi",
"name": "Notion account"
}
},
"typeVersion": 2.2
},
{
"id": "a9f658d3-8482-4432-9c6a-dd4fb5a6e243",
"name": "Google Drive Link Formatter",
"type": "n8n-nodes-base.code",
"position": [
368,
16
],
"parameters": {
"jsCode": "// n8n Code node (Run Once for All Items)\n\nfunction extractDriveId(url) {\n if (!url) return null;\n\n // Try common Google Drive patterns\n const patterns = [\n /\\/file\\/d\\/([a-zA-Z0-9_-]+)/, // .../file/d/ID/...\n /[?&]id=([a-zA-Z0-9_-]+)/, // ...?id=ID or &id=ID\n /\\/uc\\?export=download&id=([a-zA-Z0-9_-]+)/ // already export link\n ];\n\n for (const p of patterns) {\n const m = url.match(p);\n if (m && m[1]) return m[1];\n }\n\n return null;\n}\n\nfunction toExportLink(url) {\n const id = extractDriveId(url);\n return id ? `https://drive.google.com/uc?export=download&id=${id}` : null;\n}\n\nfunction splitUrls(value) {\n if (!value) return [];\n if (Array.isArray(value)) return value.flatMap(v => splitUrls(v));\n\n // Split on whitespace, commas, or newlines\n return String(value)\n .split(/[\\s,]+/g)\n .map(s => s.trim())\n .filter(Boolean);\n}\n\nconst items = $input.all();\n\nfor (const item of items) {\n const json = item.json;\n\n const sources = [\n json.property_character_photo,\n json.property_target_photo,\n json.property_outfit_product_photo\n ];\n\n // Collect raw URLs from all sources\n const rawUrls = sources.flatMap(splitUrls);\n\n // Convert to export links, remove nulls, de-dupe\n const exportUrls = [...new Set(\n rawUrls\n .map(toExportLink)\n .filter(Boolean)\n )];\n\n // Format exactly as requested: each quoted, comma-separated\n json.combined_drive_export_urls = exportUrls.map(u => `\"${u}\"`).join(\", \");\n\n // Optional: also keep as array if you want later nodes to iterate\n json.combined_drive_export_urls_array = exportUrls;\n}\n\nreturn items;\n"
},
"typeVersion": 2
},
{
"id": "74ee1c3a-9c66-42ae-87f9-6b3af32c7559",
"name": "Wait1",
"type": "n8n-nodes-base.wait",
"position": [
1024,
16
],
"webhookId": "f7927e06-2111-4037-9dfc-cd9df87ee2ea",
"parameters": {
"amount": 250
},
"typeVersion": 1.1
},
{
"id": "3cf218b2-bf2f-4122-a20a-02320e1a1bba",
"name": "Split Out1",
"type": "n8n-nodes-base.splitOut",
"position": [
1712,
16
],
"parameters": {
"options": {},
"fieldToSplitOut": "images"
},
"typeVersion": 1
},
{
"id": "aca87363-309c-4b32-800f-b1599ca5ee6d",
"name": "Download",
"type": "n8n-nodes-base.httpRequest",
"position": [
2048,
16
],
"parameters": {
"url": "={{ $json.url }}",
"options": {}
},
"typeVersion": 4.2
},
{
"id": "257910a4-8eb1-45b6-b4d7-78d51cff4dc5",
"name": "Grab Images",
"type": "n8n-nodes-base.httpRequest",
"position": [
1232,
16
],
"parameters": {
"url": "={{ $json.response_url }}",
"options": {},
"sendHeaders": true,
"headerParameters": {
"parameters": [
{
"name": "Authorization",
"value": "Key ac2b2faf-9eb6-46f9-aa87-b7ad8193116f:2f72412affb9c540d90182368b53d2e8"
}
]
}
},
"typeVersion": 4.2,
"alwaysOutputData": true
},
{
"id": "e0ba1603-8cec-46c8-8e83-52ad6b6e1e01",
"name": "If",
"type": "n8n-nodes-base.if",
"position": [
1440,
16
],
"parameters": {
"options": {},
"conditions": {
"options": {
"version": 2,
"leftValue": "",
"caseSensitive": true,
"typeValidation": "strict"
},
"combinator": "and",
"conditions": [
{
"id": "13b1fd6b-b616-4bcd-a831-4033f0b5dc6a",
"operator": {
"type": "string",
"operation": "exists",
"singleValue": true
},
"leftValue": "={{ $json.images[0].url }}",
"rightValue": ""
}
]
}
},
"typeVersion": 2.2
},
{
"id": "8f254a50-cd35-4786-9e75-2257fc748c54",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-304,
-912
],
"parameters": {
"width": 480,
"height": 336,
"content": "## Shot Intake\nShot Selection (Notion): fetches all shots where Status = Not started."
},
"typeVersion": 1
},
{
"id": "c45659e1-b811-49e4-9ab5-69c32030d7ec",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
320,
-912
],
"parameters": {
"color": 5,
"width": 752,
"height": 336,
"content": "## Prep + Target Photo Analysis\nExtracts subject + full outfit + visual effects from the target photo."
},
"typeVersion": 1
},
{
"id": "df75d4d6-0f7a-4974-acfe-5d6497b25b50",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
1248,
-928
],
"parameters": {
"color": 4,
"width": 752,
"height": 352,
"content": "## Prompt Generation + Notion Update\nWrites a 100–400 character prompt\n(feel free to replace OpenRouter with your model of choice)"
},
"typeVersion": 1
},
{
"id": "91c2f9e3-218a-4c29-9353-62ba200ad2dc",
"name": "GPT-5",
"type": "@n8n/n8n-nodes-langchain.lmChatOpenRouter",
"position": [
1488,
-624
],
"parameters": {
"options": {}
},
"credentials": {
"openRouterApi": {
"id": "i5ixZbfelG796Foa",
"name": "OpenRouter account 2"
}
},
"typeVersion": 1
},
{
"id": "e15a1210-0af4-4466-96f2-8625538910e8",
"name": "Sticky Note5",
"type": "n8n-nodes-base.stickyNote",
"position": [
-1392,
-192
],
"parameters": {
"color": 7,
"width": 896,
"height": 656,
"content": "## Nano Banana Image Gen Automation\n\nThis second automation will take every shot marked as “Photo TBD” status from Notion and generate the image with Nano Banana inside [Fal AI](https://fal.ai/models/fal-ai/nano-banana-pro/edit/playground)\n\nNano Banana on Fal AI costs: $0.15 per image\n\n\n\nWorkflow: \n\n1: Pull queued shots from Notion\n2: Prep Drive export links \n3: Send to Nano Banana Pro in Fal AI \n4: Wait until image is ready\n5: Split images\n6: Download binary files\n7: Upload to [Box](https://app.box.com/login)\n8: Update Notion.\n\nOutcome: Fully automated batch image production in Nano Banana Pro + storage + status tracking."
},
"typeVersion": 1
},
{
"id": "52f31a6d-711e-412c-94d7-963f2e88d073",
"name": "Sticky Note3",
"type": "n8n-nodes-base.stickyNote",
"position": [
-208,
-128
],
"parameters": {
"width": 816,
"height": 464,
"content": "## Shot Queue + Drive Link Formatting\nCombines character + target + outfit/product Drive URLs"
},
"typeVersion": 1
},
{
"id": "4890bc1e-aa8b-45f9-a8cd-76a6810b22c7",
"name": "Sticky Note6",
"type": "n8n-nodes-base.stickyNote",
"position": [
736,
-128
],
"parameters": {
"color": 5,
"width": 896,
"height": 464,
"content": "## Nano Banana Generation + Waiting\nsends prompt + reference URLs"
},
"typeVersion": 1
},
{
"id": "8057ef67-e09f-4fff-a07d-7c35a3322813",
"name": "Upload to Box",
"type": "n8n-nodes-base.box",
"position": [
2288,
16
],
"parameters": {
"fileName": "={{ $binary.data.fileName }}",
"binaryData": true
},
"credentials": {
"boxOAuth2Api": {
"id": "pEwI0aPOxRcKDa92",
"name": "Box account"
}
},
"typeVersion": 1
},
{
"id": "eae3a53a-7b27-47c4-a958-e1dfe370896b",
"name": "Update Shot List",
"type": "n8n-nodes-base.notion",
"position": [
2480,
16
],
"parameters": {
"pageId": {
"__rl": true,
"mode": "id",
"value": "={{ $('Shot List').item.json.id }}"
},
"options": {},
"resource": "databasePage",
"operation": "update",
"propertiesUi": {
"propertyValues": [
{
"key": "Status|status",
"statusValue": "Video TBD"
}
]
}
},
"credentials": {
"notionApi": {
"id": "8W7fGjc0h1cJbiGi",
"name": "Notion account"
}
},
"typeVersion": 2.2
},
{
"id": "7cb800e8-44ab-4f68-956c-f4cfb88856d7",
"name": "Loop",
"type": "n8n-nodes-base.splitInBatches",
"position": [
128,
16
],
"parameters": {
"options": {}
},
"typeVersion": 3
},
{
"id": "fb668a78-f2db-4f42-be71-2006ccf89c5e",
"name": "Sticky Note7",
"type": "n8n-nodes-base.stickyNote",
"position": [
1856,
-128
],
"parameters": {
"color": 4,
"width": 896,
"height": 464,
"content": "## Export + Delivery + Status Update\nImages delivered + Notion stays the source of truth."
},
"typeVersion": 1
},
{
"id": "155ee299-daef-45c3-8454-7dc106d991b3",
"name": "Sticky Note8",
"type": "n8n-nodes-base.stickyNote",
"position": [
2112,
-928
],
"parameters": {
"width": 768,
"height": 448,
"content": "@[youtube](JaAsOCjuKj4)"
},
"typeVersion": 1
}
],
"active": false,
"pinData": {},
"settings": {
"executionOrder": "v1"
},
"versionId": "ad07a3d7-f5d9-4056-afb0-5b12f4ab62eb",
"connections": {
"If": {
"main": [
[
{
"node": "Split Out1",
"type": "main",
"index": 0
}
],
[
{
"node": "Wait1",
"type": "main",
"index": 0
}
]
]
},
"Loop": {
"main": [
[],
[
{
"node": "Google Drive Link Formatter",
"type": "main",
"index": 0
}
]
]
},
"GPT-5": {
"ai_languageModel": [
[
{
"node": "Image Prompt Gen",
"type": "ai_languageModel",
"index": 0
}
]
]
},
"Wait1": {
"main": [
[
{
"node": "Grab Images",
"type": "main",
"index": 0
}
]
]
},
"Download": {
"main": [
[
{
"node": "Upload to Box",
"type": "main",
"index": 0
}
]
]
},
"Shot List": {
"main": [
[
{
"node": "Loop",
"type": "main",
"index": 0
}
]
]
},
"Split Out1": {
"main": [
[
{
"node": "Download",
"type": "main",
"index": 0
}
]
]
},
"Grab Images": {
"main": [
[
{
"node": "If",
"type": "main",
"index": 0
}
]
]
},
"Updated Shot": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Upload to Box": {
"main": [
[
{
"node": "Update Shot List",
"type": "main",
"index": 0
}
]
]
},
"Shot Selection": {
"main": [
[
{
"node": "Loop Over Items",
"type": "main",
"index": 0
}
]
]
},
"Loop Over Items": {
"main": [
[],
[
{
"node": "Add Reference Photos",
"type": "main",
"index": 0
}
]
]
},
"Image Prompt Gen": {
"main": [
[
{
"node": "Updated Shot",
"type": "main",
"index": 0
}
]
]
},
"Update Shot List": {
"main": [
[
{
"node": "Loop",
"type": "main",
"index": 0
}
]
]
},
"Nano Banana Pro V2": {
"main": [
[
{
"node": "Wait1",
"type": "main",
"index": 0
}
]
]
},
"Add Reference Photos": {
"main": [
[
{
"node": "Analyze Target Image",
"type": "main",
"index": 0
}
]
]
},
"Analyze Target Image": {
"main": [
[
{
"node": "Image Prompt Gen",
"type": "main",
"index": 0
}
]
]
},
"Google Drive Link Formatter": {
"main": [
[
{
"node": "Nano Banana Pro V2",
"type": "main",
"index": 0
}
]
]
},
"When clicking ‘Execute workflow’": {
"main": [
[
{
"node": "Shot Selection",
"type": "main",
"index": 0
}
]
]
}
}
}