Recruiter friend was losing half her day to manually typing LinkedIn profiles into a sheet – built her a workflow that ends the retyping

:waving_hand: Hey n8n Community,

You might remember Lisa, she’s Mike’s recruiter and the protagonist of the CV Slack Assistant workflow I posted a couple of weeks back. We had a short meeting yesterday so she could give me feedback, and the headline was the best thing you can hear as a builder: both her workflows are smooth, no breaks, and she actually uses them every day.

Then she mentioned a friend, let’s call her Anna, who works in recruiting too but mostly does active sourcing on LinkedIn. Lisa thought her workflow was a candidate for automation. She wasn’t wrong.

:mouse_trap: The trap Anna’s in

Anna’s process is actually really disciplined:

  1. Look for interesting profiles on LinkedIn
  2. Gather them in a Google Sheet (name, role, company, location, skills, recent roles…)
  3. Filter for actual fit
  4. Only then reach out to the candidates who match

The good news about doing it that way: she barely wastes time messaging the wrong people.

The bad news: by the time she’s written her first message of the day, she’s already spent half the day manually typing data from LinkedIn profiles into a sheet.

So I asked Lisa to introduce me, and built Anna a workflow that ends the typing part.

:link: What I built

Anna drops either a LinkedIn screenshot or LinkedIn’s official “Save to PDF” export into a dedicated Slack channel. The workflow extracts the profile into a structured candidate row in her Google Sheet, name, current title and company, location, years of experience, top skills, last 3 roles, education, certifications, one-line summary, plus a source tag so sourced candidates are distinguishable from CV applicants in the same sheet (yes, the schema matches Lisa’s CV onboarding output, so it’s one database, two intake paths).

It also deduplicates: if Anna drops the same person twice, or someone Lisa already onboarded as a CV applicant, the bot replies in-thread with a “this candidate is already in the database, sourced on [date]” warning and a button straight to the sheet. New candidates get the green “added” message with the same button.

:puzzle_piece: The pieces

  • Slack Trigger fires on file uploads in the watched channel
  • files.info lookup, Slack’s file_shared event payload is minimal and doesn’t include the download URL directly
  • easybits Extractor (verified community node), 10-field schema, multimodal so it handles PDFs and screenshots in the same node
  • Code node for normalization and source tagging
  • Read sheet → dedup Code node → IF for routing
  • Direct HTTP POST to Slack’s chat.postMessage for the in-thread confirmation with a button to the sheet

Runs on the easybits free plan (50 extractions/month, 10 fields max, covers Anna’s volume fine).

:turtle: One honest caveat

LinkedIn “Save to PDF” gives you the full profile (all roles, all skills). Screenshots truncate at the “Show all” fold. Both work in the workflow, but if accurate years-of-experience or the full skill list matters, PDF wins. Also worth knowing: LinkedIn Recruiter allows ~200 PDF exports per seat per month, standard accounts ~100. Covers almost everyone, but if you’re sourcing at huge volume you’d hit a ceiling.

:wrench: Workflow JSON

:speech_balloon: Feedback welcome

Would love to see this stress-tested by other active sourcers, does the schema map to how you actually capture candidates, or are there fields you’d add or drop?

And more broadly: what’s the dumbest manual step in your current sourcing process? Curious where the next workflow should go.

Best,
Felix

1 Like