Clean Lead Intake From Messy Sources With n8n & Lusha

Hi Everyone! :waving_hand:

Jesse from Lusha here to show you how to handle messy lead intake before it hits HubSpot using n8n. Leads coming from Google Sheets and Telegram are normalized with AI, checked against existing records using hard and fuzzy matching, enriched with Lusha only when needed, and then synced as clean, trusted records. The result is fewer duplicates, lower enrichment costs, and a CRM people actually trust. You can also find the full workflow tutorial in Lusha’s campus and other n8n workflows here. Enjoy!

How to set it up

01 Use the n8n template

Start from the “Sync and enrich HubSpot leads from Google Sheets and Telegram with Gemini and Lusha” template. It handles intake → normalization → matching → enrichment → CRM sync in one flow.

02 Connect all credentials

Authenticate in n8n:

  • HubSpot

  • Lusha API key

  • Google Gemini

  • Google Sheets

  • Telegram bot

03 Configure your Google Sheet

Input your Spreadsheet ID in both:

  • The Trigger node (listens for new rows)

  • The Acknowledge node (updates status after processing)

04 Set up Telegram trigger

Configure the Telegram node to listen for messages in your designated lead channel or bot. Unstructured text messages will be parsed by Gemini.

05 Adjust matching sensitivity

In the Switch Logic node, set your fuzzy matching algorithm threshold:

  • Default: 80% (recommended starting point)

  • Higher (85–90%): Stricter matching, fewer false positives

  • Lower (70–75%): Looser matching, catches more variants

This two-tier matching (hard + fuzzy) prevents duplicates and saves Lusha credits by avoiding unnecessary API calls.

06 Configure enrichment triggers

The workflow automatically calls Lusha’s Person and Company APIs only when key fields are missing—like email, role, or firmographic data.

This targeted approach keeps costs efficient at scale. You’re not enriching everything, every time, just filling gaps.

07 Test with both input types

Try sample inputs:

  • Google Sheets: Add a row with name, company, email

  • Telegram: Send “John Smith at Acme Corp, worth reaching out”

Confirm:

  • Gemini normalizes Telegram text correctly

  • Matching catches existing HubSpot contacts

  • Enrichment runs only when needed

  • HubSpot updates appear (create or update)

  • Google Sheet status updates

  • Telegram confirmation message sent

What you get

A flexible intake engine that accepts leads from multiple sources (Sheets, Telegram, or any webhook), normalizes messy inputs into a standard structure, intelligently matches against existing HubSpot records to prevent duplicates, enriches conditionally (only what’s missing), and closes the loop with status updates and notifications.

What did you think? Happy to answer any comments or questions in the comments below!