Enrich LinkedIn profiles in Google Sheets with n8n
Deep-enrich LinkedIn profile URLs in a Google Sheet: full work history with dates, education, skills, languages, certifications, followers, and connections.
Deep-enrich a list of LinkedIn profile URLs in Google Sheets: name, headline, location, About, current role, full work history with dates, education, skills, languages, certifications, open profile and premium flags, followers, and connections. Rerun it any time: people already enriched are skipped. It is 18x more cost-effective than Clay and about 2x more than popular Apify scrapers at 1,000 profiles a month.
Deep or wide? This recipe is for deep research on specific people: LinkedIn allows about 100 full profile views per account per day. For wide list building, use search instead: up to 2,500 Sales Navigator results or 1,000 LinkedIn search results per account per day, with name, headline, About, current role, company, and tenure for every lead. See Export a Sales Navigator search to Google Sheets, then deep-enrich only the leads that qualify.
Why enrich before outreach, and how to run the same flow from MCP or REST: see the playbook Enrich any LinkedIn profile with full structured data and the guide Deep vs wide LinkedIn enrichment without Clay.
Import the template: Enrich LinkedIn profiles in Google Sheets with Periodix Actions
What you need
- A Periodix Actions account with a connected LinkedIn profile (3-day free trial)
- The Periodix Actions node installed (listed in n8n as Periodix LinkedIn), see Installation
- A Google Sheet with two tabs: Input with a
linkedin_urlcolumn, and Enriched with these headers: linkedin_url, public_identifier, provider_id, first_name, last_name, headline, location, current_title, current_company, current_role_since, past_roles, work_history, education, skills, languages, certifications, summary, open_profile, premium, network_distance, followers, connections, status, enriched_at
Workflow at a glance
Run Enrichment → Read Profiles to Enrich → Read Already Enriched → Build Queue → Loop Over Profiles → Get Profile (Periodix Actions) → Normalize Profile → Save to Enriched Tab
Step by step
1. Read Profiles to Enrich and Read Already Enriched (Google Sheets)
Reads every URL from the Input tab and everything already in the Enriched tab. The Enriched read runs once and continues even if the tab is empty.
2. Build Queue (Code node)
Extracts the public identifier from each URL (the part after /in/), drops duplicates, and skips anyone already in the Enriched tab. This is what makes reruns safe and cheap.
3. Loop Over Profiles and Get Profile (Periodix Actions: Profile)
- Resource: Profile
- Operation: Get
- Profile: your connected LinkedIn profile
- Identifier:
{{ $json.identifier }} - Options → Notify: off, so the person is not notified of a profile view
- Settings → On Error: Continue, so one missing profile does not stop the run
4. Normalize Profile (Code node)
Flattens the profile into one row: the current role is the position without an end date, past roles are the last three positions as "Title @ Company", work history lists every position with start and end dates, skills are the top 10, and certifications are listed in full. Profiles that are not found get status: not found.
5. Save to Enriched Tab (Google Sheets: Append)
Appends each row. Columns are mapped by header name.
Example output (Enriched tab row)
{
"linkedin_url": "https://www.linkedin.com/in/janedoe",
"public_identifier": "janedoe",
"provider_id": "ACoAAExample123",
"first_name": "Jane",
"last_name": "Doe",
"headline": "Head of Growth at Example SaaS",
"location": "London, United Kingdom",
"current_title": "Head of Growth",
"current_company": "Example SaaS",
"current_role_since": "2024-03",
"past_roles": "Growth Lead @ Example Labs; Marketing Manager @ Example Co",
"work_history": "Head of Growth @ Example SaaS (2024-03 to present); Growth Lead @ Example Labs (2021-06 to 2024-02); Marketing Manager @ Example Co (2018-09 to 2021-05)",
"education": "University of Example",
"skills": "Growth Marketing, B2B SaaS, Demand Generation",
"languages": "English, French",
"certifications": "Google Analytics Certification; HubSpot Inbound Marketing",
"summary": "I help B2B SaaS teams build pipeline...",
"open_profile": false,
"premium": true,
"network_distance": "DISTANCE_2",
"followers": 4200,
"connections": 3100,
"status": "enriched",
"enriched_at": "2026-09-30T09:00:00.000Z"
}Customization
- Wide first, deep second: start from a Sales Navigator search, score leads with AI from their search data, and feed only the qualified ones into this workflow.
- Send to a CRM: replace the last node with HubSpot, Notion, or any CRM node.
- Score while you enrich: add an AI step after Normalize Profile to score each person against your ICP.
- Enrich large lists over several days: switch the Manual Trigger to a Schedule Trigger that runs daily. The workflow skips anyone already enriched, so each run continues where the last one stopped.
- Reach out next: use
provider_idwith the Periodix Actions Connection or Message operations.
Limits and pricing
| Mode | Action | Daily limit per LinkedIn account |
|---|---|---|
| Deep | Get Profile | About 100 profiles |
| Wide | Sales Navigator search | Up to 2,500 results |
| Wide | LinkedIn search | Up to 1,000 results |
These are LinkedIn's limits and apply on every plan. Pricing: $10/month per connected LinkedIn profile with 1,000 results included, and every next 2,000 results for just $10, or $49/month unlimited. Each enriched profile or search result counts as one result.
Troubleshooting
- Everyone is skipped: the Enriched tab already has them, or the Input column is not named
linkedin_url. - status is "not found": the URL is wrong or the profile is no longer available.
- Some profiles fail after about 100 in a day: that is LinkedIn's daily limit for full profile views per account. Run the workflow again the next day, connect another profile, or switch to search for wide lists.
- Empty columns: the Enriched tab headers must match the output field names exactly.
Related
Updated 1 day ago