AutomationFlowsEmail & Gmail › Automate Inventory Reordering and Vendor Bill Approvals with Odoo, Gmail,…

Automate Inventory Reordering and Vendor Bill Approvals with Odoo, Gmail,…

Original n8n title: Automate Inventory Reordering and Vendor Bill Approvals with Odoo, Gmail, and Slack

ByAnir Agram @not0lucky on n8n.io

This workflow automates two Odoo processes: a daily low-stock check that drafts purchase orders and emails vendors via Gmail, and an email-driven vendor bill intake flow that routes draft bills to Slack for approval before posting them in Odoo. Runs daily at 8:00 AM and fetches…

Cron / scheduled trigger★★★★★ complexity30 nodesOdooGmailSlackGmail Trigger
Email & Gmail Trigger: Cron / scheduled Nodes: 30 Complexity: ★★★★★ Added:
Automate Inventory Reordering and Vendor Bill Approvals with Odoo, Gmail,… — n8n workflow card showing Odoo, Gmail, Slack integration

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

This workflow follows the Gmail → Gmail Trigger 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
{
  "name": "Automate inventory reordering and vendor bill approval with Odoo, Gmail, and Slack",
  "tags": [],
  "nodes": [
    {
      "id": "46ffc3b2-7de3-41e7-a942-bfdfb824f06d",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -848,
        0
      ],
      "parameters": {
        "width": 480,
        "height": 896,
        "content": "## Automate inventory reordering and vendor bill approval with Odoo, Gmail, and Slack\n\n### How it works\n\nThis workflow automates two purchasing operations: a scheduled daily inventory reorder check and an email-driven vendor bill approval process. It checks Odoo for low-stock products, creates draft purchase orders, emails vendors, and notifies procurement in Slack. Separately, it watches Gmail for vendor bills, extracts bill details, creates draft bills in Odoo, requests finance approval in Slack, and either posts the bill or asks the submitter for changes.\n\n### Setup steps\n\n- Configure Odoo credentials and verify access to products, vendors, purchase orders, vendor partners, and vendor bills.\n- Configure Gmail credentials for both the vendor bill trigger mailbox and outbound notification emails.\n- Configure Slack credentials and set the procurement, finance approval, and automation error channels or users.\n- Set the daily schedule trigger to the desired timezone and confirm the reorder threshold logic in the low-stock Odoo query.\n- Define the Gmail trigger filters for vendor bill emails and verify the extraction fields for vendor name, bill amount, reference, and submitter email.\n\n### Customization\n\nAdjust reorder thresholds, preferred vendor selection rules, Slack approval recipients, email templates, and Odoo draft/confirmation fields to match internal purchasing and finance policies."
      },
      "typeVersion": 1
    },
    {
      "id": "2827884c-48a6-418e-bc3c-4d0b9c9b33f2",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 752,
        "height": 304,
        "content": "## Check reorder need\n\nStarts the daily 8AM inventory check, retrieves low-stock products from Odoo, and decides whether any products fall below the reorder threshold."
      },
      "typeVersion": 1
    },
    {
      "id": "6cb9e330-005c-44ef-8fa2-03fb0fbe72a9",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        560,
        32
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 576,
        "content": "## Resolve reorder vendors\n\nHandles the immediate branch after the threshold decision: it either notifies Slack that no reorder is needed or enriches low-stock items with preferred vendor and vendor contact details from Odoo."
      },
      "typeVersion": 1
    },
    {
      "id": "44846187-70e6-4c8d-9d2c-1460ffb2ccd3",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 464,
        "height": 304,
        "content": "## Draft and email PO\n\nCreates draft purchase orders in Odoo and sends the draft PO details to the vendor by Gmail."
      },
      "typeVersion": 1
    },
    {
      "id": "c264e69e-a8bb-4cc0-a29a-21287c3c35d1",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1680,
        0
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 368,
        "content": "## Notify procurement team\n\nSends the final Slack notification to procurement after draft purchase orders have been created and emailed."
      },
      "typeVersion": 1
    },
    {
      "id": "f880568d-52c3-43a9-a47d-bb52d00d7be6",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -288,
        672
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 320,
        "content": "## Capture bill email\n\nWatches Gmail for incoming vendor bill emails and extracts the vendor, amount, reference, and submitter information for downstream processing."
      },
      "typeVersion": 1
    },
    {
      "id": "3a6b9089-5b5f-40d3-bc86-2c0755dbbf97",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        272,
        704
      ],
      "parameters": {
        "color": 7,
        "width": 752,
        "height": 512,
        "content": "## Validate bill vendor\n\nLooks up the vendor partner in Odoo, branches based on whether the vendor is recognized, and emails the submitter when the vendor cannot be matched."
      },
      "typeVersion": 1
    },
    {
      "id": "6bbc1ee0-2ffe-477a-b24a-883526743fd3",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1056,
        672
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 320,
        "content": "## Create approval request\n\nCreates a draft vendor bill in Odoo for recognized vendors and sends a Slack send-and-wait request to finance for approval."
      },
      "typeVersion": 1
    },
    {
      "id": "02975bf4-ff02-4cf6-8eb3-0f8142f49b0c",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1568,
        672
      ],
      "parameters": {
        "color": 7,
        "width": 480,
        "height": 528,
        "content": "## Process approval outcome\n\nEvaluates the finance approval response, posts the vendor bill in Odoo when approved, or emails the submitter when the bill needs changes."
      },
      "typeVersion": 1
    },
    {
      "id": "8274a83c-025f-41bd-89d2-90115cb5637e",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        1248
      ],
      "parameters": {
        "color": 7,
        "width": 240,
        "height": 416,
        "content": "## Report automation errors\n\nCentralized Slack notification node for errors from Odoo, Gmail, and Slack actions across both the reorder and vendor bill approval flows."
      },
      "typeVersion": 1
    },
    {
      "id": "86c3907f-c667-442b-bf63-a236d4f97ca8",
      "name": "When Reorder Check at 8AM",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -240,
        208
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "e2c5a487-f343-424c-8f88-ed023f827e21",
      "name": "Fetch Low-Stock Products in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        48,
        208
      ],
      "parameters": {
        "options": {
          "fieldsList": "id,name,default_code,qty_available,list_price,standard_price,uom_id,product_tmpl_id"
        },
        "resource": "custom",
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "product.product",
          "cachedResultName": "product.product"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "alwaysOutputData": true,
      "waitBetweenTries": 5000
    },
    {
      "id": "0ea85cca-9561-4367-bb41-e2dee2c581f6",
      "name": "Check Products Below Reorder Level",
      "type": "n8n-nodes-base.if",
      "position": [
        320,
        208
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.id ? 'yes' : 'no' }}",
              "rightValue": "yes"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "b671690e-1031-46a9-aff1-fcc389aa9d08",
      "name": "Fetch Preferred Vendor in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        608,
        208
      ],
      "parameters": {
        "limit": 1,
        "options": {
          "fieldsList": "id,partner_id,price,min_qty,delay"
        },
        "resource": "custom",
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "product.supplierinfo",
          "cachedResultName": "product.supplierinfo"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "alwaysOutputData": true,
      "waitBetweenTries": 5000
    },
    {
      "id": "2d20f144-2c49-40a3-888b-c0f55bd2802e",
      "name": "Fetch Vendor Contact in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        880,
        208
      ],
      "parameters": {
        "options": {
          "fieldsList": "id,name,email"
        },
        "recordId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Fetch Preferred Vendor in Odoo').item.json.partner_id[0] }}",
          "cachedResultName": "Vendor partner ID"
        },
        "resource": "custom",
        "operation": "get",
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "res.partner",
          "cachedResultName": "res.partner"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "waitBetweenTries": 5000
    },
    {
      "id": "c8ebf7bf-bab7-4e89-9a89-872aa785aee8",
      "name": "Create Draft Purchase Order in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        1168,
        208
      ],
      "parameters": {
        "resource": "custom",
        "operation": "create",
        "fieldsToSend": {
          "value": {
            "date_order": "={{ $now.toISO() }}",
            "order_line": "={{ [[0,0,{ product_id: $('Fetch Low-Stock Products in Odoo').item.json.id, name: $('Fetch Low-Stock Products in Odoo').item.json.name, product_qty: 20, product_uom: $('Fetch Low-Stock Products in Odoo').item.json.uom_id[0], price_unit: $('Fetch Low-Stock Products in Odoo').item.json.standard_price }]] }}",
            "partner_id": "={{ $('Fetch Vendor Contact in Odoo').item.json.id }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "purchase.order",
          "cachedResultName": "purchase.order"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "waitBetweenTries": 5000
    },
    {
      "id": "e27e794e-8e82-4ae9-b4da-381735f3d7ff",
      "name": "Send Draft PO Email via Gmail",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        1440,
        208
      ],
      "parameters": {
        "sendTo": "={{ $('Fetch Vendor Contact in Odoo').item.json.email }}",
        "message": "={{ 'Hi ' + $('Fetch Vendor Contact in Odoo').item.json.name + ',\n\nWe have drafted a new purchase order in our system to replenish stock.\n\nPO Reference: #' + $json.id + '\nProduct: ' + $('Fetch Low-Stock Products in Odoo').item.json.name + ' (' + $('Fetch Low-Stock Products in Odoo').item.json.default_code + ')\nQuantity: 20\nUnit Price: ' + $('Fetch Low-Stock Products in Odoo').item.json.standard_price + '\n\nPlease confirm availability and lead time at your earliest convenience.\n\nThanks,\nProcurement Team' }}",
        "options": {},
        "subject": "={{ 'Purchase Order Draft #' + $json.id + ' - ' + $('Fetch Vendor Contact in Odoo').item.json.name }}"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "9a8038fc-0463-4875-8557-804587885f2f",
      "name": "Post Draft Notification to Procurement",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        1728,
        208
      ],
      "parameters": {
        "text": "={{ ':page_facing_up: Auto-drafted PO #' + $('Create Draft Purchase Order in Odoo').item.json.id + ' for ' + $('Fetch Low-Stock Products in Odoo').item.json.name + ' \u2014 sent to ' + $('Fetch Vendor Contact in Odoo').item.json.name + ' for review.' }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#procurement",
          "cachedResultName": "procurement"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.5
    },
    {
      "id": "37bce38b-6d18-40fe-a28e-7e80ff4e7806",
      "name": "Post No Reorder Needed to Procurement",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        608,
        448
      ],
      "parameters": {
        "text": "\u2705 Daily inventory check complete \u2014 no products fell below the reorder threshold today.",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#procurement",
          "cachedResultName": "procurement"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.5
    },
    {
      "id": "10bacb3e-ee0f-47a7-afcf-d9f17f99d02b",
      "name": "When Vendor Bill Email Received",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        -240,
        832
      ],
      "parameters": {
        "filters": {
          "q": "subject:(\"vendor bill\" OR invoice)",
          "readStatus": "unread"
        },
        "pollTimes": {
          "item": [
            {
              "mode": "everyX",
              "unit": "minutes",
              "value": 5
            }
          ]
        }
      },
      "typeVersion": 1.4
    },
    {
      "id": "baab9cad-b9d4-4542-a3e2-4acc56437230",
      "name": "Set Vendor Bill Information",
      "type": "n8n-nodes-base.set",
      "position": [
        48,
        832
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "f1",
              "name": "vendorName",
              "type": "string",
              "value": "={{ (($json.subject||'').match(/Vendor:\\s*([^|]+)/) || [])[1]?.trim() || '' }}"
            },
            {
              "id": "f2",
              "name": "billAmount",
              "type": "number",
              "value": "={{ Number((($json.subject||'').match(/Amount:\\s*([0-9.]+)/) || [])[1] || 0) }}"
            },
            {
              "id": "f3",
              "name": "billReference",
              "type": "string",
              "value": "={{ (($json.subject||'').match(/Ref:\\s*(\\S+)/) || [])[1] || ('BILL-' + Date.now()) }}"
            },
            {
              "id": "f4",
              "name": "submitterEmail",
              "type": "string",
              "value": "={{ $json.from }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "a467ab40-f868-45f0-ba14-d92973610cc3",
      "name": "Check Vendor in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        320,
        832
      ],
      "parameters": {
        "limit": 1,
        "options": {
          "fieldsList": "id,name,email"
        },
        "resource": "custom",
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "res.partner",
          "cachedResultName": "res.partner"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "alwaysOutputData": true,
      "waitBetweenTries": 5000
    },
    {
      "id": "c055fd17-a39e-4dcc-812a-ba2fc84e5d40",
      "name": "Verify Vendor Recognition in Odoo",
      "type": "n8n-nodes-base.if",
      "position": [
        608,
        832
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.id ? 'yes' : 'no' }}",
              "rightValue": "yes"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "77499a23-0682-498e-a8d4-cd5a24552141",
      "name": "Create Draft Vendor Bill in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        1104,
        832
      ],
      "parameters": {
        "resource": "custom",
        "operation": "create",
        "fieldsToSend": {
          "value": {
            "ref": "={{ $('Set Vendor Bill Information').item.json.billReference }}",
            "move_type": "in_invoice",
            "partner_id": "={{ $('Check Vendor in Odoo').item.json.id }}",
            "invoice_date": "={{ $now.toFormat('yyyy-MM-dd') }}",
            "invoice_line_ids": "={{ [[0,0,{ name: 'Vendor bill \u2014 ' + $('Set Vendor Bill Information').item.json.billReference, quantity: 1, price_unit: $('Set Vendor Bill Information').item.json.billAmount }]] }}"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "account.move",
          "cachedResultName": "account.move"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "waitBetweenTries": 5000
    },
    {
      "id": "2fb54da6-48a5-4a1e-867b-e0e6e5344b79",
      "name": "Notify Vendor Not Recognized via Gmail",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        880,
        1040
      ],
      "parameters": {
        "sendTo": "={{ $('Set Vendor Bill Information').item.json.submitterEmail }}",
        "message": "={{ 'Hi,\n\nWe received a vendor bill referencing \"' + $('Set Vendor Bill Information').item.json.vendorName + '\" but could not match it to an existing vendor record in Odoo.\n\nPlease add this vendor to Odoo (Contacts > Create, mark as Vendor) or correct the vendor name, then resubmit the bill.\n\nReference: ' + $('Set Vendor Bill Information').item.json.billReference + '\nAmount: ' + $('Set Vendor Bill Information').item.json.billAmount + '\n\nThanks,\nFinance Automation' }}",
        "options": {},
        "subject": "={{ 'Action needed: vendor not recognized for bill ' + $('Set Vendor Bill Information').item.json.billReference }}"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "3b4ca96f-ff2d-44be-b12c-05dc2e00e57f",
      "name": "Request Finance Approval via Slack",
      "type": "n8n-nodes-base.slack",
      "onError": "continueErrorOutput",
      "position": [
        1392,
        832
      ],
      "parameters": {
        "select": "channel",
        "message": "={{ ':receipt: New vendor bill needs approval\n\n*Vendor:* ' + $('Check Vendor in Odoo').item.json.name + '\n*Amount:* ' + $('Set Vendor Bill Information').item.json.billAmount + '\n*Reference:* ' + $('Set Vendor Bill Information').item.json.billReference + '\n*Odoo Bill ID:* ' + $('Create Draft Vendor Bill in Odoo').item.json.id + ' (draft)\n\nApprove to post this bill to the books, or decline to send it back for changes.' }}",
        "options": {
          "limitWaitTime": {
            "values": {
              "resumeUnit": "days",
              "resumeAmount": 3
            }
          }
        },
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#finance-approvals",
          "cachedResultName": "finance-approvals"
        },
        "operation": "sendAndWait",
        "approvalOptions": {
          "values": {
            "approvalType": "double",
            "approveLabel": "Approve & Post",
            "disapproveLabel": "Needs Changes"
          }
        }
      },
      "typeVersion": 2.5
    },
    {
      "id": "f10f0179-dedb-4087-b0f0-ca46ad705e0b",
      "name": "Check Finance Approval Status",
      "type": "n8n-nodes-base.if",
      "position": [
        1616,
        832
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 1,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.data && $json.data.approved ? 'yes' : 'no' }}",
              "rightValue": "yes"
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "e755b607-574d-44c7-ab00-2114d8549d2e",
      "name": "Confirm and Post Bill in Odoo",
      "type": "n8n-nodes-base.odoo",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        1904,
        832
      ],
      "parameters": {
        "recordId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Create Draft Vendor Bill in Odoo').item.json.id }}",
          "cachedResultName": "Vendor bill ID"
        },
        "resource": "custom",
        "operation": "update",
        "fieldsToSend": {
          "value": {
            "state": "posted"
          },
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "authentication": "odooApi",
        "customResource": {
          "__rl": true,
          "mode": "id",
          "value": "account.move",
          "cachedResultName": "account.move"
        }
      },
      "retryOnFail": true,
      "typeVersion": 2,
      "waitBetweenTries": 5000
    },
    {
      "id": "42065265-222e-46eb-b2b7-c9a50daed0fd",
      "name": "Notify Bill Needs Changes via Gmail",
      "type": "n8n-nodes-base.gmail",
      "onError": "continueErrorOutput",
      "maxTries": 3,
      "position": [
        1904,
        1040
      ],
      "parameters": {
        "sendTo": "={{ $('Set Vendor Bill Information').item.json.submitterEmail }}",
        "message": "={{ 'Hi,\n\nThe finance team reviewed vendor bill ' + $('Set Vendor Bill Information').item.json.billReference + ' (Odoo draft #' + $('Create Draft Vendor Bill in Odoo').item.json.id + ') for ' + $('Set Vendor Bill Information').item.json.billAmount + ' and it needs changes before it can be posted.\n\nPlease review the amount, reference and supporting documents, then resubmit.\n\nThanks,\nFinance Team' }}",
        "options": {},
        "subject": "={{ 'Update needed: vendor bill ' + $('Set Vendor Bill Information').item.json.billReference + ' was not approved' }}"
      },
      "retryOnFail": true,
      "typeVersion": 2.2,
      "waitBetweenTries": 5000
    },
    {
      "id": "10746bb6-80a4-4201-bf4a-a111e796c99d",
      "name": "Notify Automation Error via Slack",
      "type": "n8n-nodes-base.slack",
      "onError": "continueRegularOutput",
      "position": [
        1168,
        1504
      ],
      "parameters": {
        "text": "={{ ':rotating_light: Odoo Inventory & Procurement Automation hit an error: ' + ($json.error && $json.error.message ? $json.error.message : ($json.message || 'Unknown error')) + ' \u2014 check the execution log in n8n for full details.' }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "name",
          "value": "#procurement-alerts",
          "cachedResultName": "procurement-alerts"
        },
        "otherOptions": {}
      },
      "typeVersion": 2.5
    }
  ],
  "active": false,
  "settings": {
    "binaryMode": "separate",
    "executionOrder": "v1",
    "saveManualExecutions": true,
    "saveExecutionProgress": true,
    "saveDataErrorExecution": "all",
    "saveDataSuccessExecution": "all"
  },
  "nodeGroups": [],
  "connections": {
    "Check Vendor in Odoo": {
      "main": [
        [
          {
            "node": "Verify Vendor Recognition in Odoo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Reorder Check at 8AM": {
      "main": [
        [
          {
            "node": "Fetch Low-Stock Products in Odoo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Vendor Bill Information": {
      "main": [
        [
          {
            "node": "Check Vendor in Odoo",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Vendor Contact in Odoo": {
      "main": [
        [
          {
            "node": "Create Draft Purchase Order in Odoo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Finance Approval Status": {
      "main": [
        [
          {
            "node": "Confirm and Post Bill in Odoo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Bill Needs Changes via Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Confirm and Post Bill in Odoo": {
      "main": [
        [],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Draft PO Email via Gmail": {
      "main": [
        [
          {
            "node": "Post Draft Notification to Procurement",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Preferred Vendor in Odoo": {
      "main": [
        [
          {
            "node": "Fetch Vendor Contact in Odoo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When Vendor Bill Email Received": {
      "main": [
        [
          {
            "node": "Set Vendor Bill Information",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Draft Vendor Bill in Odoo": {
      "main": [
        [
          {
            "node": "Request Finance Approval via Slack",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Low-Stock Products in Odoo": {
      "main": [
        [
          {
            "node": "Check Products Below Reorder Level",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Verify Vendor Recognition in Odoo": {
      "main": [
        [
          {
            "node": "Create Draft Vendor Bill in Odoo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Vendor Not Recognized via Gmail",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Products Below Reorder Level": {
      "main": [
        [
          {
            "node": "Fetch Preferred Vendor in Odoo",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Post No Reorder Needed to Procurement",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Request Finance Approval via Slack": {
      "main": [
        [
          {
            "node": "Check Finance Approval Status",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Draft Purchase Order in Odoo": {
      "main": [
        [
          {
            "node": "Send Draft PO Email via Gmail",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Bill Needs Changes via Gmail": {
      "main": [
        [],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Vendor Not Recognized via Gmail": {
      "main": [
        [],
        [
          {
            "node": "Notify Automation Error via Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow automates two Odoo processes: a daily low-stock check that drafts purchase orders and emails vendors via Gmail, and an email-driven vendor bill intake flow that routes draft bills to Slack for approval before posting them in Odoo. Runs daily at 8:00 AM and fetches…

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

14310 Send Overdue Invoice Payment Reminders With Ifirma Gmail Postgrid And Slack. Uses httpRequest, stopAndError, slack, gmail. Scheduled trigger; 53 nodes.

HTTP Request, Stop And Error, Slack +1
Email & Gmail

Instead of providing a routine check, it focuses on significant movements by: Sending a Slack alert only if a query crosses a defined movement threshold. Emailing a structured report with the Top 25 i

HTTP Request, Slack, Gmail
Email & Gmail

This workflow runs weekly to fetch customers from the Shopify Admin GraphQL API, calculate churn risk based on each customer’s median reorder interval, and then sync at-risk customers to Klaviyo while

Slack, HTTP Request, Gmail +2
Email & Gmail

This workflow monitors inventory from Google Sheets on a schedule, calculates reorder quantities using vendor lead times, logs pending reorders back to Google Sheets, and posts grouped reorder request

Google Sheets, Slack, Slack Trigger +1
Email & Gmail

This workflow automates the complete end-to-end processing of daily revenue transactions for finance and accounting teams. It systematically retrieves, validates, and standardizes transaction data fro

HTTP Request, Gmail, Google Drive +2