{
  "name": "Manage supplier quote requests and follow-ups with Gmail, Sheets, GPT-4o-mini and WhatsApp",
  "nodes": [
    {
      "id": "8884e1ed-76a1-46b6-936c-e3e28da125a3",
      "name": "No Operation, do nothing1",
      "type": "n8n-nodes-base.noOp",
      "position": [
        400,
        -80
      ]
    },
    {
      "id": "3592e269-6faf-4d02-b08c-7477fcebff7c",
      "name": "No Operation, do nothing",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -80,
        672
      ]
    },
    {
      "id": "f02df9a1-5d0c-47d4-88ce-44937c8cee54",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1344,
        -672
      ],
      "parameters": {
        "width": 400,
        "height": 80,
        "content": "### WORKFLOW 2: RESPONSE MONITORING"
      }
    },
    {
      "id": "0d656144-eeb2-4ac8-a412-61f5f92da354",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1360,
        -272
      ],
      "parameters": {
        "width": 336,
        "height": 80,
        "content": "### WORKFLOW 3: AI PRICE EXTRACTION"
      }
    },
    {
      "id": "e8cbd10e-a3c4-4788-bf76-bd5c20f8aa77",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1408,
        416
      ],
      "parameters": {
        "width": 416,
        "height": 80,
        "content": "### WORKFLOW 4: WHATSAPP FOLLOW-UPS"
      }
    },
    {
      "id": "fd47901f-4c62-4289-b8e9-98fd38bbdd95",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2800,
        -576
      ],
      "parameters": {
        "width": 928,
        "height": 688,
        "content": "### Overview\nEliminate 90% of manual work in procurement by automating quote requests, response tracking, price extraction, and supplier follow-ups. \n\n### How it works\nThis workflow contains 4 indepen"
      }
    },
    {
      "id": "d6143e93-6ac1-4c9e-8991-6bec49c53640",
      "name": "Reach out to suppliers",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -1008,
        -944
      ]
    },
    {
      "id": "c48717c0-b4d1-4eed-a325-a06749505667",
      "name": "Save to Price Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        48,
        -208
      ]
    },
    {
      "id": "66cdab4d-7126-4865-a6bc-a26dae655e7b",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        240
      ],
      "parameters": {
        "width": 256,
        "height": 432,
        "content": "#### Configure Twilio WhatsApp Sandbox\n\nGo to Twilio Console → Messaging → Try it out → WhatsApp\nSend the join code from your phone (e.g., \"join happy-elephant\")\nCopy your sandbox number (e.g., +1 415"
      }
    },
    {
      "id": "47bd8e53-a970-4d0f-a350-64d7b36c2197",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -560,
        -240
      ],
      "parameters": {
        "width": 320,
        "height": 464,
        "content": "### Extract information from downloaded Pdf attachment\n\nObtain your API from https://platform.openai.com and connect your credentials"
      }
    },
    {
      "id": "c4a6eb32-9b12-4db7-b982-f790ee1a30b7",
      "name": "Information Extractor",
      "type": "@n8n/n8n-nodes-langchain.informationExtractor",
      "position": [
        -512,
        -80
      ]
    },
    {
      "id": "37a01b6c-1040-4e55-b5e9-6f457e50ccf0",
      "name": "Execute workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -1584,
        -944
      ]
    },
    {
      "id": "e38ca5d0-59a7-40c6-9275-ee134c237c63",
      "name": "Trigger workflow every hour",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1712,
        -432
      ]
    },
    {
      "id": "a8ae81e6-f54c-4a21-b72c-1cb4c76cc1f3",
      "name": "Trigger workflow daily",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1760,
        -80
      ]
    },
    {
      "id": "158cd842-3cc3-4422-9221-ae67195ecb84",
      "name": "Trigger workflow daily1",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1760,
        720
      ]
    },
    {
      "id": "7dc4af35-2112-4499-a9fb-ba760329f1e7",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1408,
        -1088
      ],
      "parameters": {
        "width": 288,
        "height": 352,
        "content": "\nCode in JavaScript hardcodes the details of the suppliers. This can however be customized by changing the node to fetch the details from different sources."
      }
    },
    {
      "id": "2820ea83-a045-4f41-a675-6d3e387e1661",
      "name": "Hardcode suppliers details",
      "type": "n8n-nodes-base.code",
      "position": [
        -1344,
        -944
      ]
    },
    {
      "id": "5e86a720-a02d-4fb7-9ef2-5d2b2e706eb8",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1024,
        -1056
      ],
      "parameters": {
        "width": 368,
        "height": 320,
        "content": "Reach out to suppliers and log details of suppliers to supplier_list sheet."
      }
    },
    {
      "id": "6b4e3235-f004-4cfc-91c8-eef21ce76112",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1520,
        -528
      ],
      "parameters": {
        "width": 544,
        "height": null,
        "content": "Searches mail for responses from suppliers ever hour, if there is a response, node 2 extracts the response, parses the mail and looks out for an attachment."
      }
    },
    {
      "id": "675416b6-adc4-4152-be2d-ec28d44986db",
      "name": "Sticky Note10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -928,
        -544
      ],
      "parameters": {
        "width": 400,
        "height": null,
        "content": "If mail has attachment, the true branch returns an out put which is then used to update the quotes_received, follow-up needed and status columns in the supplier sheet."
      }
    },
    {
      "id": "554eacd4-e42b-4c35-8e26-c19ef85150e3",
      "name": "Log to suppliers sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -752,
        -944
      ]
    },
    {
      "id": "87bca557-d7df-4aa0-8647-e80980130330",
      "name": "Search for quote replies",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -1504,
        -432
      ]
    },
    {
      "id": "68fd9337-3979-4c75-9e99-f6d55816f6a9",
      "name": "Get email details",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -1312,
        -432
      ]
    },
    {
      "id": "45bed9fe-964f-48bc-9f56-5566da53e353",
      "name": "Parse email data",
      "type": "n8n-nodes-base.code",
      "position": [
        -1104,
        -432
      ]
    },
    {
      "id": "1fb50326-40a3-4595-a690-f50e442a02f6",
      "name": "Has attachments?",
      "type": "n8n-nodes-base.if",
      "position": [
        -912,
        -432
      ]
    },
    {
      "id": "64e6f57b-2b93-420f-9fb0-aed4bd1a1d00",
      "name": "Update supplier sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -640,
        -448
      ]
    },
    {
      "id": "ac3e5c25-5512-498f-9b05-1c4f324f2616",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1632,
        -176
      ],
      "parameters": {
        "width": 624,
        "height": null,
        "content": "This reads the 'quote received' column of the supplier_list sheet, and outputs the row(s) of the suppliers who has sent their quotes. the Get Supplier node then gets the email using the mail of the su"
      }
    },
    {
      "id": "afac5d7c-7381-4d7f-afdf-b2f4fde2eef4",
      "name": "Get quotes to process",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1552,
        -80
      ]
    },
    {
      "id": "95704505-e499-488c-8e4e-8e36af32a19f",
      "name": "Get supplier email",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -1344,
        -80
      ]
    },
    {
      "id": "ec168287-7299-4aea-bb5d-d32c6f75dc44",
      "name": "Download all attachments",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -1136,
        -80
      ]
    },
    {
      "id": "05bea877-4305-48f7-8429-ee78c94723c1",
      "name": "Extract from file",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -928,
        -80
      ]
    },
    {
      "id": "f418f63b-9653-45ea-877b-5db38c7db85c",
      "name": "Prepare for openAI",
      "type": "n8n-nodes-base.code",
      "position": [
        -720,
        -80
      ]
    },
    {
      "id": "e4b02c68-6592-4bb4-b8cb-e6d6e95dc896",
      "name": "Extract key information from invoice",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -416,
        112
      ]
    },
    {
      "id": "bc888fa7-17f3-496c-8030-17d0e6c19260",
      "name": "Parse model output ",
      "type": "n8n-nodes-base.code",
      "position": [
        -160,
        -80
      ]
    },
    {
      "id": "66c358cf-5a26-4dfc-b829-7c4f17d1d66e",
      "name": "Sticky Note12",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -192,
        -320
      ],
      "parameters": {
        "width": 448,
        "height": 560,
        "content": "Parses extracted output to a valid json format, then updates the 'price comparison' sheet. \n\nAlso updates the supplier_list sheet with the phone number extracted from invoice for record keeping"
      }
    },
    {
      "id": "35e26efe-8357-4905-bafc-247be7fe50de",
      "name": "Update supplier sheet with phone number",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        64,
        64
      ]
    },
    {
      "id": "f15c3136-0a6a-4f35-ba5d-e98e1274ef04",
      "name": "Sticky Note11",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1600,
        592
      ],
      "parameters": {
        "width": 624,
        "height": 208,
        "content": "Searches the supplier_list sheet to get a list of suppliers who needs a reminder to send their quote. If a follow up is needed, the true branch of the follow up node returns an output."
      }
    },
    {
      "id": "38db00a6-6879-457a-add8-454c0922ff52",
      "name": "Sticky Note13",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        512
      ],
      "parameters": {
        "width": 320,
        "height": 336,
        "content": "A customized message is prepared and sent to suppliers through to phone numbers or their email address if no phone number."
      }
    },
    {
      "id": "9953a097-591d-4969-aea8-a4b3230bdaf0",
      "name": "Prepare message",
      "type": "n8n-nodes-base.code",
      "position": [
        -896,
        704
      ]
    },
    {
      "id": "48088f7d-6ffa-427e-9703-13af427a2e5a",
      "name": "Has phone number?",
      "type": "n8n-nodes-base.if",
      "position": [
        -720,
        656
      ]
    },
    {
      "id": "34154208-d4f2-411f-bac9-91927d5b4822",
      "name": "Send follow-up mail",
      "type": "n8n-nodes-base.gmail",
      "position": [
        -496,
        816
      ]
    },
    {
      "id": "f0cffc9e-8fd1-4d49-a008-3d6a82b3b97c",
      "name": "Update follow up count in supplier sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -288,
        672
      ]
    },
    {
      "id": "99933e9c-5b6c-43a3-a487-5d67e086573b",
      "name": "Any follow-ups needed?",
      "type": "n8n-nodes-base.if",
      "position": [
        -1120,
        720
      ]
    },
    {
      "id": "df549c40-cced-411d-923e-4d34b0bbc765",
      "name": "Filter pending quotes",
      "type": "n8n-nodes-base.code",
      "position": [
        -1328,
        720
      ]
    },
    {
      "id": "0b0e3c85-e225-4480-b327-297e9c269e54",
      "name": "Get all quotes",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -1536,
        720
      ]
    },
    {
      "id": "95d43639-452f-4ab6-9b0b-bea44864acfe",
      "name": "Send WhatsApp follow-up message",
      "type": "n8n-nodes-base.twilio",
      "position": [
        -496,
        496
      ]
    }
  ],
  "connections": {
    "Get all quotes": {
      "main": [
        [
          {
            "node": "Filter pending quotes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare message": {
      "main": [
        [
          {
            "node": "Has phone number?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Execute workflow": {
      "main": [
        [
          {
            "node": "Hardcode suppliers details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has attachments?": {
      "main": [
        [
          {
            "node": "Update supplier sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse email data": {
      "main": [
        [
          {
            "node": "Has attachments?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract from file": {
      "main": [
        [
          {
            "node": "Prepare for openAI",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get email details": {
      "main": [
        [
          {
            "node": "Parse email data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Has phone number?": {
      "main": [
        [
          {
            "node": "Send WhatsApp follow-up message",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send follow-up mail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get supplier email": {
      "main": [
        [
          {
            "node": "Download all attachments",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare for openAI": {
      "main": [
        [
          {
            "node": "Information Extractor",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Parse model output ": {
      "main": [
        [
          {
            "node": "Update supplier sheet with phone number",
            "type": "main",
            "index": 0
          },
          {
            "node": "Save to Price Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Save to Price Sheet": {
      "main": [
        [
          {
            "node": "No Operation, do nothing1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send follow-up mail": {
      "main": [
        [
          {
            "node": "Update follow up count in supplier sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter pending quotes": {
      "main": [
        [
          {
            "node": "Any follow-ups needed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get quotes to process": {
      "main": [
        [
          {
            "node": "Get supplier email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Information Extractor": {
      "main": [
        [
          {
            "node": "Parse model output ",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Any follow-ups needed?": {
      "main": [
        [
          {
            "node": "Prepare message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Reach out to suppliers": {
      "main": [
        [
          {
            "node": "Log to suppliers sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger workflow daily": {
      "main": [
        [
          {
            "node": "Get quotes to process",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger workflow daily1": {
      "main": [
        [
          {
            "node": "Get all quotes",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Download all attachments": {
      "main": [
        [
          {
            "node": "Extract from file",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Search for quote replies": {
      "main": [
        [
          {
            "node": "Get email details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Hardcode suppliers details": {
      "main": [
        [
          {
            "node": "Reach out to suppliers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Trigger workflow every hour": {
      "main": [
        [
          {
            "node": "Search for quote replies",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send WhatsApp follow-up message": {
      "main": [
        [
          {
            "node": "Update follow up count in supplier sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract key information from invoice": {
      "ai_languageModel": [
        [
          {
            "node": "Information Extractor",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Update follow up count in supplier sheet": {
      "main": [
        [
          {
            "node": "No Operation, do nothing",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}