Outreach inverso

Avanzado

Este es unLead Generation, Multimodal AIflujo de automatización del dominio deautomatización que contiene 16 nodos.Utiliza principalmente nodos como Code, Gmail, Slack, GmailTrigger, GoogleSheets. Extraer线索 de negocio de Gmail a Google Sheets y enviar notificaciones a Slack

Requisitos previos
  • Cuenta de Google y credenciales de API de Gmail
  • Bot Token de Slack o URL de Webhook
  • Credenciales de API de Google Sheets
Vista previa del flujo de trabajo
Visualización de las conexiones entre nodos, con soporte para zoom y panorámica
Exportar flujo de trabajo
Copie la siguiente configuración JSON en n8n para importar y usar este flujo de trabajo
{
  "id": "R0TtQlb7ZSQkTlC7",
  "meta": {
    "instanceId": "71ecea07edbb806c100ea5f8b695a5001787e0b017af53d28d0fd42f17f9e429",
    "templateCredsSetupCompleted": true
  },
  "name": "Reverse Outreach",
  "tags": [],
  "nodes": [
    {
      "id": "8bb1f909-10a4-44d2-a79c-662c37ad65d1",
      "name": "Activación Manual (Ejecución Histórica)",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        800,
        208
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "f47e6b4e-0335-4375-ac24-2f19c99edcf8",
      "name": "Gmail Trigger (Tiempo Real)",
      "type": "n8n-nodes-base.gmailTrigger",
      "position": [
        1088,
        608
      ],
      "parameters": {
        "filters": {},
        "pollTimes": {
          "item": [
            {
              "hour": 8
            }
          ]
        }
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "DCuIQWT8oAjbhLOI",
          "name": "Gmail account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "87f1bb54-8165-4bec-8495-0e385cc0f097",
      "name": "Obtener múltiples mensajes",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1088,
        208
      ],
      "webhookId": "5479a402-e400-4d7d-a759-b7a6ba9db91a",
      "parameters": {
        "limit": 500,
        "filters": {},
        "operation": "getAll"
      },
      "credentials": {
        "gmailOAuth2": {
          "id": "DCuIQWT8oAjbhLOI",
          "name": "Gmail account"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "f792b037-62f8-4fac-9ea8-b30197cbc62c",
      "name": "Código",
      "type": "n8n-nodes-base.code",
      "position": [
        1456,
        208
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  let fromField = item.json.From || \"\";\n  fromField = fromField.trim();\n\n  // Extract display name and email using regex\n  const match = fromField.match(/(.*)<(.+@.+)>/);\n  let companyName = \"\";\n  let email = \"\";\n\n  if (match) {\n    companyName = match[1].trim() || \"\";\n    email = match[2].trim().toLowerCase();\n  } else {\n    // If no angle brackets, assume just the email\n    email = fromField.toLowerCase();\n    companyName = email.split(\"@\")[0];\n  }\n\n  if (!email.includes(\"@\")) return null;\n\n  const [localPart, domain] = email.split(\"@\");\n\n  // Filter system/service emails\n  const blockedLocalParts = [\n    'no-reply', 'noreply', 'donotreply', 'do-not-reply', 'system', 'mailer-daemon', 'automated', 'service', 'bot', 'notifications', 'updates'\n  ];\n  if (blockedLocalParts.some(blocked => localPart.includes(blocked))) return null;\n\n  // Filter generic company inboxes\n  const genericLocalParts = [\n    'info', 'support', 'admin', 'help', 'contact', 'sales', 'marketing', 'enquiries', 'hr', 'jobs', 'careers', 'team', 'office'\n  ];\n  if (genericLocalParts.includes(localPart)) return null;\n\n  // Format date naturally\n  const timestamp = parseInt(item.json.internalDate, 10);\n  const date = new Date(timestamp);\n  const formattedDate = date.toLocaleString('en-US', {\n    weekday: 'short',\n    year: 'numeric',\n    month: 'short',\n    day: 'numeric',\n    hour: '2-digit',\n    minute: '2-digit',\n    hour12: true\n  });\n\n  return {\n    json: {\n      company_name: companyName || domain,\n      email: email,\n      domain: domain,\n      subject: item.json.Subject,\n      date_received: formattedDate\n    }\n  };\n}).filter(Boolean);"
      },
      "typeVersion": 2,
      "alwaysOutputData": false
    },
    {
      "id": "76b87209-dc5b-4d9c-823b-4ad27f6e24d1",
      "name": "Enviar un mensaje",
      "type": "n8n-nodes-base.slack",
      "position": [
        2784,
        208
      ],
      "webhookId": "efb3c8f3-72da-41ca-a654-429d5ecc5561",
      "parameters": {
        "text": "=New Lead added {{$json[\"company_name\"]}} | {{$json[\"email\"]}}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_WITH_SLACK_CHANNEL_ID"
        },
        "otherOptions": {}
      },
      "credentials": {
        "slackApi": {
          "id": "DmYieZie2ecappVJ",
          "name": "Slack account"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "330863ce-e243-4ddc-b4bb-6f86bd73bfb3",
      "name": "Nota Adhesiva",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2720,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 320,
        "content": "## Notify in Slack channel \n"
      },
      "typeVersion": 1
    },
    {
      "id": "b2c1be84-f8d9-44ba-8f5c-90e18e6bab52",
      "name": "Nota Adhesiva1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2432,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 320,
        "content": "## Store leads Into Google Sheet\n"
      },
      "typeVersion": 1
    },
    {
      "id": "c62db656-466e-403d-89e9-147625c4be9f",
      "name": "Nota Adhesiva2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1392,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 304,
        "content": "## Filter out the service emails\n(i.e. info@company.com)"
      },
      "typeVersion": 1
    },
    {
      "id": "eb0ee374-7b56-4d70-ad61-e8d710f831e9",
      "name": "Nota Adhesiva3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        448
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 320,
        "content": "## Run email fetching periodically\ndefault is set to daily"
      },
      "typeVersion": 1
    },
    {
      "id": "5e895d51-5a9b-4149-bf4e-4139d3694a06",
      "name": "Nota Adhesiva4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        992,
        64
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 320,
        "content": "## Run email fetching for the existing emails"
      },
      "typeVersion": 1
    },
    {
      "id": "dc5b438f-ee73-4c43-b250-c26c6d9dde66",
      "name": "Código1",
      "type": "n8n-nodes-base.code",
      "position": [
        2160,
        208
      ],
      "parameters": {
        "jsCode": "// This script filters the input items to remove duplicate emails.\n// It keeps the first occurrence of each unique email and discards subsequent ones.\n\nconst uniqueItems = [];\nconst seenEmails = new Set();\n\nfor (const item of items) {\n  const email = item.json.email;\n  \n  // Check if we have already seen this email\n  if (!seenEmails.has(email)) {\n    // If not, add the email to our set and keep the item\n    seenEmails.add(email);\n    uniqueItems.push(item);\n  }\n}\n\n// Return the list of unique items\nreturn uniqueItems;"
      },
      "typeVersion": 2
    },
    {
      "id": "c81e0509-18cf-4a8b-90e2-f0d9c9bbc7de",
      "name": "Añadir o actualizar fila en hoja",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        2496,
        208
      ],
      "parameters": {
        "columns": {
          "value": {},
          "schema": [],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "appendOrUpdate",
        "sheetName": {
          "__rl": true,
          "mode": "name",
          "value": "REPLACE_WITH_GOOGLSHEET_SHEET_ID"
        },
        "documentId": {
          "__rl": true,
          "mode": "id",
          "value": "REPLACE_GOOGLESHEET_SPREADSHEET_ID"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "ZbFocTqLtYXqeHXq",
          "name": "Google Sheets account"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "7cd89cfa-069a-4cb1-8092-27d37b9b90ad",
      "name": "Nota Adhesiva5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2096,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 304,
        "content": "## Remove Duplicates"
      },
      "typeVersion": 1
    },
    {
      "id": "ec9d11ad-7a60-409a-ad31-f7e2953999b3",
      "name": "Código2",
      "type": "n8n-nodes-base.code",
      "position": [
        1824,
        208
      ],
      "parameters": {
        "jsCode": "return items.map(item => {\n  const domain = item.json.domain;\n\n  // Filter personal domains\n  const personalDomains = [\n    'gmail.com', 'yahoo.com', 'outlook.com', 'hotmail.com', 'aol.com', 'icloud.com', 'protonmail.com'\n  ];\n  if (personalDomains.includes(domain)) {\n    return null;\n  }\n\n  // If the item passes the filter, return it\n  return item;\n}).filter(Boolean);"
      },
      "typeVersion": 2
    },
    {
      "id": "97a76ecb-6165-4702-ba57-fb5a2542c059",
      "name": "Nota Adhesiva6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1760,
        80
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 304,
        "content": "## Filter out the Personal emails\n(i.e. name@gmail.com)"
      },
      "typeVersion": 1
    },
    {
      "id": "d1c42689-7256-409b-8972-bb1c69412b11",
      "name": "Nota Adhesiva7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        176,
        -528
      ],
      "parameters": {
        "width": 512,
        "height": 1344,
        "content": "## Reverse Outreach\n\nThis workflow allows users to extract potential leads sitting on their inboxes. The idea of a reverse outreach is based on the notion that the next big client/customer/partner might be sitting in your inbox waiting to be mined. This automation has two workflows, one that extracts from the historical emails, and the other is a scheduled event, default set to run everyday morning.\nThe workflow intelligently filters out emails from personal domains, system addresses (no-reply, updates), and generic company inboxes (info@, support@). The remaining emails are parsed to extract key information—company name, email address, domain, and subject—which is then stored in a Google Sheets spreadsheet. The Google Sheets node is configured to append or update based on the email address, ensuring that you never store duplicate entries. Finally, you will get a slack message with key information about the lead.\n\n🚀 **How it works**\nManual Trigger: A manual click initiate will fetch all historical emails. the limit set to 500, which you can increase up to 5000\n\nPeriodic Trigger: The workflow is triggered by time, default is set to daily fetch.\n\nCode nodes: Three Code nodes filter the emails based on custom rules - personal domains, system addresses, generic inboxes.\n\nGoogle Sheets: The processed data is sent to a Google Sheets spreadsheet. The append or update operation automatically handles whether to create a new row or update an existing one based on the email address, preventing duplicates.\n\n🔑 **Required Credentials**\nGoogle (Gmail): To access your Gmail account and retrieve email messages.\n\nGoogle Sheets: To connect to your spreadsheet.\n\nSlack Bot: To Send message in a designated slack channel\n\n🛠️ **Setup Instructions**\nConfigure Gmail Trigger:\n\nConnect your Google cloud account credential in Gmail and Google sheet nodes.\n\nChoose the schedule to run the Email fetch node that periodically watch for new emails.\n\n\nConfigure Code Node:\n\nThis node is pre-configured with the filtering logic. You can customize the lists of personal, blocked, or generic email parts to fit your needs.\n\nConfigure Google Sheets Node:\n\nConnect your Google Sheets credentials.\nCreate a Spreadsheet with the following columns\ncompany_name, email, domain, subject, date_received\n\nEnter the Spreadsheet ID of your target spreadsheet in the Google sheet node along with the Sheet Name (e.g., Leads).\n\nAnd that should do it! Now run the manual trigger workflow  and see the lead information showing up in your selected Slack Channel and also in the populated google sheet.\n"
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "pinData": {},
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "1e2dfcca-3c26-44dc-90cd-22fc7eccbe0c",
  "connections": {
    "f792b037-62f8-4fac-9ea8-b30197cbc62c": {
      "main": [
        [
          {
            "node": "ec9d11ad-7a60-409a-ad31-f7e2953999b3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "dc5b438f-ee73-4c43-b250-c26c6d9dde66": {
      "main": [
        [
          {
            "node": "c81e0509-18cf-4a8b-90e2-f0d9c9bbc7de",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ec9d11ad-7a60-409a-ad31-f7e2953999b3": {
      "main": [
        [
          {
            "node": "dc5b438f-ee73-4c43-b250-c26c6d9dde66",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "87f1bb54-8165-4bec-8495-0e385cc0f097": {
      "main": [
        [
          {
            "node": "f792b037-62f8-4fac-9ea8-b30197cbc62c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f47e6b4e-0335-4375-ac24-2f19c99edcf8": {
      "main": [
        [
          {
            "node": "f792b037-62f8-4fac-9ea8-b30197cbc62c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "c81e0509-18cf-4a8b-90e2-f0d9c9bbc7de": {
      "main": [
        [
          {
            "node": "76b87209-dc5b-4d9c-823b-4ad27f6e24d1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8bb1f909-10a4-44d2-a79c-662c37ad65d1": {
      "main": [
        [
          {
            "node": "87f1bb54-8165-4bec-8495-0e385cc0f097",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Preguntas frecuentes

¿Cómo usar este flujo de trabajo?

Copie el código de configuración JSON de arriba, cree un nuevo flujo de trabajo en su instancia de n8n y seleccione "Importar desde JSON", pegue la configuración y luego modifique la configuración de credenciales según sea necesario.

¿En qué escenarios es adecuado este flujo de trabajo?

Avanzado - Generación de leads, IA Multimodal

¿Es de pago?

Este flujo de trabajo es completamente gratuito, puede importarlo y usarlo directamente. Sin embargo, tenga en cuenta que los servicios de terceros utilizados en el flujo de trabajo (como la API de OpenAI) pueden requerir un pago por su cuenta.

Información del flujo de trabajo
Nivel de dificultad
Avanzado
Número de nodos16
Categoría2
Tipos de nodos7
Descripción de la dificultad

Adecuado para usuarios avanzados, flujos de trabajo complejos con 16+ nodos

Autor
Axiomlab.dev

Axiomlab.dev

@axiomlab

✓ 5+ Years of Business Automation Experience ✓ 7+ Years of Product Owner/Agile Leadership Experience ✓ 14+ Years of Management Consulting Career ✓ PMP Certified Project Manager, Agile Practitioner ✓ Specialized in Scrum Framework of Agile Management

Enlaces externos
Ver en n8n.io

Compartir este flujo de trabajo

Categorías

Categorías: 34