n8n: Sincronizar CRM con Google Sheets de Forma Bidireccional

N8n sincronizar CRM con hojas es uno de los usos más prácticos de n8n. Sincronizar un CRM con Google Sheets usando n8n es una de las automatizaciones más demandadas por equipos comerciales. Los directivos quieren ver los datos en Sheets, pero el equipo trabaja en HubSpot. n8n puede mantener ambos sistemas sincronizados automáticamente, tanto de CRM a Sheets como de Sheets a CRM. En esta guía aprenderás cómo hacerlo.

Por qué sincronizar CRM con Google Sheets

  • Los directivos prefieren Google Sheets para análisis y seguimiento
  • Los equipos de operaciones necesitan filtrar y manipular datos masivamente
  • Los reportes en Sheets son más flexibles que los del CRM
  • Compartir con externos (agencias, consultores) sin dar acceso al CRM
  • Importaciones masivas: actualizar 500 contactos en Sheets y sincronizar al CRM

Sincronización en una dirección: CRM → Google Sheets

La más sencilla. Los datos del CRM se copian a Sheets automáticamente.

Sync diario completo (recomendado para empezar)

Schedule Trigger (cada día a las 7:00)
  → HubSpot — Get All Contacts (con propiedades relevantes)
  → Code — transforma el formato de datos
  → Google Sheets — Clear (borra la hoja)
  → Google Sheets — Append (escribe todos los datos)

Transformación en Code:

return $input.all().map(item => ({
  json: {
    ID: item.json.id,
    Nombre: `${item.json.properties.firstname} ${item.json.properties.lastname}`,
    Email: item.json.properties.email,
    Empresa: item.json.properties.company,
    Cargo: item.json.properties.jobtitle,
    Estado_Lead: item.json.properties.hs_lead_status,
    Propietario: item.json.properties.hubspot_owner_id,
    Fecha_Creacion: item.json.properties.createdate?.split('T')[0],
    Ultimo_Contacto: item.json.properties.notes_last_contacted?.split('T')[0],
  }
}));

Sync en tiempo real: trigger por evento

HubSpot Trigger (contact.propertyChange — cualquier cambio)
  → Google Sheets — Update Row (busca por email y actualiza)

Para actualizar una fila existente en Sheets, necesitas encontrarla primero:

  1. Google Sheets — Read All → busca la fila con el email del contacto
  2. Obtén el número de fila
  3. Google Sheets — Update con el número de fila

Sincronización bidireccional: CRM ↔ Google Sheets

Más compleja pero muy potente. Permite que ambos sistemas estén siempre alineados.

El problema de la bidireccionalidad

El mayor riesgo es el bucle infinito: Sheets actualiza HubSpot → HubSpot dispara un evento → actualiza Sheets → Sheets actualiza HubSpot → …

La solución es usar un campo de control: last_sync_source o un timestamp.

Arquitectura anti-bucle

Flujo Sheets → CRM:

  1. Google Sheets Trigger (cambio en la hoja)
  2. Añade sync_source = "sheets" al registro
  3. HubSpot — Update Contact
  4. El trigger de HubSpot comprueba sync_source antes de actualizar Sheets

Flujo CRM → Sheets:

  1. HubSpot Trigger (cambio en contacto)
  2. IF (sync_source !== "sheets") — solo continúa si el cambio no viene de Sheets
  3. Google Sheets — Update Row

Implementación práctica con columna de control

Añade una columna Fuente_Ultima_Actualizacion en tu Google Sheet:

Google Sheets Trigger
  → Code — detecta qué cambió
  → IF (Fuente_Ultima_Actualizacion !== "hubspot")  — evita el bucle
    → HubSpot — Update Contact
    → Google Sheets — Update (marca Fuente = "sheets")
HubSpot Trigger
  → IF (no viene del sync de Sheets)
    → Google Sheets — Find & Update Row
    → Google Sheets — Update Fuente = "hubspot"

Caso práctico: Pipeline de ventas Sheets ↔ HubSpot

El equipo comercial trabaja en un Google Sheet con el pipeline:

Email Nombre Empresa Etapa Valor Deal Comercial
juan@empresa.com Juan García Empresa S.L. Propuesta enviada 5000 Ana

Cuando cambia la etapa en Sheets, se actualiza el deal en HubSpot:

Google Sheets Trigger (cambio en columna "Etapa")
  → HubSpot — Find Deal by email
  → HubSpot — Update Deal Stage
  → Slack — notificar al comercial si el deal avanzó

Cuando el deal avanza en HubSpot (email de propuesta abierta, reunión agendada):

HubSpot Trigger (deal.stageChange)
  → Google Sheets — Find Row by email
  → Google Sheets — Update Row (nueva etapa)
  → Gmail — notificar al responsable

Sincronización masiva: importar desde Sheets a HubSpot

Cuando tienes cientos de contactos en Sheets que quieres añadir al CRM:

Manual Trigger
  → Google Sheets — Get All Rows (filas con Estado = "importar")
  → Split in Batches (10 a la vez, para no saturar la API)
  → Loop
    → HubSpot — Upsert Contact (crea o actualiza si existe el email)
    → Google Sheets — Update Row (Estado = "importado", ID_HubSpot = ID devuelto)
    → Wait (500ms entre batches)

El campo Upsert de HubSpot es perfecto para esto: si el email ya existe, actualiza; si no, crea.

Mantener consistencia con ID cruzado

La clave de una buena sincronización es guardar el ID del CRM en Sheets y viceversa:

  • Columna en Sheets: ID_HubSpot
  • Propiedad en HubSpot: google_sheets_row (custom property)

Con el ID cruzado, actualizar y buscar registros es mucho más rápido y confiable que buscar por email.

Conclusión

Sincronizar tu CRM con Google Sheets usando n8n combina la potencia de un CRM profesional con la flexibilidad de las hojas de cálculo. Para sincronización unidireccional (CRM → Sheets) el setup es muy sencillo. Para bidireccional, necesitas planificar bien el mecanismo anti-bucle. El resultado es un sistema donde tu equipo puede trabajar en la herramienta que prefiere y los datos siempre están actualizados en ambos lados.