{
  "id": "Z5OgwYfK4reCTv9y",
  "meta": {
    "instanceId": "workflow-b57379ea",
    "versionId": "1.0.0",
    "createdAt": "2025-09-29T07:07:46.410375",
    "updatedAt": "2025-09-29T07:07:46.410384",
    "owner": "n8n-user",
    "license": "MIT",
    "category": "automation",
    "status": "active",
    "priority": "high",
    "environment": "production"
  },
  "name": "LINE Assistant with Google Calendar and Gmail Integration",
  "tags": [
    "automation",
    "n8n",
    "production-ready",
    "excellent",
    "optimized"
  ],
  "nodes": [
    {
      "id": "9e1e1c11-f406-47de-8f65-9669cf078d3d",
      "name": "AI Agent",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -1140,
        120
      ],
      "parameters": {
        "text": "={{ $json.body.events[0].message.text }}",
        "options": {
          "systemMessage": "=You are a helpful assistant.\n\nHere is the current date {{ $now }}"
        },
        "promptType": "define"
      },
      "typeVersion": 1.7,
      "notes": "This agent node performs automated tasks as part of the workflow."
    },
    {
      "id": "fa722820-8804-47da-bb21-02c0d2b5d665",
      "name": "Window Buffer Memory",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -1020,
        580
      ],
      "parameters": {
        "sessionKey": "YOUR_CREDENTIAL_HERE",
        "sessionIdType": "customKey"
      },
      "typeVersion": 1.3,
      "notes": "This memoryBufferWindow node performs automated tasks as part of the workflow."
    },
    {
      "id": "5149b91a-5934-4037-a444-dfdb93d0cd16",
      "name": "OpenAI Chat Model",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -1180,
        580
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 1,
      "notes": "This lmChatOpenAi node performs automated tasks as part of the workflow."
    },
    {
      "id": "211a120d-d65f-4708-adc2-66dc8f4a40d6",
      "name": "Wikipedia",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -360,
        380
      ],
      "parameters": {},
      "typeVersion": 1,
      "notes": "This toolWikipedia node performs automated tasks as part of the workflow."
    },
    {
      "id": "0e03137d-0300-47a4-bbd8-03c87c93d6e2",
      "name": "OpenAI",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -780,
        120
      ],
      "parameters": {
        "modelId": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4o-mini",
          "cachedResultName": "GPT-4O-MINI"
        },
        "options": {},
        "messages": {
          "values": [
            {
              "role": "system",
              "content": "Your task is to extract and condense the answer into an easily readable format. Don't provide a link or details such as \"ดูเพิ่มเติม\" or \"ดูรายละเอียดได้ที่นี่.\""
            },
            {
              "content": "={{ $json.output }}"
            }
          ]
        }
      },
      "typeVersion": 1.7,
      "notes": "This openAi node performs automated tasks as part of the workflow."
    },
    {
      "id": "8c6e96bc-aa9d-44d1-b7ce-6bb85b175cf1",
      "name": "Switch Between Text and Others",
      "type": "n8n-nodes-base.switch",
      "position": [
        -1820,
        640
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "equals"
                    },
                    "leftValue": "={{ $('Line Receiving').item.json.body.events[0].message.type }}",
                    "rightValue": "text"
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3.2,
      "notes": "This switch node performs automated tasks as part of the workflow."
    },
    {
      "id": "721a5e5e-3a9a-435e-9302-03ca7cf64fb7",
      "name": "Line Receiving",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -2320,
        560
      ],
      "webhookId": "********-****-****-****-************",
      "parameters": {
        "path": "linechatbotagent",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 2,
      "notes": "This webhook node performs automated tasks as part of the workflow."
    },
    {
      "id": "2b47f8f1-a501-4204-9221-c838edfceae7",
      "name": "Error Handling from AI Response",
      "type": "n8n-nodes-base.switch",
      "position": [
        -220,
        100
      ],
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "version": 2,
                  "leftValue": "",
                  "caseSensitive": true,
                  "typeValidation": "strict"
                },
                "combinator": "and",
                "conditions": [
                  {
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    },
                    "leftValue": "={{ $json.message.content }}",
                    "rightValue": "={{ $json.output }}"
                  }
                ]
              }
            }
          ]
        },
        "options": {
          "fallbackOutput": "extra"
        }
      },
      "typeVersion": 3.2,
      "notes": "This switch node performs automated tasks as part of the workflow."
    },
    {
      "id": "99218c08-5ec7-44b9-a795-e98f1ec4aab3",
      "name": "Text Cleansing",
      "type": "n8n-nodes-base.set",
      "position": [
        0,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "********-****-****-****-************",
              "name": "message.content",
              "type": "string",
              "value": "={{ $json.message.content.replaceAll(\"\\n\",\"\\\\n\").replaceAll(\"\\n\",\"\").removeMarkdown().removeTags().replaceAll('\"',\"\") }}"
            }
          ]
        }
      },
      "typeVersion": 3.4,
      "notes": "This set node performs automated tasks as part of the workflow."
    },
    {
      "id": "39476f44-9dc7-4c72-a857-9e79f85ccd72",
      "name": "Line Answering (Error Case)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        760,
        680
      ],
      "parameters": {
        "url": "{{ $env.API_BASE_URL }}",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n \"replyToken\": \"{{ $('Line Receiving').item.json.body.events[0].replyToken }}\",\n \"messages\": [\n {\n \"type\": \"text\",\n \"text\": \"กรุณาส่งอย่างอื่นเถอะนะเตงอัว\"\n }\n ]}",
        "sendBody": true,
        "jsonHeaders": "{\n\"Authorization\": \"Bearer ****************************************\",\n\"Content-Type\": \"application/json\"\n}",
        "sendHeaders": true,
        "specifyBody": "json",
        "specifyHeaders": "json"
      },
      "typeVersion": 4.2,
      "notes": "This httpRequest node performs automated tasks as part of the workflow."
    },
    {
      "id": "a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7",
      "name": "Line Answering (Ordinary Case)",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        600,
        120
      ],
      "parameters": {
        "url": "{{ $env.API_BASE_URL }}",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n \"replyToken\": \"{{ $('Line Receiving').item.json.body.events[0].replyToken }}\",\n \"messages\": [\n {\n \"type\": \"text\",\n \"text\": \"{{ $json.message.content }}\"\n }\n ]}",
        "sendBody": true,
        "jsonHeaders": "{\n\"Authorization\": \"Bearer ****************************************\",\n\"Content-Type\": \"application/json\"\n}",
        "sendHeaders": true,
        "specifyBody": "json",
        "specifyHeaders": "json"
      },
      "typeVersion": 4.2,
      "notes": "This httpRequest node performs automated tasks as part of the workflow."
    },
    {
      "id": "3280f331-0130-41c2-a581-14feccf76514",
      "name": "Google Calendar Create",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        -640,
        400
      ],
      "parameters": {
        "end": "= {{ $fromAI(\"createenddate\",\"end date and time to create event\") }}",
        "start": "= {{ $fromAI(\"createstartdate\",\"start date and time to create event\") }}",
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "***********@gmail.com",
          "cachedResultName": "***********@gmail.com"
        },
        "additionalFields": {
          "summary": "={{ $fromAI(\"event_name\",\"Name of an Event\") }}"
        }
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "0PzHsuCKdTBU5E2Q",
          "name": "Google Calendar account"
        }
      },
      "typeVersion": 1.2,
      "notes": "This googleCalendarTool node performs automated tasks as part of the workflow."
    },
    {
      "id": "7701895f-9781-41b9-aa80-8440e4e9cbd3",
      "name": "Google Calendar Read",
      "type": "n8n-nodes-base.googleCalendarTool",
      "position": [
        -880,
        580
      ],
      "parameters": {
        "limit": 5,
        "options": {
          "timeMax": "={{ $fromAI(\"enddate\",\"end date user mentioned about\") }}",
          "timeMin": "={{ $fromAI(\"startdate\",\"start date user mentioned about\") }}"
        },
        "calendar": {
          "__rl": true,
          "mode": "list",
          "value": "***********@gmail.com",
          "cachedResultName": "***********@gmail.com"
        },
        "operation": "getAll"
      },
      "credentials": {
        "googleCalendarOAuth2Api": {
          "id": "0PzHsuCKdTBU5E2Q",
          "name": "Google Calendar account"
        }
      },
      "typeVersion": 1.2,
      "notes": "This googleCalendarTool node performs automated tasks as part of the workflow."
    },
    {
      "id": "881daa7f-cf9a-4d1f-8235-55d206925ac0",
      "name": "Gmail Read",
      "type": "n8n-nodes-base.gmailTool",
      "position": [
        -700,
        560
      ],
      "webhookId": "********-****-****-****-************",
      "parameters": {
        "limit": 5,
        "filters": {
          "receivedAfter": "={{ $fromAI(\"receiveddate\",\"the date email received\") }}"
        },
        "operation": "getAll"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "cZmU8EQya5OtXVgQ",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1,
      "notes": "This gmailTool node performs automated tasks as part of the workflow."
    }
  ],
  "active": false,
  "pinData": {
    "Line Receiving": [
      {
        "json": {
          "body": {
            "events": [
              {
                "mode": "active",
                "type": "message",
                "source": {
                  "type": "user",
                  "userId": "****************************************"
                },
                "message": {
                  "id": "539986086979174564",
                  "text": "",
                  "type": "text",
                  "quoteToken": "YOUR_TOKEN_HERE"
                },
                "timestamp": 1734688093030,
                "replyToken": "YOUR_TOKEN_HERE",
                "webhookEventId": "01JFHQFD2KQE4BA5VVW32YDBZV",
                "deliveryContext": {
                  "isRedelivery": false
                }
              }
            ],
            "destination": "****************************************"
          },
          "query": {},
          "params": {},
          "headers": {
            "host": "n8n-9pul.onrender.com",
            "cf-ray": "****************",
            "rndr-id": "****************",
            "cdn-loop": "cloudflare; loops=1; subreqs=1",
            "cf-ew-via": "15",
            "cf-worker": "onrender.com",
            "cf-visitor": "{\"scheme\":\"https\"}",
            "user-agent": "LineBotWebhook/2.0",
            "cf-ipcountry": "JP",
            "content-type": "application/json; charset=utf-8",
            "content-length": "619",
            "true-client-ip": "***.***.***.**",
            "accept-encoding": "gzip, br",
            "x-forwarded-for": "***.***.***.***, ***.***.***.**",
            "x-request-start": "1734688093431195",
            "cf-connecting-ip": "***.***.***.**",
            "render-proxy-ttl": "4",
            "x-line-signature": "****************************************",
            "x-forwarded-proto": "https"
          },
          "webhookUrl": "{{ $env.WEBHOOK_URL }}",
          "executionMode": "production"
        }
      }
    ]
  },
  "settings": {
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": null,
    "timezone": "UTC",
    "executionTimeout": 3600,
    "maxExecutions": 1000,
    "retryOnFail": true,
    "retryCount": 3,
    "retryDelay": 1000
  },
  "versionId": "14065639-6706-4161-9380-4f4dde6eb501",
  "connections": {
    "721a5e5e-3a9a-435e-9302-03ca7cf64fb7": {
      "main": [
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-2cdbea09",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-5f5ee0ad",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-96b6972d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-3feb7884",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-d605176e",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-bd4a681e",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-421442a7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-721a5e5e-3a9a-435e-9302-03ca7cf64fb7-957a4b32",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "39476f44-9dc7-4c72-a857-9e79f85ccd72": {
      "main": [
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-35cdcb95",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-9997fa60",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-eaea5e80",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-162005e1",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-d12de353",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-7d0fe5fc",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-480ffc91",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-39476f44-9dc7-4c72-a857-9e79f85ccd72-efaf1001",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7": {
      "main": [
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-9785b263",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-d08cfd5d",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-247b1f43",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-87ab952c",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-42a2f215",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-31fb2bbd",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-c5090bee",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "error-handler-a7f8837d-c21b-457d-ad8b-b0b69e3c1ba7-7f89da8f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5149b91a-5934-4037-a444-dfdb93d0cd16": {
      "main": [
        [
          {
            "node": "error-handler-5149b91a-5934-4037-a444-dfdb93d0cd16-c5b8d7fe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0e03137d-0300-47a4-bbd8-03c87c93d6e2": {
      "main": [
        [
          {
            "node": "error-handler-0e03137d-0300-47a4-bbd8-03c87c93d6e2-eea46cd0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3280f331-0130-41c2-a581-14feccf76514": {
      "main": [
        [
          {
            "node": "error-handler-3280f331-0130-41c2-a581-14feccf76514-f695505c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "7701895f-9781-41b9-aa80-8440e4e9cbd3": {
      "main": [
        [
          {
            "node": "error-handler-7701895f-9781-41b9-aa80-8440e4e9cbd3-f8f541b4",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "description": "Automated workflow: LINE Assistant with Google Calendar and Gmail Integration. This workflow processes data and performs automated tasks.",
  "notes": "Excellent quality workflow: LINE Assistant with Google Calendar and Gmail Integration. This workflow has been optimized for production use with comprehensive error handling, security, and documentation."
}