AutomationFlowsEmail & Gmail › Send Proposal Follow-ups and Update Deals with Hubspot, Gmail, Sheets and Slack

Send Proposal Follow-ups and Update Deals with Hubspot, Gmail, Sheets and Slack

ByAvkash Kakdiya @itechnotion on n8n.io

This workflow runs every weekday morning to find HubSpot deals with stale proposal activity, pulls the associated contact email, enforces opt-out and follow-up limits using Google Sheets, sends a value-based follow-up via Gmail, updates the HubSpot deal stage, and notifies the…

Cron / scheduled trigger★★★★☆ complexity24 nodesHubSpotGoogle SheetsSlackGmail
Email & Gmail Trigger: Cron / scheduled Nodes: 24 Complexity: ★★★★☆ Added:
Send Proposal Follow-ups and Update Deals with Hubspot, Gmail, Sheets and Slack — n8n workflow card showing HubSpot, Google Sheets, Slack integration

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

This workflow follows the Gmail → Google Sheets 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": "FZl9x4jdlezDMpFO",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Automated Proposal Follow-Up & Deal Stage Updater",
  "tags": [
    {
      "id": "4Of2LE0HSt4qmmUG",
      "name": "Ansh",
      "createdAt": "2026-04-20T10:32:01.726Z",
      "updatedAt": "2026-04-20T10:32:01.726Z"
    }
  ],
  "nodes": [
    {
      "id": "d8d48941-5b80-4b8c-a1f3-6b0067cee113",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        96,
        912
      ],
      "parameters": {
        "width": 512,
        "height": 688,
        "content": "##  Automated Proposal Follow-Up & Deal Stage Updater\nThis workflow automatically monitors deals where a proposal has been sent and takes action when prospects go silent. It enriches contact data, checks suppression lists, applies deal-value triage, caps follow-up attempts, sends personalised emails, updates HubSpot, logs every action, and alerts the sales team \u2014 all fully automated and production-safe.\n\n### How it works\n\n\t\u2022\tRuns every weekday morning at 9am.\n\t\u2022\tFetches Proposal-stage deals from HubSpot with no activity in 3+ days.\n\t\u2022\tEnriches each deal with the prospect's real email from their HubSpot contact.\n\t\u2022\tChecks a suppression list and a follow-up counter before sending anything.\n\t\u2022\tRoutes high-value vs standard deals to different email templates.\n\t\u2022\tSends the right follow-up email via Gmail and updates the deal stage.\n\t\u2022\tLogs every action to Google Sheets and notifies the sales team in Slack.\n\t\u2022\tCatches any errors and sends a dedicated failure alert to Slack.\n\n### Setup Steps\n\n\t1.\tConnect your HubSpot account.\n\t2.\tConnect your Gmail account.\n\t3.\tConnect your Slack workspace and update both channel names.\n\t4.\tConnect Google Sheets and paste your tracking sheet ID in the Log nodes.\n\t5.\tTurn on the workflow."
      },
      "typeVersion": 1
    },
    {
      "id": "2c685e31-946f-4422-95c5-7285e9bf3525",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        624,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 592,
        "height": 688,
        "content": "## Step 1: Find Stale Proposals\nThis step runs every morning and pulls all open deals from HubSpot that are in the Proposal Sent stage. It then filters down to only the deals where no activity has happened in the last 3 days \u2014 these are the prospects who need a nudge."
      },
      "typeVersion": 1
    },
    {
      "id": "bb980fd5-22df-42b6-8038-d19265a641a3",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1232,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 1440,
        "height": 688,
        "content": "## Step 2: Enrich & Safety Check\nBefore sending anything, this step fetches the prospect's real email from HubSpot, checks they haven't asked to opt out, and checks how many times we've already followed up. If they're on the suppression list or we've already sent 3 follow-ups, we skip them entirely."
      },
      "typeVersion": 1
    },
    {
      "id": "ab57dbe5-c406-4111-9d7e-916fcc4461f7",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2688,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 832,
        "height": 688,
        "content": "## Step 3: Send & Update\nThis step routes the deal to the right email template based on deal value, sends the follow-up email from Gmail, and then updates the deal stage in HubSpot. High-value deals get a more personalised message to maximise the chance of a response."
      },
      "typeVersion": 1
    },
    {
      "id": "21790635-bc4b-4213-a390-0b6e1d8be247",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3536,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 512,
        "height": 688,
        "content": "## Step 4: Log & Notify\nOnce the follow-up is sent, this step appends a full record to Google Sheets and sends a Slack notification to the sales team. The sheet tracks every follow-up attempt so the team has full visibility and can spot deals that need manual intervention."
      },
      "typeVersion": 1
    },
    {
      "id": "dc595488-c6b4-4cc4-88e1-7eaa94e29911",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        4064,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 608,
        "height": 688,
        "content": "## Step 5: Error Handling\nIf anything goes wrong at any point \u2014 a failed API call, a missing contact, a Gmail error \u2014 this section catches it and immediately sends a Slack alert to the ops channel with details of what failed and which deal was affected. No silent failures."
      },
      "typeVersion": 1
    },
    {
      "id": "b7a17eae-8e28-4749-abac-8cf875e78c88",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        672,
        1248
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "cronExpression",
              "expression": "0 9 * * 1-5"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "54ad992b-48f7-42e4-8990-3ec6e5a07128",
      "name": "Get Proposal-Stage Deals",
      "type": "n8n-nodes-base.hubspot",
      "position": [
        880,
        1248
      ],
      "parameters": {
        "filters": {},
        "resource": "deal",
        "operation": "getAll",
        "returnAll": true,
        "authentication": "oAuth2"
      },
      "typeVersion": 2
    },
    {
      "id": "262854a3-5c44-40c6-9ec9-0832957c92a5",
      "name": "Filter Stale Deals",
      "type": "n8n-nodes-base.code",
      "position": [
        1088,
        1248
      ],
      "parameters": {
        "jsCode": "const now = new Date();\nconst threeDaysAgo = new Date(now - 3 * 24 * 60 * 60 * 1000);\n\nconst staleDeals = items.filter(item => {\n  const lastModified = new Date(item.json.properties?.hs_lastmodifieddate || 0);\n  const lastContacted = new Date(item.json.properties?.notes_last_contacted || 0);\n  const mostRecentActivity = lastContacted > lastModified ? lastContacted : lastModified;\n  return mostRecentActivity < threeDaysAgo;\n});\n\nreturn staleDeals.map(item => ({\n  json: {\n    dealId: item.json.id,\n    dealName: item.json.properties?.dealname || 'Unknown Deal',\n    ownerId: item.json.properties?.hubspot_owner_id,\n    closeDate: item.json.properties?.closedate,\n    lastActivity: item.json.properties?.hs_lastmodifieddate,\n    dealAmount: parseFloat(item.json.properties?.amount || 0),\n    associatedContactId: item.json.associations?.contacts?.results?.[0]?.id || null\n  }\n}));"
      },
      "typeVersion": 2
    },
    {
      "id": "a2bf6886-1615-4145-8c34-d57c48cb29dd",
      "name": "Get Contact Email",
      "type": "n8n-nodes-base.hubspot",
      "position": [
        1280,
        1248
      ],
      "parameters": {
        "contactId": "={{ $json.associatedContactId }}",
        "operation": "get",
        "authentication": "oAuth2",
        "additionalFields": {}
      },
      "typeVersion": 2
    },
    {
      "id": "b6f8d4ed-d7d4-4fe3-bd69-ee2bb3087b8c",
      "name": "Merge Contact Data",
      "type": "n8n-nodes-base.code",
      "position": [
        1520,
        1248
      ],
      "parameters": {
        "jsCode": "// Merge contact data back onto the deal item\nconst deal = $('Filter Stale Deals').item.json;\nconst contact = $input.item.json;\n\nreturn [{\n  json: {\n    ...deal,\n    prospectEmail: contact.properties?.email || null,\n    prospectFirstName: contact.properties?.firstname || 'there',\n    prospectLastName: contact.properties?.lastname || '',\n    optedOut: contact.properties?.hs_email_optout === 'true' || contact.properties?.hs_email_optout === true\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "00df627b-e923-4461-81a9-fd077ea2dfad",
      "name": "Opted Out or No Email?",
      "type": "n8n-nodes-base.if",
      "position": [
        1760,
        1248
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": false,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.optedOut }}",
              "rightValue": true
            },
            {
              "operator": {
                "type": "string",
                "operation": "isEmpty"
              },
              "leftValue": "={{ $json.prospectEmail }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "e7cfcf59-df36-42e9-972f-a2d013e9dacc",
      "name": "Get Follow-Up Count",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2032,
        1264
      ],
      "parameters": {
        "options": {},
        "filtersUI": {
          "values": [
            {
              "lookupValue": "={{ $json.dealId }}",
              "lookupColumn": "Deal ID"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "FollowUpLog"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_YOUR_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "d46c1ba7-5666-4f8f-9d96-f5dcb3b84191",
      "name": "Check Follow-Up Count",
      "type": "n8n-nodes-base.code",
      "position": [
        2288,
        1264
      ],
      "parameters": {
        "jsCode": "// Count how many follow-ups have already been sent for this deal\nconst rows = $input.all();\nconst followUpCount = rows.filter(r => r.json['Deal ID'] && r.json['Action'] === 'Follow-Up Email Sent').length;\nconst deal = $('Opted Out or No Email?').item.json;\n\nreturn [{\n  json: {\n    ...deal,\n    followUpCount,\n    maxReached: followUpCount >= 3\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "8039bf3e-1c32-4ef0-9973-8ae57721296a",
      "name": "Max Follow-Ups Reached?",
      "type": "n8n-nodes-base.if",
      "position": [
        2528,
        1264
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.maxReached }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "a455b7ef-c2bd-47f9-984b-a2b0735b8800",
      "name": "Alert \u2014 Max Follow-Ups Hit",
      "type": "n8n-nodes-base.slack",
      "position": [
        2832,
        1168
      ],
      "parameters": {
        "text": ":warning: *Follow-up cap reached \u2014 manual action needed*\n\n*Deal:* {{ $json.dealName }}\n*Prospect:* {{ $json.prospectEmail }}\n*Follow-ups sent so far:* {{ $json.followUpCount }}\n\nThis deal has hit the 3 follow-up limit. A human needs to review and decide the next step.",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.2
    },
    {
      "id": "17f5dc67-69f2-4718-8691-5fe74d6ea3fd",
      "name": "High-Value Deal?",
      "type": "n8n-nodes-base.if",
      "position": [
        2832,
        1344
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "number",
                "operation": "gte"
              },
              "leftValue": "={{ $json.dealAmount }}",
              "rightValue": 5000
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "3c317953-0cd8-4214-bc58-c6252e8efc9b",
      "name": "Send High-Value Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3072,
        1264
      ],
      "parameters": {
        "sendTo": "={{ $json.prospectEmail }}",
        "message": "Hi {{ $json.prospectFirstName }},\n\nI wanted to reach out personally about the proposal we shared for {{ $json.dealName }}.\n\nGiven the scale of what we're looking to do together, I'd love to jump on a 20-minute call to walk you through any questions \u2014 or tailor the proposal if anything has changed on your end.\n\nI've kept some time open this week. Would any of the following work for you?\n- Tuesday 10am\n- Wednesday 2pm\n- Thursday 11am\n\nLooking forward to speaking soon.\n\nWarm regards,\nThe Sales Team",
        "options": {},
        "subject": "A quick personal note about our proposal \u2014 {{ $json.dealName }}",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "b2a1692a-e92e-4384-adce-b3d8f08564f7",
      "name": "Send Standard Follow-Up",
      "type": "n8n-nodes-base.gmail",
      "position": [
        3072,
        1440
      ],
      "parameters": {
        "sendTo": "={{ $json.prospectEmail }}",
        "message": "Hi {{ $json.prospectFirstName }},\n\nI wanted to follow up on the proposal we sent over for {{ $json.dealName }}.\n\nWe understand you may be evaluating options, and we'd love to answer any questions or clarify anything in the proposal.\n\nWould you be open to a quick 15-minute call this week?\n\nLooking forward to hearing from you.\n\nBest regards,\nThe Sales Team",
        "options": {},
        "subject": "Following up on our proposal \u2014 {{ $json.dealName }}",
        "emailType": "text"
      },
      "typeVersion": 2.1
    },
    {
      "id": "668f6639-55c3-45d9-9aa0-0f61962e3307",
      "name": "Update Deal Stage",
      "type": "n8n-nodes-base.hubspot",
      "position": [
        3328,
        1344
      ],
      "parameters": {
        "dealId": "={{ $('Check Follow-Up Count').item.json.dealId }}",
        "resource": "deal",
        "operation": "update",
        "updateFields": {
          "customPropertiesUi": {
            "customPropertiesValues": [
              {
                "value": "decisionmakerboughtin",
                "property": "dealstage"
              }
            ]
          }
        },
        "authentication": "oAuth2"
      },
      "typeVersion": 2
    },
    {
      "id": "850c1a7c-4cc9-4610-8d79-bfe9136f8147",
      "name": "Log to Google Sheets",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3616,
        1344
      ],
      "parameters": {
        "columns": {
          "value": {
            "Date": "={{ new Date().toISOString().split('T')[0] }}",
            "Action": "Follow-Up Email Sent",
            "Deal ID": "={{ $('Check Follow-Up Count').item.json.dealId }}",
            "Deal Name": "={{ $('Check Follow-Up Count').item.json.dealName }}",
            "New Stage": "Follow-Up Sent",
            "Email Type": "={{ $('Check Follow-Up Count').item.json.dealAmount >= 5000 ? 'High-Value' : 'Standard' }}",
            "Deal Amount": "={{ $('Check Follow-Up Count').item.json.dealAmount }}",
            "Follow-Up #": "={{ $('Check Follow-Up Count').item.json.followUpCount + 1 }}",
            "Prospect Email": "={{ $('Check Follow-Up Count').item.json.prospectEmail }}"
          },
          "mappingMode": "defineBelow"
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "FollowUpLog"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_YOUR_SHEET_ID"
        }
      },
      "typeVersion": 4.5
    },
    {
      "id": "75400906-08f1-4cc3-913f-99affe121d8b",
      "name": "Notify Sales Team",
      "type": "n8n-nodes-base.slack",
      "position": [
        3856,
        1344
      ],
      "parameters": {
        "text": ":email: *Follow-up sent automatically*\n\n*Deal:* {{ $('Check Follow-Up Count').item.json.dealName }}\n*Prospect:* {{ $('Check Follow-Up Count').item.json.prospectEmail }}\n*Type:* {{ $('Check Follow-Up Count').item.json.dealAmount >= 5000 ? 'High-Value Template' : 'Standard Template' }}\n*Follow-up #:* {{ $('Check Follow-Up Count').item.json.followUpCount + 1 }} of 3\n*Stage Updated:* \u2192 Follow-Up Sent\n*Date:* {{ new Date().toLocaleDateString() }}\n\nReview the deal in HubSpot and jump in if needed!",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.2
    },
    {
      "id": "a5ce86e3-ca23-4acd-96dd-55a7129e49b0",
      "name": "Capture Error Details",
      "type": "n8n-nodes-base.code",
      "position": [
        4144,
        1088
      ],
      "parameters": {
        "jsCode": "// Capture error details from any failed node\nconst error = $execution?.error || {};\nconst lastNode = error.node?.name || 'Unknown node';\nconst errorMessage = error.message || 'No message available';\nconst dealContext = $('Check Follow-Up Count')?.item?.json?.dealName || 'Unknown deal';\n\nreturn [{\n  json: {\n    failedNode: lastNode,\n    errorMessage,\n    dealContext,\n    timestamp: new Date().toISOString()\n  }\n}];"
      },
      "typeVersion": 2
    },
    {
      "id": "ad572d35-8d2d-492f-a04f-26f4897f8ae9",
      "name": "Send Error Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        4368,
        1088
      ],
      "parameters": {
        "text": ":red_circle: *Workflow Error \u2014 Proposal Follow-Up*\n\n*Failed node:* {{ $json.failedNode }}\n*Error:* {{ $json.errorMessage }}\n*Deal context:* {{ $json.dealContext }}\n*Time:* {{ $json.timestamp }}\n\nPlease check the n8n execution log and resolve manually.",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "typeVersion": 2.2
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "108c5086-6c33-4cc6-aede-f76be74d7543",
  "connections": {
    "High-Value Deal?": {
      "main": [
        [
          {
            "node": "Send High-Value Follow-Up",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Send Standard Follow-Up",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Get Proposal-Stage Deals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Contact Email": {
      "main": [
        [
          {
            "node": "Merge Contact Data",
            "type": "main",
            "index": 0
          },
          {
            "node": "Capture Error Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Deal Stage": {
      "main": [
        [
          {
            "node": "Log to Google Sheets",
            "type": "main",
            "index": 0
          },
          {
            "node": "Capture Error Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Stale Deals": {
      "main": [
        [
          {
            "node": "Get Contact Email",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Contact Data": {
      "main": [
        [
          {
            "node": "Opted Out or No Email?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Follow-Up Count": {
      "main": [
        [
          {
            "node": "Check Follow-Up Count",
            "type": "main",
            "index": 0
          },
          {
            "node": "Capture Error Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log to Google Sheets": {
      "main": [
        [
          {
            "node": "Notify Sales Team",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Capture Error Details": {
      "main": [
        [
          {
            "node": "Send Error Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check Follow-Up Count": {
      "main": [
        [
          {
            "node": "Max Follow-Ups Reached?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Opted Out or No Email?": {
      "main": [
        [],
        [
          {
            "node": "Get Follow-Up Count",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Max Follow-Ups Reached?": {
      "main": [
        [
          {
            "node": "Alert \u2014 Max Follow-Ups Hit",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "High-Value Deal?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Standard Follow-Up": {
      "main": [
        [
          {
            "node": "Update Deal Stage",
            "type": "main",
            "index": 0
          },
          {
            "node": "Capture Error Details",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Proposal-Stage Deals": {
      "main": [
        [
          {
            "node": "Filter Stale Deals",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send High-Value Follow-Up": {
      "main": [
        [
          {
            "node": "Update Deal Stage",
            "type": "main",
            "index": 0
          },
          {
            "node": "Capture Error Details",
            "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 runs every weekday morning to find HubSpot deals with stale proposal activity, pulls the associated contact email, enforces opt-out and follow-up limits using Google Sheets, sends a value-based follow-up via Gmail, updates the HubSpot deal stage, and notifies the…

Source: https://n8n.io/workflows/16001/ — 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

Cold Email Automation - Safe Ramp + AI Personalization + Follow-ups. Uses googleSheets, httpRequest, gmail. Scheduled trigger; 34 nodes.

Google Sheets, HTTP Request, Gmail
Email & Gmail

This workflow automates the entire process of managing event participants, from registration and payment to sending reminders and follow-up communications. It's designed for event organizers who want

Typeform Trigger, Google Sheets, Stripe +3
Email & Gmail

How it works time trigger using the cron format, every weekday at 5pm gets CentralStationCRM people updates of today checks for tag "Outreach" if true, sends message on gmail (predefine in node) waits

Gmail, HTTP Request, Slack
Email & Gmail

This n8n workflow template, "Email Outreach Automation," is designed to help you set up an automated email outreach system using tools you might already be familiar with: Google Sheets and Google Docs

Google Sheets, Google Docs, Gmail
Email & Gmail

Chasing vendors for overdue Purchase Orders (POs) is a manual, repetitive task that eats up hours of procurement time. This workflow automates that entire process—intelligently.

Google Sheets, Gmail