AutomationFlowsAI & RAG › Quote Freight Shipments via Whatsapp with Google Gemini, Highlevel, and Warp

Quote Freight Shipments via Whatsapp with Google Gemini, Highlevel, and Warp

Byiamvaar @iamvaar on n8n.io

Youtube Video: https://youtu.be/kO4LgKT6oME?si=VpUEz2LKuxMujrUp This workflow receives WhatsApp messages, checks the sender in HighLevel, and uses Google Gemini with Redis chat memory to collect shipment details, then requests an LTL quote from the Warp API, applies a…

Event trigger★★★★☆ complexityAI-powered21 nodesWhatsApp TriggerHigh LevelAgentGoogle Gemini ChatHigh Level ToolOutput Parser StructuredWhatsAppHTTP Request
AI & RAG Trigger: Event Nodes: 21 Complexity: ★★★★☆ AI nodes: yes Added:
Quote Freight Shipments via Whatsapp with Google Gemini, Highlevel, and Warp — n8n workflow card showing WhatsApp Trigger, High Level, Agent integration

This workflow corresponds to n8n.io template #16385 — we link there as the canonical source.

This workflow follows the Agent → 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": "SyVOkqQZGGkh2zWN",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "The Autonomous Freight Quoting Engine",
  "tags": [],
  "nodes": [
    {
      "id": "f3d9ea6a-9c11-4c4a-9b74-576009382476",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -304,
        432
      ],
      "parameters": {
        "width": 480,
        "height": 816,
        "content": "## The Autonomous Freight Quoting Engine\n\n### How it works\n\n1. The workflow triggers upon receiving a WhatsApp message.\n2. It checks the sender's contact status and processes the intent through an AI agent.\n3. Depending on the output, it either sends a conversational reply or initiates a quote generation sequence.\n4. Quote generation involves fetching pricing data, applying commissions, and sending the result back to the user.\n\n### Setup steps\n\n- - [ ] Configure the WhatsApp Trigger with valid webhook credentials.\n- - [ ] Set up the Google Gemini Chat Model credential in the AI Agent.\n- - [ ] Provide Redis connection details for the Chat Memory.\n- - [ ] Update the HTTP Request node with the correct API endpoint and headers.\n\n### Customization\n\nYou can adjust the system prompt within the AI Agent node to change the persona or tone of the assistant."
      },
      "typeVersion": 1
    },
    {
      "id": "5e21bfe1-f78e-40b2-9984-4061c7fb1809",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        256,
        768
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 288,
        "content": "## Receive and process trigger data\n\nReceives incoming messages and checks existing contact data."
      },
      "typeVersion": 1
    },
    {
      "id": "c66172ec-dbf0-45e4-8de3-02ee9a9eafd1",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        752
      ],
      "parameters": {
        "color": 7,
        "width": 816,
        "height": 496,
        "content": "## Execute AI agent logic\n\nProcesses user input using Gemini, memory, and tools to structure data."
      },
      "typeVersion": 1
    },
    {
      "id": "280107ae-6fa6-45c5-82d8-021987f3f257",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        736
      ],
      "parameters": {
        "color": 7,
        "width": 416,
        "height": 416,
        "content": "## Route AI responses\n\nRoutes processed AI output to either a direct message or a quote calculation flow."
      },
      "typeVersion": 1
    },
    {
      "id": "073237bc-6dbb-4511-baea-8c78b555726b",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        432
      ],
      "parameters": {
        "color": 7,
        "width": 864,
        "height": 272,
        "content": "## Calculate and send quotes\n\nCalculates commissioned rates and sends the final quote via WhatsApp."
      },
      "typeVersion": 1
    },
    {
      "id": "7441a56c-ab76-42e8-9bf0-db1decd947a8",
      "name": "When WhatsApp Message Received",
      "type": "n8n-nodes-base.whatsAppTrigger",
      "position": [
        304,
        896
      ],
      "parameters": {
        "options": {
          "messageStatusUpdates": [
            "all"
          ]
        },
        "updates": [
          "messages"
        ]
      },
      "credentials": {
        "whatsAppTriggerApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9dddf1c9-b8d1-4530-950b-47ce66fd7444",
      "name": "Check Message Content",
      "type": "n8n-nodes-base.if",
      "position": [
        528,
        896
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "eb417180-cf35-4c4f-a0e2-55d37bd65c70",
              "operator": {
                "type": "string",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.messages[0].text.body }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.3
    },
    {
      "id": "b785d40e-bf4c-4a87-9bdf-d0d77a40fd58",
      "name": "Fetch HighLevel Contacts",
      "type": "n8n-nodes-base.highLevel",
      "position": [
        752,
        880
      ],
      "parameters": {
        "filters": {
          "query": "=+{{ $('When WhatsApp Message Received').item.json.contacts[0].wa_id }}"
        },
        "options": {},
        "operation": "getAll",
        "requestOptions": {}
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2,
      "alwaysOutputData": true
    },
    {
      "id": "4711311b-1e02-4322-86d5-e3b550a44fb8",
      "name": "Lead Processing Agent",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1504,
        864
      ],
      "parameters": {
        "text": "=Contact:\n{{ $json.id ? `Contact Status: The contact is already in our CRM. Their name is ${$json.firstName || 'User'}. We are good to go. Move directly to asking about pending gaps in the Freight Quote query.` : `Contact Status: The contact is NOT created. Blindly ask the user for their full name and email address, and use 'create a contact' tool once provided. Do not proceed to freight questions until this is done.` }}\n\nUser Message:\n{{ $('When WhatsApp Message Received').item.json.messages[0].text.body }}\n\nTime Now:\n{{ $now }}\nSo understand the dates from user when he said 5 days from now or 20th of this month by using the current time",
        "options": {
          "systemMessage": "> You are a Freight Quote Assistant using the Warp API. Follow these rules in exact order.\n> **Rule 1: Contact Status Check**\n> Read the \"Contact Status\" provided in your system instructions. If the contact does not exist, your ONLY task is to ask for their Full Name and Email to use the \"create a contact\" tool. If they exist, proceed to Rule 2.\n> **Rule 2: The Offload Condition**\n> If the user explicitly states they do not need the service, are wasting time, or opt out, immediately use the \"offload the lead\" tool and end the conversation.\n> **Rule 3: The Gathering Protocol (Strict Order)**\n> You must gather freight details in this exact sequence. Do not ask for Step B until Step A is fulfilled.\n> * **Phase A (The Core):** Ask for missing core fields: `Pickup ZIP`, `Delivery ZIP`, `No. of Pallets`, and `Appointment Date` (Pickup/Delivery).\n> * **Phase B (Dimensions):** Once Phase A is complete, ask for pallet dimensions: `Pallet Length`, `Pallet Width`, and `Pallet Height`.\n> * **Phase C (Optionals - All at Once):** Once Phase A and B are complete, ask the user if they need any special accessorials. You must list the remaining optional fields (e.g., Liftgate, Residential, Inside Delivery, Refrigerated, etc.) *all at once* in a single message to see if they apply.\n> \n> \n> **Rule 4: Output Formatting**\n> Always respond using the strictly defined JSON structure. Your natural language response to the user must go inside the `user_reply` field.\n> **Rule 5: The Completion Flag**\n> Keep `\"is_data_collection_complete\"` as `false` while you are still gathering information in Phases A, B, and C. Only set it to `true` when the user has provided the core details AND answered your final question regarding the optional accessorials.\n\n> You are a Freight Quote Assistant using the Warp API. Follow these rules in exact order. \n> \n> **Rule 1: Contact Status Check**\n> Read the \"Contact Status\" provided in the context. If the contact does not exist, your ONLY task is to ask for their Full Name and Email to use the \"contact creation\" tool. Do not proceed to freight questions until this is done.\n> \n> **Rule 2: The Offload Condition**\n> If the user explicitly states they do not need the service, are wasting time, or opt out, immediately use the \"Offload this lead\" tool and end the conversation.\n> \n> **Rule 3: The Gathering Protocol (Strict Order)**\n> You must gather freight details in this exact sequence. Do not ask for Step B until Step A is fulfilled.\n> * **Phase A (The Core):** Ask for missing core fields: Pickup ZIP, Delivery ZIP, No. of Pallets, Weight in lbs/pallet and Appointment Date for both pickup and estimated delivery.\n> * **Phase B (Dimensions):** Once Phase A is complete, ask for pallet dimensions: Pallet Length, Pallet Width, and Pallet Height.\n> * **Phase C (Optionals - All at Once):** Once Phase A and B are complete, ask the user if they need any special accessorials (e.g., Liftgate, Residential, Inside Delivery, Refrigerated, etc.) ALL AT ONCE in a single message.\n> \n> **Rule 4: Output Formatting & The Completion Flag**\n> * Your natural language response to the user MUST go inside the `user_reply` field.\n> * Keep `is_data_collection_complete` as `false` while gathering information. Only set it to `true` when the user has provided the core details AND answered your final question regarding the optional accessorials.\n>"
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "retryOnFail": true,
      "typeVersion": 3.1
    },
    {
      "id": "df5459a9-f373-44a4-9917-08d4bf6bec47",
      "name": "Google Gemini Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1200,
        1104
      ],
      "parameters": {
        "options": {}
      },
      "credentials": {
        "googlePalmApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "a2b325b5-c5af-4540-acb2-d0fc378fee09",
      "name": "Offload Lead Tool",
      "type": "n8n-nodes-base.highLevelTool",
      "position": [
        1536,
        1104
      ],
      "parameters": {
        "contactId": "={{ $json.id }}",
        "operation": "update",
        "updateFields": {
          "dnd": true
        },
        "requestOptions": {}
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "d302fac0-bf6a-4c74-9eb7-5b4687362095",
      "name": "If Not Do Not Disturb",
      "type": "n8n-nodes-base.if",
      "position": [
        976,
        880
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "0a871a82-0677-40d2-b476-6c9ff6a54d31",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.dnd }}",
              "rightValue": false
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "f5c79486-d856-42d4-b20d-d332a4933ae4",
      "name": "Create Contact Tool",
      "type": "n8n-nodes-base.highLevelTool",
      "position": [
        1680,
        1104
      ],
      "parameters": {
        "email": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Email', ``, 'string') }}",
        "phone": "={{ $('When WhatsApp Message Received').item.json.contacts[0].wa_id }}",
        "requestOptions": {},
        "additionalFields": {
          "lastName": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('Last_Name', ``, 'string') }}",
          "firstName": "={{ /*n8n-auto-generated-fromAI-override*/ $fromAI('First_Name', ``, 'string') }}"
        }
      },
      "credentials": {
        "highLevelOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "7d076efa-c031-4cbd-a4ba-327f83a1e341",
      "name": "Parse Structured Output",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1840,
        1104
      ],
      "parameters": {
        "jsonSchemaExample": "{\n  \"user_reply\": \"Perfect, I have everything I need! I'll get your freight quote processed now. \ud83d\ude9b\",\n  \"is_data_collection_complete\": true,\n  \"Pickup_ZIP\": \"90210\",\n  \"Delivery_ZIP\": \"30301\",\n  \"No_of_Pallets\": 2,\n  \"Weight_per_pallet_in_lbs\": 10,\n  \"Pallet_Length\": 48,\n  \"Pallet_Width\": 40,\n  \"Pallet_Height\": 60,\n  \"Pickup_Appointment\": \"2026-06-20\",\n  \"Delivery_Appointment\": \"2026-06-20\",\n  \"Construction_Site_Pickup\": false,\n  \"Residential_Pickup\": false,\n  \"Limited_Access_Pickup\": false,\n  \"Convention_Trade_Show_Pickup\": false,\n  \"Liftgate_Pickup\": false,\n  \"Cubic_Capacity\": false,\n  \"Linear_Foot_Rules\": false,\n  \"Floor_Loaded\": false,\n  \"Inside_pickup_upstairs_mezzanine_trash_removal\": false,\n  \"Inside_pickup_back_side_of_the_house\": false,\n  \"Inside_pickup_Living_space_garage\": false,\n  \"Refrigerated\": false,\n  \"Driver_Assist_Pickup\": false,\n  \"Construction_Site_Delivery\": false,\n  \"Residential_Delivery\": true,\n  \"Limited_Access_Delivery\": false,\n  \"Convention_Trade_Show_Delivery\": false,\n  \"Liftgate_Delivery\": true,\n  \"Inside_delivery_upstairs_mezzanine_trash_removal\": false,\n  \"Inside_delivery_back_side_of_the_house\": false,\n  \"Inside_delivery_living_space_garage\": false,\n  \"Two_Man_Delivery\": false,\n  \"Driver_Assist_Delivery\": false\n}"
      },
      "retryOnFail": true,
      "typeVersion": 1.3
    },
    {
      "id": "e6c9e7d1-9b13-4e88-99d4-7ae937d56e12",
      "name": "If Data Collected",
      "type": "n8n-nodes-base.if",
      "position": [
        2048,
        864
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "3ed59445-7f07-4161-8f73-3656b1dbf8e6",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $json.output.is_data_collection_complete }}",
              "rightValue": ""
            }
          ]
        },
        "looseTypeValidation": true
      },
      "typeVersion": 2.3
    },
    {
      "id": "c288179d-a376-4636-b275-503f80789f74",
      "name": "Send WhatsApp Message",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        2272,
        976
      ],
      "parameters": {
        "textBody": "={{ $json.output.user_reply }}",
        "operation": "send",
        "phoneNumberId": "1083481144853090",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('When WhatsApp Message Received').item.json.contacts[0].wa_id }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "549caaaa-bdbe-48bc-9b87-ab0eb0c1c2a4",
      "name": "Post Quote Request",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2048,
        544
      ],
      "parameters": {
        "url": "https://www.wearewarp.com/api/v1/ltl/quote",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"origin_zip\": \"{{ $json.output.Pickup_ZIP }}\",\n  \"destination_zip\": \"{{ $json.output.Delivery_ZIP }}\",\n  \"pickup_date\": \"{{ $json.output.Pickup_Appointment }}\",\n  \"delivery_date\": \"{{ $json.output.Delivery_Appointment }}\",\n  \"pallets\": {{ $json.output.No_of_Pallets }},\n  \"weight_lbs_per_pallet\": 100,\n  \"length_in\": {{ $json.output.Pallet_Length }},\n  \"width_in\": {{ $json.output.Pallet_Width }},\n  \"height_in\": {{ $json.output.Pallet_Height }},\n  \"accessorials\": {\n    \"pickup\": {{ JSON.stringify([\n      $json.output.Liftgate_Pickup ? \"liftgate_pickup\" : null,\n      $json.output.Residential_Pickup ? \"residential_pickup\" : null,\n      $json.output.Limited_Access_Pickup ? \"limited_access_pickup\" : null,\n      $json.output.Driver_Assist_Pickup ? \"driver_assist_pickup\" : null,\n      $json.output.Pickup_Appointment ? \"appointment\" : null\n    ].filter(Boolean)) }},\n    \"delivery\": {{ JSON.stringify([\n      $json.output.Liftgate_Delivery ? \"liftgate_delivery\" : null,\n      $json.output.Residential_Delivery ? \"residential_delivery\" : null,\n      $json.output.Limited_Access_Delivery ? \"limited_access_delivery\" : null,\n      $json.output.Driver_Assist_Delivery ? \"driver_assist_delivery\" : null,\n      $json.output.Delivery_Appointment ? \"appointment\" : null\n    ].filter(Boolean)) }}\n  }\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth"
      },
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.4
    },
    {
      "id": "514070bb-3eb2-4d4a-ae4e-b2f0516209c9",
      "name": "Set Commission Percentage",
      "type": "n8n-nodes-base.set",
      "position": [
        2272,
        544
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "881cbcf2-7f47-4aa1-ac1c-71f11906bb6d",
              "name": "commision in %",
              "type": "number",
              "value": 15
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2a4b17ea-7ccb-4602-aaeb-855576aaa0ec",
      "name": "Calculate Commissioned Rate",
      "type": "n8n-nodes-base.code",
      "position": [
        2496,
        544
      ],
      "parameters": {
        "jsCode": "// Fetch all items from both nodes to process arrays cleanly\nconst httpItems = $('Post Quote Request').all();\nconst currentItems = $input.all();\n\nreturn currentItems.map((item, index) => {\n  // Match items by index, or fallback to the first HTTP item if it's a 1-to-many merge\n  const httpItem = httpItems[index] || httpItems[0] || { json: {} };\n\n  // Parse values safely to prevent NaN errors\n  const basePrice = parseFloat(httpItem.json.price_usd) || 0;\n  const commissionPct = parseFloat(item.json[\"commision in %\"]) || 0;\n\n  // Calculate the raw final price\n  const rawFinalPrice = basePrice + (basePrice * (commissionPct / 100));\n  \n  // Format to exactly 2 decimal places and convert back to a Number type\n  const finalPrice = Number(rawFinalPrice.toFixed(2));\n\n  return {\n    json: {\n      // Dynamically pull in every field from the HTTP Request\n      ...httpItem.json,\n      \n      // Override the base price with the rounded final price\n      price_usd: finalPrice,\n      \n      // Optional: Store the original values for audit/debugging\n      _original_base_price: basePrice,\n      _commission_applied: commissionPct\n    }\n  };\n});"
      },
      "typeVersion": 2
    },
    {
      "id": "a0581746-fe1f-477a-a3de-22707fb84cf9",
      "name": "Send Quote to WhatsApp",
      "type": "n8n-nodes-base.whatsApp",
      "position": [
        2720,
        544
      ],
      "parameters": {
        "textBody": "=\ud83d\udce6 *Your Freight Quote is Ready!*\n\nHere are the estimated details for your shipment:\n\n\ud83d\udcb0 *Estimated Quote:* {{ $json.price_usd }} {{ $json.currency }}\n\u23f1\ufe0f *Transit Time:* {{ $json.transit_days }} days\n\ud83d\udcc5 *Pickup Date:* {{ $json.pickup_date }}\n\ud83d\ude9a *Delivery Date:* {{ $json.delivery_date }}\n\n\ud83d\udccb *Shipment Specs:*\n\u2022 *Number of Pallets:* {{ $('If Data Collected').item.json.output.No_of_Pallets }}\n\u2022 *Weight per Pallet:* {{ $json.assumptions.weight_lbs_per_pallet }} \n\n\u23f3 _Please note: This quotation is dynamic and valid for only a few minutes._",
        "operation": "send",
        "phoneNumberId": "1083481144853090",
        "additionalFields": {},
        "recipientPhoneNumber": "={{ $('When WhatsApp Message Received').item.json.contacts[0].wa_id }}"
      },
      "credentials": {
        "whatsAppApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "9b193b06-6a45-4bde-ad98-34d0f6c1ec6b",
      "name": "Redis Chat Memory1",
      "type": "@n8n/n8n-nodes-langchain.memoryRedisChat",
      "position": [
        1376,
        1104
      ],
      "parameters": {
        "sessionKey": "={{ $('When WhatsApp Message Received').item.json.messages[0].from }}",
        "sessionTTL": 55000,
        "sessionIdType": "customKey"
      },
      "credentials": {
        "redis": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.6
    }
  ],
  "active": true,
  "settings": {
    "binaryMode": "separate",
    "availableInMCP": false,
    "executionOrder": "v1"
  },
  "versionId": "6671d93c-9e1c-4976-b101-b37d7f97ccba",
  "nodeGroups": [],
  "connections": {
    "If Data Collected": {
      "main": [
        [
          {
            "node": "Post Quote Request",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send WhatsApp Message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Offload Lead Tool": {
      "ai_tool": [
        [
          {
            "node": "Lead Processing Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Post Quote Request": {
      "main": [
        [
          {
            "node": "Set Commission Percentage",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Redis Chat Memory1": {
      "ai_memory": [
        [
          {
            "node": "Lead Processing Agent",
            "type": "ai_memory",
            "index": 0
          }
        ]
      ]
    },
    "Create Contact Tool": {
      "ai_tool": [
        [
          {
            "node": "Lead Processing Agent",
            "type": "ai_tool",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Model": {
      "ai_languageModel": [
        [
          {
            "node": "Lead Processing Agent",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Check Message Content": {
      "main": [
        [
          {
            "node": "Fetch HighLevel Contacts",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Not Do Not Disturb": {
      "main": [
        [
          {
            "node": "Lead Processing Agent",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Lead Processing Agent": {
      "main": [
        [
          {
            "node": "If Data Collected",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse Structured Output": {
      "ai_outputParser": [
        [
          {
            "node": "Lead Processing Agent",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Fetch HighLevel Contacts": {
      "main": [
        [
          {
            "node": "If Not Do Not Disturb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Commission Percentage": {
      "main": [
        [
          {
            "node": "Calculate Commissioned Rate",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Calculate Commissioned Rate": {
      "main": [
        [
          {
            "node": "Send Quote to WhatsApp",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When WhatsApp Message Received": {
      "main": [
        [
          {
            "node": "Check Message Content",
            "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

Youtube Video: https://youtu.be/kO4LgKT6oME?si=VpUEz2LKuxMujrUp This workflow receives WhatsApp messages, checks the sender in HighLevel, and uses Google Gemini with Redis chat memory to collect shipment details, then requests an LTL quote from the Warp API, applies a…

Source: https://n8n.io/workflows/16385/ — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

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

AI & RAG

Transform your salon/service business with this streamlined WhatsApp automation system featuring Claude integration, zero-setup database management, and intelligent conversation handling. Claude MCP I

WhatsApp Trigger, WhatsApp, Redis +11
AI & RAG

This workflow creates an intelligent WhatsApp bot that analyzes product ingredients and provides instant safety assessments. Users can send either text queries (product names/brands) or images of prod

WhatsApp Trigger, WhatsApp, HTTP Request +3
AI & RAG

Youtube Video For Workflow Explanation: https://youtu.be/3VTYQU7N6uU

Agent, Google Gemini Chat, Memory Redis Chat +4
AI & RAG

CashMate – Your AI-Powered WhatsApp Finance Agent Turn WhatsApp into a smart finance assistant that auto-registers you, logs transactions in natural language, extracts data from receipts and voice not

Tool Code, Output Parser Structured, Tool Calculator +6
AI & RAG

This workflow creates a complete AI-powered restaurant ordering system through WhatsApp. It receives customer messages, processes multimedia content (text, voice, images, PDFs, location), uses GPT-4 t

OpenAI Chat, Memory Postgres Chat, HTTP Request +6