AutomationFlowsCRM & Sales › Sync Leads Between Google Sheets and Hubspot Contacts

Sync Leads Between Google Sheets and Hubspot Contacts

ByMilan Vasarhelyi - SmoothWork @vasarmilan on n8n.io

[](https://youtu.be/GBKXYh2j74o)

Event trigger★★☆☆☆ complexity6 nodesGoogle SheetsHubSpot
CRM & Sales Trigger: Event Nodes: 6 Complexity: ★★☆☆☆ Added:

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

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
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "9da7b5b3-2083-46f2-aaf1-882a63affd36",
      "name": "Manual Trigger - Start Workflow",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "4a0676e0-33ef-4c11-8f5c-78bffc5ee7df",
      "name": "Get Contact Leads from Google Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        208,
        0
      ],
      "parameters": {
        "options": {},
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "SHEET_ID_PLACEHOLDER",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/GOOGLE_SHEET_DOCUMENT_ID_PLACEHOLDER/edit#gid=SHEET_ID_PLACEHOLDER",
          "cachedResultName": "example_contacts"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "GOOGLE_SHEET_DOCUMENT_ID_PLACEHOLDER",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/GOOGLE_SHEET_DOCUMENT_ID_PLACEHOLDER/edit?usp=drivesdk",
          "cachedResultName": "Leads for Hubspot Tutorial"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.7
    },
    {
      "id": "0d68f90f-36a9-47e4-a644-c217742a92cf",
      "name": "Create or Update HubSpot Contact",
      "type": "n8n-nodes-base.hubspot",
      "position": [
        416,
        0
      ],
      "parameters": {
        "email": "={{ $json.Email }}",
        "options": {},
        "authentication": "appToken",
        "additionalFields": {
          "firstName": "={{ $json.Name }}",
          "companyName": "={{ $json['Company Name'] }}",
          "phoneNumber": "={{ $json['Phone Number'] }}"
        }
      },
      "credentials": {
        "hubspotAppToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "doc-note-1771263655469",
      "name": "Workflow Description",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -700,
        -150
      ],
      "parameters": {
        "width": 600,
        "height": 913,
        "content": "## Workflow Overview\n\nThis workflow automatically imports leads from a Google Sheets spreadsheet directly into your HubSpot account. When executed, it reads contact information from a designated spreadsheet and creates or updates corresponding contact records in HubSpot, preventing duplicates by matching on email addresses.\n\n### First Setup\n\n**HubSpot Credentials:**\n1. Create a developer account at `developers.hubspot.com`\n2. Navigate to **Legacy Apps** and create a new **private app**\n3. In the **Scopes** tab, add the following permissions:\n   - `crm.objects.contacts.read`\n   - `crm.objects.contacts.write`\n   - `crm.objects.companies.read`\n   - `crm.objects.companies.write`\n4. Copy the **Access Token** from the **Auth** tab\n5. In n8n, create a HubSpot credential using **APP Token** method and paste your token\n\n**Google Sheets:**\nConnect your Google account to n8n when configuring the Google Sheets node.\n\n### Configuration\n\n- **Google Sheets Node:** Update the document and sheet selection to point to your own spreadsheet containing lead data\n- **HubSpot Node:** Field mappings are already configured to match common contact properties (Email, Company Name, Name, Phone Number). Adjust these mappings if your spreadsheet has different column names or if you need to sync additional fields."
      },
      "typeVersion": 1
    },
    {
      "id": "contact-note-1771263708642",
      "name": "Creator Contact Info",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -700,
        -610
      ],
      "parameters": {
        "color": 5,
        "width": 600,
        "height": 440,
        "content": "# Contact Us:\n## Milan @ SmoothWork - [Book a Free Consulting Call](https://smoothwork.ai/book-a-call/)\n![Milan](https://gravatar.com/avatar/95700d17ba300a9f14c1b8cacf933df7720027b3adda9cbe6183d89142925422?r=pg&d=retro&size=100)\n\n\n### We help businesses eliminate busywork by building compact business tools tailored to your process.\n### Contact us for customizing this, or building similar automations.\n\n\ud83d\udce7 hello@smoothwork.ai\n\u25b6\ufe0f [Check us on YouTube](https://www.youtube.com/@vasarmilan)\n\ud83d\udcde [Book a Free Consulting Call](https://smoothwork.ai/book-a-call/)\n\ud83d\udcbc [Add me on Linkedin](https://www.linkedin.com/in/mil%C3%A1n-v%C3%A1s%C3%A1rhelyi-3a9985123/)\n"
      },
      "typeVersion": 1
    },
    {
      "id": "video-note-1771324743904",
      "name": "Video Walkthrough",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -90,
        -610
      ],
      "parameters": {
        "width": 420,
        "height": 340,
        "content": "# Video Walkthrough\n[![image.png](https://vasarmilan-public.s3.us-east-1.amazonaws.com/blog_thumbnails/thumbnail_reczH8mtRj3GIIRiU.jpg)](https://youtu.be/GBKXYh2j74o)"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Manual Trigger - Start Workflow": {
      "main": [
        [
          {
            "node": "Get Contact Leads from Google Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Contact Leads from Google Sheet": {
      "main": [
        [
          {
            "node": "Create or Update HubSpot Contact",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

[](https://youtu.be/GBKXYh2j74o)

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

More CRM & Sales workflows → · Browse all categories →

Related workflows

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

CRM & Sales

This workflow automates lead ingestion from Google Sheets and Telegram, leveraging Gemini AI and Lusha for intelligent matching and deep data enrichment. By normalizing incoming data into a standard s

HubSpot, Telegram Trigger, Google Gemini +4
CRM & Sales

This workflow automatically syncs Calendly meeting bookings into HubSpot CRM by checking if the invitee already exists as a contact. It extracts attendee details, creates or updates contacts in HubSpo

Calendly Trigger, HubSpot
CRM & Sales

This workflow automatically syncs your Zendesk tickets to your HubSpot contacts. Every 5 minutes, your HubSpot account collects all the newly modified data and updates it into your Zendesk account, up

Function Item, HubSpot, Zendesk
CRM & Sales

This workflow synchronizes data both ways between Pipedrive and HubSpot. Cron node schedules the workflow to run every minute. Pipedrive and Hubspot nodes pull in both lists of persons from Pipedrive

Pipedrive, HubSpot
CRM & Sales

This workflow synchronizes data one-way from Pipedrive to HubSpot. Cron node schedules the workflow to run every minute. Pipedrive and Hubspot1 nodes pull in both lists of persons from Pipedrive and c

HubSpot, Pipedrive