GitHub + Google Sheets: clean leads, no duplicates
Finding developer leads sounds simple until you actually do it. You search GitHub, open profiles, copy details into a sheet, then realize half the list is missing emails or full of repeats.
GitHub lead automation hits recruiters first, honestly. But SaaS founders running outbound and agencies building prospect lists feel the same drag: hours burned on “research” that’s mostly copy-paste and cleanup.
This workflow pulls developers from GitHub, enriches missing emails with Hunter.io, removes duplicates, and appends clean records into Google Sheets. You’ll see what it does, what you need, and how to make it fit your lead criteria.
How This Automation Works
Here’s the complete workflow you’ll be setting up:
n8n Workflow Template: GitHub + Google Sheets: clean leads, no duplicates
flowchart LR
subgraph sg0["Schedule Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Schedule Trigger", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Define Developer Searches"]
n2["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Search GitHub Users"]
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Parse Users"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Get User Details"]
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Extract Developer Data"]
n6@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Need Email Enrichment?", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Hunter.io Email Lookup"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Update With Email"]
n9@{ icon: "mdi:database", form: "rounded", label: "Check For Duplicates", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Filter Duplicates"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Format For Database"]
n12@{ icon: "mdi:database", form: "rounded", label: "Add to Lead Database", pos: "b", h: 48 }
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n13 --> n10
n3 --> n4
n4 --> n5
n0 --> n1
n10 --> n11
n8 --> n9
n8 --> n13
n11 --> n12
n2 --> n3
n9 --> n13
n5 --> n6
n7 --> n8
n6 --> n7
n6 --> n10
n1 --> n2
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n6 decision
class n9,n12 database
class n2,n4,n7 api
class n1,n3,n5,n8,n10,n11 code
classDef customIcon fill:none,stroke:none
class n1,n2,n3,n4,n5,n7,n8,n10,n11,n13 customIcon
Why This Matters: Clean dev leads without the busywork
Manual GitHub sourcing has a nasty pattern: it starts “just for a few leads,” then quietly eats your week. You collect profiles, paste them into a sheet, and by the time outreach starts you’re already doubting the list. Emails are missing, names don’t match usernames, and duplicates show up because two different searches surfaced the same person. Worst part? You only notice the problems after you’ve sent messages or imported the list into your CRM. That’s when it becomes expensive.
The friction compounds. Here’s where it breaks down in real life.
- Every new GitHub search creates another “version” of the same lead list, so duplicates are almost guaranteed.
- Email enrichment happens late (or not at all), which means outreach gets delayed or filled with guesswork.
- People copy inconsistent fields into Sheets, so filtering by location, company, or tech stack becomes unreliable.
- When a teammate asks “Where did this lead come from?”, you end up re-opening GitHub profiles to rebuild context.
What You’ll Build: GitHub to Sheets lead sourcing with enrichment
This automation runs on a schedule, searches GitHub for developers based on your query list, and then pulls back profile details for each result. Once it has the developer data, it checks whether an email is already available. If not, it calls Hunter.io to look up a professional email using the developer’s domain context, then applies that enrichment back onto the lead record. After that, it compares the lead against your existing Google Sheets database to catch duplicates before anything gets added. Finally, it appends only the cleaned, structured record into your Google Sheets “CRM” so your outreach list stays trusted instead of bloated.
The workflow starts from a scheduled trigger, then GitHub is queried and profiles are compiled into a consistent schema. Hunter.io enrichment runs only when needed, and a separate Google Sheets lookup helps the workflow decide what’s genuinely new. The output is a single sheet that stays clean over time.
What You’re Building
| What Gets Automated | What You’ll Achieve |
|---|---|
|
|
Expected Results
Say you want 30 new developer leads per day. Manually, you might spend about 3 minutes per lead opening profiles, copying fields, and checking if they’re already in your sheet, which is roughly 90 minutes before you even think about emails. Add another minute per lead to hunt for contact details and it creeps toward 2 hours. With this workflow, you spend about 10 minutes refining your GitHub queries and reviewing the sheet, while the enrichment, duplicate checks, and appending run in the background.
Before You Start
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- GitHub API to search users and profiles
- Google Sheets to store your lead database
- Hunter.io API key (get it from your Hunter dashboard)
Skill level: Intermediate. You’ll connect accounts, paste API keys, and adjust a query list (light editing, not heavy coding).
Want someone to build this for you? Talk to an automation expert (free 15-minute consultation).
Step by Step
A scheduled run kicks things off. The workflow starts with a Schedule Trigger, so you can run it hourly, daily, or on whatever cadence matches your outbound rhythm.
Your GitHub queries are set, then executed. A query list is prepared (for example: language filters, location keywords, or role hints), and an HTTP request searches GitHub users. The results are parsed so the workflow can loop through them safely.
Profiles are fetched and compiled into a clean record. For each user, the workflow pulls profile details, then compiles the fields you actually care about into a consistent lead format that plays nicely in Google Sheets.
Email enrichment and dedupe happen before the sheet is updated. An “email present?” check routes leads either directly forward or through Hunter.io enrichment, then a Google Sheets lookup plus a dedupe step prevents the same person from being added twice.
You can easily modify the GitHub query list to target different stacks, regions, or seniority. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Schedule Trigger
Set the workflow cadence so the lead capture runs automatically on a weekly basis.
- Select Scheduled Automation Start and open the scheduling rule settings.
- Set Interval to
weeksto match the existing weekly trigger configuration. - Confirm the node is connected to Set Developer Query List as the next step in the chain.
Step 2: Connect GitHub Search Inputs
Define the developer search profiles and configure the GitHub search request that uses those parameters.
- In Set Developer Query List, review the jsCode array of searches and update
location,language, andminFollowersas needed. - Open GitHub User Search and set URL to
https://api.github.com/search/users. - Under Query Parameters, set q to
=location:{{ $json.location }} followers:>{{ $json.minFollowers }} language:{{ $json.language }}and per_page to30. - Under Header Parameters, set Accept to
application/vnd.github.v3+jsonand replace[CONFIGURE_YOUR_TOKEN]in Authorization with your GitHub token. - Credential Required: Connect your httpHeaderAuth credentials in GitHub User Search.
[CONFIGURE_YOUR_TOKEN] will cause GitHub API calls to fail or be rate-limited.
Step 3: Set Up Developer Profile Processing
Parse the GitHub search response, fetch individual profiles, and compute lead scoring and metadata.
- In Parse User Results, keep the current jsCode which maps the search results into individual developer items.
- In Fetch User Profiles, set URL to
={{ $json.userApiUrl }}and keep Send Headers enabled. - In Fetch User Profiles, update the Authorization header to your GitHub token (same value used in GitHub User Search).
- Verify Compile Developer Details uses the existing scoring logic in jsCode to set
leadScore,leadQuality, anddomain.
Step 4: Configure Email Enrichment and Lead Routing
Check for missing emails, enrich with Hunter, then route into duplicate checking and merge logic.
- In Email Enrichment Check, confirm the conditions include
={{ $json.domain }}not equalsand={{ $json.email }}equalsCheck website. - In Hunter Domain Email Lookup, set URL to
https://api.hunter.io/v2/domain-searchand set domain to={{ $json.domain }}, api_key to your Hunter key, and limit to3. - Review Apply Enriched Email to ensure it pulls from Compile Developer Details and overwrites
emailbased on best confidence. - Apply Enriched Email outputs to both Lookup Existing Leads and Combine Lead Paths in parallel.
- Confirm Combine Lead Paths is set to Mode
chooseBranchwith Use Data Of Input2to pass enriched results through the merge.
Step 5: Configure Google Sheets Output and Deduplication
Check existing leads, remove duplicates, format the record, and append it to your spreadsheet.
- In Lookup Existing Leads, select your Document
Lead Databaseand SheetSheet1. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Lookup Existing Leads.
- Verify Remove Duplicate Leads uses data from Lookup Existing Leads to compare
Business Name,Email, andNotes. - In Prepare Database Record, keep the lead ID format
GITHUB-${timestamp}-${randomNum}and field mapping to match your sheet columns. - In Append Lead to Sheet, set Operation to
appendand confirm the sheet columns includeLead ID,Business Name,Email,Lead Score, andStatus. - Credential Required: Connect your googleSheetsOAuth2Api credentials in Append Lead to Sheet.
Step 6: Test and Activate Your Workflow
Run the workflow manually to confirm end-to-end data capture, then activate for weekly lead scraping.
- Click Execute Workflow to run a manual test from Scheduled Automation Start.
- Verify GitHub User Search returns users and Parse User Results outputs developer items.
- Check that Apply Enriched Email produces an updated
emailwhen enrichment applies. - Confirm Remove Duplicate Leads allows only new leads through and Append Lead to Sheet appends rows to
Lead Database. - Once verified, toggle the workflow to Active to run on the weekly schedule.
Troubleshooting Tips
- GitHub credentials can expire or need specific permissions. If things break, check your token scopes in GitHub Developer Settings first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Quick Answers
About 30 minutes if your API keys are ready.
No. You’ll mostly connect accounts and edit a query list. The workflow already handles parsing, enrichment, and deduping.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Hunter.io API usage, which depends on how many lookups you run.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and you should. Most teams adjust the “Set Developer Query List” logic to match their target stack and locations, then tweak the Google Sheets lookup keys used in “Lookup Existing Leads” and “Remove Duplicate Leads.” You can also swap Hunter.io enrichment for “enrich only when company domain exists,” which keeps costs sane. If you want the leads to go somewhere else, replace the “Append Lead to Sheet” step with HubSpot, Airtable, or your CRM.
Usually it’s an expired or revoked GitHub token. Regenerate the token, then update the credential used by the GitHub HTTP Request nodes. If it still fails, check rate limits in the GitHub API response headers and reduce how many profiles you fetch per run. Permissions matter too; some org settings can block access depending on how the token was created.
On n8n Cloud, your monthly execution limit depends on the plan, and self-hosting has no hard cap beyond your server. Practically, GitHub rate limits and Hunter credits will be the bottleneck, so most teams run smaller batches a few times per day instead of one massive pull.
Often, yes, because GitHub sourcing usually needs looping, branching, and dedupe logic that gets awkward (and pricey) in simpler builders. n8n handles “search results → loop profiles → enrich conditionally → merge paths” cleanly, and you can self-host if you’re doing this at volume. Zapier or Make can still work if you only enrich a handful of leads and don’t care about a strict dedupe check. The bigger difference is control: with n8n you can tune queries, batching, and record formatting without fighting platform limits. If you want help choosing, Talk to an automation expert.
You end up with a lead sheet your team doesn’t have to apologize for. Set it once, let it run, and use the time you get back to actually write messages and book calls.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.