This n8n workflow shows how to handle messy lead intake before it hits HubSpot. 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.

Someone adds a row to a Google Sheet.
Someone forwards a Telegram message with a name and a vague “worth reaching out.”
A few hours later, another version of the same lead shows up somewhere else.

None of that is unusual. What is unusual is teams expecting their CRM to magically stay clean once those inputs start flowing in unchecked.

This workflow exists because most lead problems aren’t about enrichment or scoring. They’re about intake — how raw, inconsistent inputs are handled before they become permanent records.

This is a real n8n template, built to take leads from Google Sheets and Telegram, normalize them, match them intelligently against existing CRM records, enrich them only when needed, and then sync the result into HubSpot in a way that doesn’t create duplicates or waste credits.

The orchestration happens in n8n, enrichment is handled by Lusha, AI parsing is done with Gemini, and the system of record is HubSpot.

The tools matter, but what really matters is the sequence.

Why this workflow exists

Most teams already have lead enrichment.
Most teams already have CRM automation.
Many teams even have deduplication rules.

And still, the CRM slowly fills up with near-duplicates, half-correct records, and contacts nobody fully trusts.

That usually happens because enrichment and cleanup are applied after the lead is already inside the CRM.

This workflow flips that logic around.

It treats lead intake as a system boundary, not a formality.

Where leads come from in this setup

This workflow is intentionally agnostic about intake.

Leads can arrive from:

  • Google Sheets, where teams collect lists, event leads, internal handoffs, or imported data
  • Telegram, where sales, founders, or partners drop raw leads in free text

Instead of forcing everyone into a single “proper” channel, the workflow accepts that reality and standardizes it centrally.

How the workflow works, step by step

1. Intake from multiple sources

The workflow listens to both Google Sheets and Telegram as triggers.

Sheets usually provide structured rows.
Telegram usually provides unstructured text.

Both are treated as first-class inputs.

2. Normalize raw input into a standard structure

This is where Gemini is used, and it’s important to be clear about why.

Gemini isn’t used to score leads or make decisions. It’s used to:

  • Parse free text from Telegram
  • Extract names, company hints, emails if present
  • Output everything into a consistent structure

The goal is simple: make sure every lead looks the same before any logic runs.

Without this step, everything downstream becomes brittle.

3. Intelligent matching before enrichment

Before calling Lusha or touching the CRM, the workflow runs a custom matching layer.

This includes:

  • Hard matching (exact email, exact identifiers)
  • Fuzzy matching using a similarity threshold (default set to 80, adjustable)

This two-tier approach does two things:

  1. Prevents duplicate records in HubSpot

  2. Saves enrichment credits by avoiding unnecessary Lusha calls

This is one of the most important parts of the workflow, and it’s often skipped in simpler automations.

4. Conditional enrichment with Lusha

Only after normalization and matching does enrichment happen.

If key fields are missing  like email, role, or firmographic data — the workflow triggers the Lusha API to fill in the gaps.

This isn’t “enrich everything, every time.”
It’s targeted enrichment based on what’s actually missing.

That’s how this setup stays efficient at scale.

5. Sync to HubSpot as create or update

Based on the matching result, the workflow either:

  • Updates an existing HubSpot record
  • Or creates a new one with validated, enriched data

At this point, the CRM only receives data that has already passed through structure, matching, and enrichment checks.

6. Close the loop operationally

Once a lead is processed, the workflow:

  • Updates the original Google Sheet with a status
  • Sends a Telegram notification to the team

This matters more than it sounds. It gives visibility into what happened and prevents people from re-submitting the same lead “just in case.”

Why builders tend to like this pattern

This workflow doesn’t try to be clever. It tries to be reliable.

  • Intake is flexible, not prescriptive
  • AI is used for structure, not judgment
  • Matching happens before enrichment, not after
  • CRM updates are deliberate, not automatic
  • Feedback loops are built in

Most importantly, it assumes the workflow will be used repeatedly, by real people, with imperfect inputs.

That’s what makes it hold up over time.

When this setup makes sense

This pattern is especially useful if:

  • Leads arrive from more than one place
  • Sales uses chat or spreadsheets to share prospects
  • CRM duplicates are already a background problem
  • Enrichment costs matter
  • You want automation that still works six months from now

Builder takeaway

Clean CRMs aren’t the result of better cleanup jobs.
They’re the result of better boundaries.

Handle lead intake properly, and everything downstream becomes easier to reason about, easier to maintain, and easier to trust.

That’s what this workflow is really doing.

Use this template for free


Keep reading:

Introducing Lusha Signals API

How Lusha uses job-change signals to re-activate high-intent prospects

Lusha + monday CRM: keep every board enriched with verified data

Waterfall data enrichment: why streaming data beats static stacking

FAQs

This workflow solves the messy middle between lead capture and CRM entry. It handles unstructured leads from spreadsheets and chat, normalizes them, checks for existing records, enriches only when needed, and prevents duplicates from entering HubSpot.

It uses a two-tier matching approach: hard matching for exact identifiers and fuzzy matching with a configurable similarity threshold. This ensures existing records are updated instead of creating near-duplicates.

AI is used only for normalization. Gemini parses unstructured text from Telegram and turns it into a predictable data structure. It does not score leads, make decisions, or replace logic in the workflow.

Lusha enrichment is triggered conditionally, only when required fields like email or firmographic data are missing. This avoids unnecessary API calls and helps control enrichment costs.

Out of the box, it supports Google Sheets and Telegram, but the same pattern can be extended to Slack, forms, Airtable, webhooks, or other intake sources supported by n8n.

RevOps teams, growth engineers, and builders who manage CRM hygiene, care about enrichment costs, and want automations that stay reliable as volume grows.

Yes. Similarity thresholds, enrichment conditions, intake sources, and notification logic can all be adjusted based on how strict or flexible your data requirements are.

Stay up-to-data on the latest in sales & marketing with our newsletter.

    Thank you for subscribing