{
  "id": "0GCQ1fO3d5MBdKmi",
  "meta": {
    "instanceId": "workflow-88d0d516",
    "versionId": "1.0.0",
    "createdAt": "2025-09-29T07:07:54.707424",
    "updatedAt": "2025-09-29T07:07:54.707440",
    "owner": "n8n-user",
    "license": "MIT",
    "category": "automation",
    "status": "active",
    "priority": "high",
    "environment": "production"
  },
  "name": "template-demo-chatgpt-image-1-with-drive-and-sheet copy",
  "tags": [
    "automation",
    "n8n",
    "production-ready",
    "excellent",
    "optimized"
  ],
  "nodes": [
    {
      "id": "7d78d4e3-cbb3-4f32-82d9-73c9d7f6c892",
      "name": "When clicking 'Test workflow'",
      "type": "n8n-nodes-base.manualTrigger",
      "disabled": true,
      "position": [
        -480,
        -245
      ],
      "parameters": {},
      "typeVersion": 1,
      "notes": "This manualTrigger node performs automated tasks as part of the workflow."
    },
    {
      "id": "b32b61bb-c837-4697-9742-a1bb2854b628",
      "name": "HTTP Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -260,
        -120
      ],
      "parameters": {
        "url": "{{ $env.API_BASE_URL }}",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "{{ $credentials.predefinedCredentialType }}",
        "bodyParameters": {
          "parameters": [
            {
              "name": "model",
              "value": "gpt-image-1"
            },
            {
              "name": "prompt",
              "value": "={{ $json.chatInput }}"
            },
            {
              "name": "output_format",
              "value": "jpeg"
            },
            {
              "name": "quality",
              "value": "low"
            },
            {
              "name": "output_compression",
              "value": "={{parseInt('80')}}"
            },
            {
              "name": "size",
              "value": "1024x1024"
            },
            {
              "name": "n",
              "value": "={{parseInt('1')}}"
            },
            {
              "name": "moderation",
              "value": "low"
            }
          ]
        },
        "nodeCredentialType": "YOUR_CREDENTIAL_HERE"
      },
      "credentials": {
        "openAiApi": {
          "id": "GgwYNKMKKqKJICYO",
          "name": "OpenAi account - Image"
        }
      },
      "typeVersion": 4.2,
      "notes": "This httpRequest node performs automated tasks as part of the workflow."
    },
    {
      "id": "0ead70d0-9e3b-4f19-afee-b5d4a7b532e9",
      "name": "Google Drive",
      "type": "n8n-nodes-base.googleDrive",
      "position": [
        860,
        -20
      ],
      "parameters": {
        "name": "=chatgpt_created_by_n8n_{{ $('HTTP Request').item.json.created }}",
        "driveId": {
          "__rl": true,
          "mode": "list",
          "value": "My Drive"
        },
        "options": {},
        "folderId": {
          "__rl": true,
          "mode": "list",
          "value": "1sIbMHDtcOafBVdCq0gTEuGvnT63s8Fdy",
          "cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
          "cachedResultName": "n8n-demo-gpt_image_1"
        },
        "inputDataFieldName": "=data"
      },
      "credentials": {
        "googleDriveOAuth2Api": {
          "id": "iQdqjdvLVh5ldUIq",
          "name": "Personal-Google Drive account"
        }
      },
      "typeVersion": 3,
      "notes": "This googleDrive node performs automated tasks as part of the workflow."
    },
    {
      "id": "a76c4340-9f34-49d1-a831-1ba4515933ee",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        -40,
        -120
      ],
      "parameters": {
        "options": {
          "includeBinary": true
        },
        "fieldToSplitOut": "data"
      },
      "typeVersion": 1,
      "notes": "This splitOut node performs automated tasks as part of the workflow."
    },
    {
      "id": "c8090e15-b9b9-4999-89f0-97d45e6176d6",
      "name": "Convert to File",
      "type": "n8n-nodes-base.convertToFile",
      "position": [
        640,
        -20
      ],
      "parameters": {
        "options": {
          "fileName": "={{ $now.format(\"yyyyMMddHHmmSSS\") }}"
        },
        "operation": "toBinary",
        "sourceProperty": "b64_json"
      },
      "typeVersion": 1.1,
      "notes": "This convertToFile node performs automated tasks as part of the workflow."
    },
    {
      "id": "692a71fb-6fe3-4728-a588-f9283f5ab968",
      "name": "Loop Over Items",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        200,
        -20
      ],
      "parameters": {
        "options": {
          "reset": false
        },
        "batchSize": "=1"
      },
      "executeOnce": false,
      "typeVersion": 3,
      "notes": "This splitInBatches node performs automated tasks as part of the workflow."
    },
    {
      "id": "dfa88c15-4d38-4670-9c5a-4e52a9ce9d33",
      "name": "Edit Fields-file_name",
      "type": "n8n-nodes-base.set",
      "position": [
        420,
        -20
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "10e6d39e-c44c-4db4-bf88-806b2f36c09f",
              "name": "file_name",
              "type": "string",
              "value": "={{ $now.format(\"yyyyMMddHHmmSSS\") }}"
            },
            {
              "id": "c2610584-aafa-4d90-8977-399e49015c32",
              "name": "b64_json",
              "type": "string",
              "value": "={{ $json.b64_json }}"
            }
          ]
        }
      },
      "typeVersion": 3.4,
      "notes": "This set node performs automated tasks as part of the workflow."
    },
    {
      "id": "c34c1a91-2601-4750-8134-d31cf377c349",
      "name": "Edit Fields1",
      "type": "n8n-nodes-base.set",
      "position": [
        1080,
        -20
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "dcfa49d6-a8ed-43a2-9aaa-86751f34e61d",
              "name": "id",
              "type": "string",
              "value": "={{ $json.id }}"
            },
            {
              "id": "d2f7f22d-9453-4b61-bd46-fb3e8d5ad4d8",
              "name": "webViewLink",
              "type": "string",
              "value": "={{ $json.webViewLink }}"
            },
            {
              "id": "b8cf5a41-e354-416e-b548-8d1a274873e0",
              "name": "thumbnailLink",
              "type": "string",
              "value": "={{ $json.thumbnailLink }}"
            },
            {
              "id": "76c11a24-087c-4a6c-a5b4-8901e9436786",
              "name": "file_name",
              "type": "string",
              "value": "={{ $('Edit Fields-file_name').item.json.file_name }}"
            }
          ]
        }
      },
      "typeVersion": 3.4,
      "notes": "This set node performs automated tasks as part of the workflow."
    },
    {
      "id": "6bd8f7dc-1006-4d7f-b3eb-0a3aaa1b9a84",
      "name": "Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1300,
        -20
      ],
      "parameters": {
        "columns": {
          "value": {
            "image": "={{ $json.webViewLink }}",
            "prompt": "={{ $('When chat message received').item.json.chatInput }}",
            "image_thumb": "==IMAGE(\"{{ $('Edit Fields1').item.json.thumbnailLink }}\")"
          },
          "schema": [
            {
              "id": "prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "image",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "image",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "image_thumb",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "image_thumb",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "cellFormat": "USER_ENTERED"
        },
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
          "cachedResultName": "工作表1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "11K1tui8itMzcSZqHOmzvFnM0G-ihn1uiLUZ_o478j88",
          "cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
          "cachedResultName": "n8n-chatgpt-image-1-model"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "tufEzuSTEveV3tuA",
          "name": "(Personal)Google Sheets account"
        }
      },
      "typeVersion": 4.5,
      "notes": "This googleSheets node performs automated tasks as part of the workflow."
    },
    {
      "id": "8ee28143-d9e7-4d14-929f-c9b6592c366e",
      "name": "When chat message received",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -480,
        -45
      ],
      "webhookId": "f64b2006-672a-4ad6-8c30-428b76f5a332",
      "parameters": {
        "options": {}
      },
      "typeVersion": 1.1,
      "notes": "This chatTrigger node performs automated tasks as part of the workflow."
    },
    {
      "id": "1e687fde-8465-4490-8738-c9832904f2b5",
      "name": "Google Sheets1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        700,
        -400
      ],
      "parameters": {
        "columns": {
          "value": {
            "prompt": "={{ $('When chat message received').item.json.chatInput }}",
            "datetime": "={{ $('HTTP Request').item.json.created.toDateTime('s').format('yyyy-MM-dd HH:mm:ss') }}",
            "input token": "YOUR_TOKEN_HERE",
            "output token": "YOUR_TOKEN_HERE",
            "input estimated price": "={{    (     ($('HTTP Request').item.json.usage.input_tokens || 0) * 10 / 1000000   ).toFixed(6)  }}",
            "total estimated price": "={{ \n  (\n    (($('HTTP Request').item.json.usage.input_tokens || 0) * 10 / 1000000) +\n    (($('HTTP Request').item.json.usage.output_tokens || 0) * 40 / 1000000)\n  ).toFixed(6)\n}}",
            "output estimated price": "={{    (     ($('HTTP Request').item.json.usage.output_tokens || 0) * 40 / 1000000   ).toFixed(6)  }}"
          },
          "schema": [
            {
              "id": "prompt",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "prompt",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "datetime",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "datetime",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "input token",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "input token",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "input estimated price",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "input estimated price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "output token",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "output token",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "output estimated price",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "output estimated price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "total estimated price",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "total estimated price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": 929800828,
          "cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
          "cachedResultName": "usage"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "11K1tui8itMzcSZqHOmzvFnM0G-ihn1uiLUZ_o478j88",
          "cachedResultUrl": "{{ $env.WEBHOOK_URL }}",
          "cachedResultName": "n8n-chatgpt-image-1-model"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "tufEzuSTEveV3tuA",
          "name": "(Personal)Google Sheets account"
        }
      },
      "typeVersion": 4.5,
      "notes": "This googleSheets node performs automated tasks as part of the workflow."
    },
    {
      "id": "5e1f6dd3-6c1a-4838-86c7-2a3c0cf05c3d",
      "name": "Aggregate",
      "type": "n8n-nodes-base.aggregate",
      "position": [
        480,
        -400
      ],
      "parameters": {
        "options": {},
        "aggregate": "aggregateAllItemData"
      },
      "typeVersion": 1,
      "notes": "This aggregate node performs automated tasks as part of the workflow."
    },
    {
      "id": "f14edb71-0778-40dc-9f2d-4cfc72b8a351",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -540,
        -600
      ],
      "parameters": {
        "color": 7,
        "width": 340,
        "height": 240,
        "content": "## Created by darrell_tw_ \n\nAn engineer now focus on AI and Automation\n\n### contact me with following:\n[X]({{ $env.WEBHOOK_URL }}\n[Threads]({{ $env.WEBHOOK_URL }}\n[Instagram]({{ $env.WEBHOOK_URL }}\n[Website]({{ $env.WEBHOOK_URL }}"
      },
      "typeVersion": 1,
      "notes": "This stickyNote node performs automated tasks as part of the workflow."
    },
    {
      "id": "6bbe2346-287b-491d-bf20-a76d39a6e297",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -540,
        -340
      ],
      "parameters": {
        "width": 660,
        "height": 480,
        "content": "## Use Chat to input prompts for image generation"
      },
      "typeVersion": 1,
      "notes": "This stickyNote node performs automated tasks as part of the workflow."
    },
    {
      "id": "8dd6607a-16cf-424d-902a-04c43e68f424",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        160,
        -200
      ],
      "parameters": {
        "color": 2,
        "width": 1260,
        "height": 420,
        "content": "## Process image array data with Loop\nRegardless of single or multiple images\nThey will be in the data[] array\nJust use Loop to process them\n\nImages will be uploaded to Drive and saved as a row in the Sheet with links and thumbnails"
      },
      "typeVersion": 1,
      "notes": "This stickyNote node performs automated tasks as part of the workflow."
    },
    {
      "id": "f8d0819a-e38a-4f7a-aa79-594ebca465a0",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        400,
        -480
      ],
      "parameters": {
        "color": 6,
        "width": 480,
        "height": 260,
        "content": "## After processing, save Cost to Sheet"
      },
      "typeVersion": 1,
      "notes": "This stickyNote node performs automated tasks as part of the workflow."
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": null,
    "timezone": "UTC",
    "executionTimeout": 3600,
    "maxExecutions": 1000,
    "retryOnFail": true,
    "retryCount": 3,
    "retryDelay": 1000
  },
  "versionId": "cf533114-4aa9-4b06-8247-3c06f9dcbc79",
  "connections": {
    "b32b61bb-c837-4697-9742-a1bb2854b628": {
      "main": [
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-15fb2537",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-1c227f2a",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-bda75213",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-37eb3dfd",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-1dc2725d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-039f99e0",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-910848d1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-b32b61bb-c837-4697-9742-a1bb2854b628-b6284462",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0ead70d0-9e3b-4f19-afee-b5d4a7b532e9": {
      "main": [
        [
          {
            "node": "error-handler-0ead70d0-9e3b-4f19-afee-b5d4a7b532e9-e6f476d8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c8090e15-b9b9-4999-89f0-97d45e6176d6": {
      "main": [
        [
          {
            "node": "error-handler-c8090e15-b9b9-4999-89f0-97d45e6176d6-9ddb1497",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "6bd8f7dc-1006-4d7f-b3eb-0a3aaa1b9a84": {
      "main": [
        [
          {
            "node": "error-handler-6bd8f7dc-1006-4d7f-b3eb-0a3aaa1b9a84-16c9a5b4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1e687fde-8465-4490-8738-c9832904f2b5": {
      "main": [
        [
          {
            "node": "error-handler-1e687fde-8465-4490-8738-c9832904f2b5-b1303828",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "description": "Automated workflow: template-demo-chatgpt-image-1-with-drive-and-sheet copy. This workflow integrates 12 different services: convertToFile, stickyNote, httpRequest, splitOut, googleDrive. It contains 22 nodes and follows best practices for error handling and security.",
  "notes": "Excellent quality workflow: template-demo-chatgpt-image-1-with-drive-and-sheet copy. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."
}