11 min de lectura

Las integraciones de n8n que más usamos con Pipedrive, Gmail y Google Sheets

n8n tiene más de 400 integraciones nativas. La mayoría no las necesitas. Estas sí.

Integraciones n8n con Pipedrive, Gmail y Google Sheets: guía práctica con ejemplos reales

Tres herramientas que el 80% de las pymes ya tienen: un CRM (Pipedrive), el email (Gmail) y hojas de cálculo (Google Sheets). El problema no es que las tengan por separado. El problema es que no hablan entre sí.

Cuando llega un lead por email, alguien lo copia en Pipedrive. Cuando se cierra un deal, alguien actualiza la hoja de seguimiento. Cuando hay que enviar un email de seguimiento, alguien lo redacta manualmente. Tres herramientas, tres silos, una persona de puente entre ellos.

Esta guía muestra cómo conectar las tres con n8n. Con ejemplos concretos, con el código de los nodos Function que necesitas y con las configuraciones que no son obvias.


Antes de empezar: autenticación con las tres herramientas

Pipedrive

En Pipedrive, la autenticación en n8n se hace con API Token. Ve a tu perfil en Pipedrive → Configuración personal → API y copia el token. En n8n, crea una credencial de tipo "Pipedrive API" y pega el token.

El nodo de Pipedrive en n8n cubre las operaciones principales: crear y buscar contactos (Persons), crear y actualizar deals (Deals), crear actividades, notas y mucho más.

Gmail

Gmail usa OAuth2. En n8n, crea una credencial de tipo "Google OAuth2 API" o usa la credencial específica de "Gmail OAuth2 API". Necesitas crear un proyecto en Google Cloud Console, habilitar la API de Gmail y generar las credenciales OAuth2 (Client ID y Client Secret).

El proceso completo está en la documentación de n8n, pero el paso más importante que se olvida: en los "Authorized redirect URIs" de Google Cloud Console tienes que añadir la URL de tu instancia de n8n más /rest/oauth2-credential/callback.

Google Sheets

Similar a Gmail: OAuth2 a través de Google Cloud Console, pero habilitando la API de Google Sheets en lugar de la de Gmail. Puedes usar el mismo proyecto de Google Cloud Console y las mismas credenciales OAuth2 si habilitas ambas APIs.


Flujo 1: Lead en Gmail → Contacto en Pipedrive → Fila en Google Sheets

Este es el flujo más común. Llega un email con datos de un lead potencial y quieres que aparezca en Pipedrive y en tu hoja de seguimiento sin tocar nada.

Trigger: Gmail

El nodo de Gmail Trigger monitoriza la bandeja de entrada. Configura:

  • Poll Times: cada 5 minutos (o el intervalo que necesites)
  • Filters → From: si los leads vienen siempre de la misma dirección o dominio (por ejemplo, notificaciones de tu formulario web)
  • Filters → Subject contains: si el asunto tiene un patrón fijo

El nodo devuelve el email completo con remitente, asunto, cuerpo en texto plano y en HTML, fecha y adjuntos.

Nodo Function: extraer datos del email

Si el email tiene un formato estructurado (como los que mandan Typeform, Tally, Gravity Forms), puedes extraer los campos con expresiones regulares o split por líneas.

Ejemplo para un email con este formato:

Nombre: María García
Email: maria@empresa.com
Teléfono: 612345678
Mensaje: Necesito información sobre vuestros servicios de automatización

El nodo Function:

const body = $input.item.json.text || '';
const lines = body.split('\n');
const data = {};

for (const line of lines) {
  const parts = line.split(': ');
  if (parts.length >= 2) {
    const key = parts[0].trim().toLowerCase()
      .replace('é', 'e')
      .replace('ó', 'o')
      .replace('á', 'a')
      .replace('í', 'i')
      .replace('ú', 'u');
    const value = parts.slice(1).join(': ').trim();
    data[key] = value;
  }
}

return [{
  json: {
    nombre: data['nombre'] || '',
    email: data['email'] || '',
    telefono: data['telefono'] || data['teléfono'] || '',
    mensaje: data['mensaje'] || '',
    fecha_lead: new Date().toISOString(),
    origen: 'formulario_web'
  }
}];

Nodo Pipedrive: buscar si el contacto ya existe

Antes de crear el contacto, comprueba si ya existe. Usa el nodo Pipedrive con operación "Person → Search".

Configura:

  • Term: {{ $json.email }}
  • Fields: email

El nodo devuelve los resultados en $json.data. Si el array está vacío, el contacto no existe.

Nodo IF: ¿existe el contacto?

Añade un nodo IF para bifurcar según si el contacto existe:

  • Condition: {{ $json.data.length }} es mayor que 0
  • True: el contacto ya existe, usa su ID
  • False: crear el contacto nuevo

Nodo Pipedrive: crear el contacto (rama False)

Operación: "Person → Create"

Campos a configurar:

  • Name: {{ $('Function').item.json.nombre }}
  • Email: {{ $('Function').item.json.email }}
  • Phone: {{ $('Function').item.json.telefono }}

El nodo devuelve el objeto del contacto creado, incluyendo su id.

Nodo Pipedrive: crear el deal

Operación: "Deal → Create"

  • Title: Lead - {{ $('Function').item.json.nombre }}
  • Person ID: {{ $json.id }} (el ID del contacto creado o encontrado)
  • Stage ID: el ID numérico de la primera etapa de tu pipeline (lo encuentras en Pipedrive → Configuración → Pipelines)

Para los campos personalizados de Pipedrive, necesitas el hash del campo. Ve a la API de Pipedrive (https://tuempresa.pipedrive.com/api/v1/dealFields?api_token=TU_TOKEN) y busca el campo por nombre. El valor key es lo que necesitas.

Nodo Google Sheets: añadir fila

Operación: "Append or Update Row" (o "Append Row" si no necesitas actualizar)

Configura:

  • Document ID: el ID de tu hoja (está en la URL de Google Sheets)
  • Sheet Name: el nombre de la pestaña
  • Columns: mapea los campos de n8n a las columnas de tu hoja

Ejemplo de mapeo:

Fecha → {{ $('Function').item.json.fecha_lead }}
Nombre → {{ $('Function').item.json.nombre }}
Email → {{ $('Function').item.json.email }}
Teléfono → {{ $('Function').item.json.telefono }}
Mensaje → {{ $('Function').item.json.mensaje }}
ID Pipedrive → {{ $('Pipedrive Deal').item.json.id }}
Estado → Nuevo

Flujo 2: Deal actualizado en Pipedrive → Email automático → Google Sheets

Cuando un deal avanza de etapa en Pipedrive —por ejemplo, de "Propuesta enviada" a "Negociación"— quieres que salga un email automático al cliente y que la hoja de seguimiento se actualice.

Trigger: Pipedrive Trigger

El nodo de Pipedrive Trigger usa webhooks. Cuando lo configuras en n8n, te da una URL de webhook que tienes que registrar en Pipedrive.

Ve a Pipedrive → Herramientas → Webhook y crea un webhook apuntando a esa URL. Selecciona el evento updated.deal.

En n8n, en el nodo Pipedrive Trigger:

  • Event: Deal Updated

Nodo IF: ¿cambió la etapa?

El webhook de Pipedrive manda tanto el objeto actual como el anterior (en $json.current y $json.previous). Para detectar solo los cambios de etapa:

  • Condition 1: {{ $json.current.stage_id }} no es igual a {{ $json.previous.stage_id }}

Si solo te interesa cuando el deal pasa a una etapa específica, añade una segunda condición:

  • Condition 2: {{ $json.current.stage_id }} es igual a TU_STAGE_ID

Nodo Pipedrive: obtener datos del contacto

Con el ID del contacto del deal, busca sus datos para tener el email:

Operación: "Person → Get"

  • Person ID: {{ $json.current.person_id.value }}

Nodo Gmail: enviar email

Operación: "Send"

Configuración:

  • To: {{ $('Pipedrive Person').item.json.email[0].value }}
  • Subject: Actualización sobre tu propuesta - {{ $json.current.title }}
  • Message: aquí va el cuerpo del email. Puedes usar HTML para formato.

Ejemplo de cuerpo en HTML:

<p>Hola {{ $('Pipedrive Person').item.json.name }},</p>

<p>Te escribo para informarte de que tu propuesta ha avanzado en nuestro proceso.
Nuestro equipo está revisando los detalles y nos pondremos en contacto contigo
en las próximas 24 horas.</p>

<p>Si tienes cualquier pregunta mientras tanto, responde directamente a este email.</p>

<p>Un saludo,<br>
El equipo de Flexum</p>

Nodo Google Sheets: actualizar fila existente

Operación: "Update Row" o "Append or Update Row"

Para actualizar una fila existente, necesitas un campo de búsqueda: usa el ID del deal de Pipedrive. La hoja tiene que tener una columna con el ID del deal (que añadiste en el flujo anterior).

Configura:

  • Lookup Column: ID Pipedrive
  • Lookup Value: {{ $json.current.id }}
  • Columns a actualizar:
    • Estado → el nombre de la nueva etapa
    • Fecha actualización{{ $now.toISO() }}
    • Email enviado

Flujo 3: Google Sheets como base de datos → emails masivos segmentados → registro en Sheets

Un caso de uso muy común: tienes una lista de contactos en Google Sheets con columnas de segmentación (sector, tamaño de empresa, estado en el ciclo de vida) y quieres mandar emails personalizados a un segmento concreto.

Trigger: Schedule (manual o periódico)

Para un envío puntual, usa el trigger "Manual" y ejecútalo cuando quieras. Para envíos recurrentes (newsletter semanal, recordatorio mensual), usa el trigger "Schedule".

Nodo Google Sheets: leer la hoja

Operación: "Read Rows" o "Get Rows"

Configura para leer todas las filas. El nodo devuelve un array con todas las filas como objetos JSON.

Nodo Filter: filtrar el segmento

Usa un nodo Filter para quedarte solo con las filas que cumplen la condición:

  • Condition: {{ $json.sector }} es igual a tecnología

O para múltiples condiciones:

  • {{ $json.estado }} es igual a cliente_activo AND {{ $json.email_enviado }} no es igual a

Nodo Gmail: enviar email (con Split in Batches)

Para enviar un email diferente a cada contacto de la lista, antes del nodo de Gmail añade un nodo "Split in Batches" con tamaño de batch 1. Esto hace que el flujo itere sobre cada contacto de forma individual.

El nodo Gmail:

  • To: {{ $json.email }}
  • Subject: {{ $json.nombre }}, información que puede interesarte
  • Message: personalizado con los datos de cada fila

Para evitar que Gmail marque los envíos como spam, no envíes más de 100 emails por hora. Si tienes listas grandes, añade un nodo "Wait" de 30-60 segundos entre lotes.

Nodo Google Sheets: marcar como enviado

Después del nodo de Gmail, actualiza la fila correspondiente para marcar que el email se envió:

Operación: "Update Row"

  • Lookup Column: email
  • Lookup Value: {{ $json.email }}
  • Columns a actualizar:
    • email_enviado
    • fecha_envio{{ $now.format('dd/MM/yyyy') }}

Flujo 4: Sincronización bidireccional Pipedrive ↔ Google Sheets

El flujo más complejo pero también el más útil para equipos que ya tienen una hoja de Sheets como sistema de referencia y no quieren migrar completamente a Pipedrive de golpe.

El objetivo: cualquier cambio en Pipedrive se refleja en Sheets, y cualquier actualización en Sheets (que hace un miembro del equipo que prefiere trabajar en Sheets) se sincroniza a Pipedrive.

Parte 1: Pipedrive → Sheets

Trigger: Pipedrive Trigger (webhooks de created.deal, updated.deal, deleted.deal)

Para created.deal y updated.deal: nodo "Append or Update Row" en Sheets con lookup por ID de deal. Para deleted.deal: nodo "Update Row" que marca la fila con estado = eliminado.

Parte 2: Sheets → Pipedrive

Esta dirección es más compleja porque Google Sheets no tiene webhooks nativos. Tienes dos opciones:

Opción A: polling por Schedule. Un trigger de Schedule que cada 15 minutos lee la hoja, compara con el estado en Pipedrive y sincroniza los cambios. Más simple pero con latencia de hasta 15 minutos.

Opción B: Google Apps Script como trigger. Añades un script en tu hoja de Sheets que se activa cuando alguien edita una celda y llama a un webhook de n8n. Latencia casi cero pero requiere configurar Apps Script.

El script de Apps Script:

function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  const row = e.range.getRow();
  const col = e.range.getColumn();

  // Solo sincroniza si no es la primera fila (cabeceras)
  if (row <= 1) return;

  const rowData = sheet.getRange(row, 1, 1, sheet.getLastColumn()).getValues()[0];
  const headers = sheet.getRange(1, 1, 1, sheet.getLastColumn()).getValues()[0];

  const data = {};
  headers.forEach((header, i) => {
    data[header] = rowData[i];
  });

  // Envía los datos al webhook de n8n
  const webhookUrl = 'https://n8n.tuempresa.com/webhook/sheets-sync';
  const options = {
    method: 'POST',
    contentType: 'application/json',
    payload: JSON.stringify({
      data: data,
      row: row,
      edited_column: headers[col - 1],
      timestamp: new Date().toISOString()
    })
  };

  UrlFetchApp.fetch(webhookUrl, options);
}

En n8n, el nodo Webhook recibe estos datos y el resto del flujo actualiza Pipedrive con las operaciones correspondientes.

Evitar bucles infinitos

La sincronización bidireccional tiene un riesgo: un cambio en Pipedrive actualiza Sheets, lo que dispara el script de Sheets, que llama a n8n, que actualiza Pipedrive, y así en bucle.

La solución es añadir un campo ultima_sync_n8n en la hoja de Sheets. Cuando n8n hace una actualización en Sheets, escribe en ese campo el timestamp actual. El script de Apps Script comprueba si el campo cambió en los últimos 10 segundos; si sí, asume que el cambio lo hizo n8n y no dispara el webhook.

function onEdit(e) {
  const sheet = e.source.getActiveSheet();
  const row = e.range.getRow();
  const col = e.range.getColumn();

  if (row <= 1) return;

  // Columna de control anti-bucle (asume que es la última columna)
  const lastCol = sheet.getLastColumn();
  const syncCell = sheet.getRange(row, lastCol);
  const syncValue = syncCell.getValue();

  // Si el campo fue actualizado por n8n hace menos de 30 segundos, no sincronizar
  if (syncValue) {
    const syncTime = new Date(syncValue).getTime();
    const now = new Date().getTime();
    if (now - syncTime < 30000) return;
  }

  // ... resto del código de sincronización
}

Notas sobre rendimiento y límites

Google Sheets API: tiene límites de 300 solicitudes por minuto por proyecto y 60 solicitudes por minuto por usuario. Para flujos con muchas actualizaciones seguidas, añade un nodo "Wait" entre operaciones o usa el modo batch del nodo de Google Sheets.

Gmail API: el límite de envío de Gmail para cuentas de Google Workspace es de 2.000 emails al día. Para listas mayores, usa un servicio de email transaccional (SendGrid, Mailgun) que tiene sus propios nodos en n8n.

Pipedrive API: el límite es de 100 solicitudes cada 2 segundos por token. Para operaciones masivas (importar 500 contactos a la vez), distribuye las solicitudes con un nodo "Wait" de 50ms entre cada una.

Webhooks de n8n: si tu instancia de n8n está en un servidor con IP dinámica, los webhooks de Pipedrive dejarán de funcionar cuando cambie la IP. Usa siempre una IP estática o un dominio fijo.


El flujo mínimo viable para empezar hoy

Si nunca has conectado estas tres herramientas y quieres ver resultados esta semana, empieza con esto:

  1. Trigger: Gmail (filtra por el email de tu formulario de contacto)
  2. Nodo Function: extrae nombre, email y mensaje del body del email
  3. Nodo Pipedrive: crea el contacto (Person)
  4. Nodo Pipedrive: crea el deal vinculado al contacto
  5. Nodo Google Sheets: añade una fila con los datos + ID del deal + timestamp

Cinco nodos. Dos horas de trabajo si es tu primera vez con n8n. A partir de ese momento, cada lead que llegue por email está en Pipedrive y en tu hoja de seguimiento en menos de 30 segundos, sin que nadie lo copie a mano.

Una vez que ese flujo funciona, añades la respuesta automática por Gmail o WhatsApp. Luego el seguimiento cuando el deal avanza de etapa. Luego el informe semanal. No intentes construir el sistema completo desde el primer día.

Solicitar diagnóstico gratuito →
N
Escrito por
Nicasio Martínez

Fundador de Flexum. Lleva más de ocho años ayudando a pymes a implementar automatizaciones con n8n, bots conversacionales y desarrollo a medida.