Find LinkedIn event attendees and turn them into scored leads with n8n

Find people who post that they are attending an event, check real intent and ICP fit with AI in one call, and save hot leads with a connection note built from their own post.

Find people who post on LinkedIn that they are going to an event, keep only those who show real personal intent to attend and fit your ICP, and save them with a connection note built from their own reason for going. It works for any conference, meetup, or trade show your team attends.

Import the template: Score LinkedIn event leads with Periodix Actions, Claude, and Google Sheets

Why intent matters

Searching LinkedIn for an event name returns a lot of noise: sponsors, organizers, media, and people who only mention the event. This workflow asks AI to separate posts like "excited to be at SaaStr next week" from promotional posts, and scores anyone without real attendance intent low regardless of ICP fit. You only spend a second AI call, the connection note, on people who are actually going and actually fit.

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
  • An AI provider API key: Claude by default, OpenAI or Gemini also work
  • A Google Sheet with two tabs, Hot and Cold, with column headers matching the output fields below

Workflow at a glance

Run Daily → Event Config → Find Event Posts (Periodix Actions) → Extract and Filter Authors → Process Each Person → Quick Score with AI → Parse Score → Hot or Cold? → Draft Connection Note → Parse Note → Save Hot Lead / Save Cold Lead

Step by step

1. Run Daily (Schedule Trigger)

Runs once a day at 9:00. Daily runs catch new "I will be there" posts as the event gets closer.

2. Event Config (Set node)

FieldExampleWhat it controls
event_keywordsSaaStr AnnualThe event name or hashtag used to find posts
icp_keywordsfounder, head of, growth, marketing, sales, revenueCheap pre-filter on headline and company, before any AI call
icp_descriptionRole, company type, sizePassed to AI for scoring
offerOne sentence on what you offerPassed to AI for the connection note
score_threshold7Minimum score to count as a hot lead
posts_limit50How many posts to pull per run

3. Find Event Posts (Periodix Actions: Search)

  • Resource: Search
  • Profile: your connected LinkedIn profile
  • Search URL:
{{ "https://www.linkedin.com/search/results/content/?keywords=" + encodeURIComponent($("Event Config").first().json.event_keywords) }}
  • Limit: {{ $("Event Config").first().json.posts_limit }}

The search runs asynchronously and can take a few minutes. Each post becomes one item with its author.

4. Extract and Filter Authors (Code node)

Takes the author of each post, dedupes by provider_id, and drops anyone whose headline or company contains none of your icp_keywords. This happens before any AI call, so you do not pay to score people who were never going to qualify. Leave icp_keywords empty to skip the pre-filter.

Output fields per person:

FieldSource
name, headline, companyPost author's profile
provider_idLinkedIn ID, used later to send a connection request
profile_urlPublic profile URL
matched_postFirst 500 characters of their post
post_urlLink to the post

5. Process Each Person (Loop Over Items)

Processes one person at a time and sends them to the Hot or Cold path.

6. Quick Score with AI (HTTP Request)

One short AI call judges two things at once: whether the post shows the author's own intent to attend, and ICP fit from 1 to 10. If there is no real intent, the score is 2 or lower regardless of ICP. The default is Claude Haiku via the Anthropic API, one request every 1.5 seconds, with retry on failure.

7. Parse Score (Code node)

Parses the JSON reply into score and reason. If parsing fails, the person gets a score of 0 and the reason parse error.

8. Hot or Cold? (If node)

{{ $json.score }} is greater than or equal to {{ $("Event Config").first().json.score_threshold }}. Cold leads go straight to the Cold tab with the score and reason, at no further AI cost.

9. Draft Connection Note and Parse Note (HTTP Request + Code)

Only for hot leads. A second AI call writes a connection note under 300 characters that references the person's own reason for attending and mentions meeting at the event when it reads naturally. The note is saved as connection_note.

10. Save Hot Lead (Google Sheets)

Appends the person with score, reason, and connection note to the Hot tab.

Example output (Hot tab row)

{
  "name": "Alex Martin",
  "headline": "VP Revenue at Example Cloud",
  "company": "Example Cloud",
  "provider_id": "ACoAAExample456",
  "profile_url": "https://www.linkedin.com/in/alexmartin",
  "matched_post": "Heading to SaaStr Annual next week. Looking forward to the sessions on AI in outbound...",
  "post_url": "https://www.linkedin.com/feed/update/urn:li:activity:0000000000000000000",
  "score": 8,
  "reason": "Personally attending, revenue leader at a B2B SaaS company, interested in AI outbound.",
  "connection_note": "Hi Alex, saw you are heading to SaaStr for the AI in outbound sessions. Same reason I am going, would be great to connect and maybe grab a coffee there."
}

Next step: send the connection requests

Add a Periodix Actions node after Save Hot Lead:

  • Resource: Connection
  • Operation: Send Request
  • Recipient: {{ $json.provider_id }}
  • Note: {{ $json.connection_note }}

Send one to two weeks before the event, so people have time to accept and reply before they arrive. Add a Wait node with a randomized delay between sends.

Customization

  • Several events: duplicate Event Config values per event, or run the workflow once per keyword.
  • Recurring series: point event_keywords at a monthly meetup and update it each cycle.
  • Stricter filter: raise score_threshold to 8 for fewer, better matches.
  • Different AI provider: swap the URL and body in both AI nodes independently.

Troubleshooting

  • Search returns posts but nobody reaches AI: your icp_keywords are too narrow. Add terms or leave the field empty.
  • Mostly low scores with "no intent" reasons: normal for big events with many sponsor and media posts. Try the event hashtag or phrases like "see you at" plus the event name.
  • Scores of 0 with reason "parse error": the AI reply was not valid JSON. Check the model name and API key, and keep the "Return raw JSON only" instruction.
  • Search URL or score condition not working after editing: make sure every expression is wrapped in {{ }}.
  • The same person appears on different days: the workflow dedupes within one run only. Read the Hot and Cold tabs first and filter by provider_id, or use the Google Sheets Append or Update operation matched on provider_id.

Related


Did this page help you?