# Periodix Actions & Playbooks — Full Content Machine-readable export of every published Action, Playbook, and Use case. Ordered bottom-up: primitives → compositions → groupings. ## Actions --- ### Get Company Profile URL: https://actions.periodix.net/playbooks/actions/get-company-profile Slug: `get-company-profile` Retrieve a LinkedIn company profile by public identifier, numeric ID, or URN. Returns name, industry, employee-count range, description, locations, specialities, website, and follower count. It works on any company, including accounts from a LinkedIn or Sales Navigator company search. Use it for B2B filtering by company size or industry before you commit outreach. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. | | identifier | string | yes | The company: public identifier (part after /company/), numeric ID, or URN. | **JSON output** ```json { "identifier": "stripe" } ``` **Limits**: One company per call. Automatic rate limiting. **Invocations** - **MCP** — tool_name: `get-company-profile` - **REST** — `POST /v1/actions/get-company-profile/v1` - **n8n** — resource: ` Company`, operation: `Get` --- ### Get Connections URL: https://actions.periodix.net/playbooks/actions/get-relations Slug: `get-relations` List the 1st-degree connections of a connected LinkedIn account, with profile details. Use it to re-engage existing contacts, find mutual connections, or analyze your network. The warmest audience you have, no connection request needed. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile whose connections you want. | | limit | number | no | Connections per page, up to 1000. | | cursor | string | no | Pagination cursor. | **JSON output** ```json { "items": [ { "provider_id": "ACoAA...", "name": "Lena Ortiz", "headline": "Founder at Brightline", "company": "Brightline", "profile_url": "https://www.linkedin.com/in/lortiz" } ], "cursor": "eyJwYWdlIjoy..." } ``` **Limits**: Up to 1000 per page, paginate with cursor. Automatic rate limiting. **Invocations** - **n8n** — resource: `Connection`, operation: `Get Many` - **REST** — `POST /v1/actions/get-relations/v1` - **MCP** — tool_name: `get-relations` --- ### Get InMail Balance URL: https://actions.periodix.net/playbooks/actions/get-inmail-balance Slug: `get-inmail-balance` Get the remaining InMail credit balance for the connected account (Premium, Recruiter, or Sales Navigator). Use it to check allowance before sending InMail at scale. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. | **JSON output** ```json { "balance": 25, "type": "sales_navigator" } ``` **Limits**: None notable. **Invocations** - **MCP** — tool_name: `get-inmail-balance` - **n8n** — resource: `Message`, operation: `Get InMail Balance` - **REST** — `POST /v1/actions/get-inmail-balance/v1` --- ### Get Post Comments URL: https://actions.periodix.net/playbooks/actions/get-post-comments Slug: `get-post-comments` List the comments on a LinkedIn post, including the full comment text and full author details. Commenters are a higher-intent signal than reactions, and their words give AI real material to personalize outreach with. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. | | postId | string | yes | The post's social_id (returned by Get User Posts), not the numeric ID in the post URL. | | limit | number | no | Comments per page, up to 100. | | cursor | string | no | Pagination cursor. | **JSON output** ```json { "items": [ { "text": "This matches what we see in outbound.", "author": { "provider_id": "ACoAA...", "name": "Marcus Patel", "headline": "Head of Growth at Northwind", "company": "Northwind", "profile_url": "https://www.linkedin.com/in/mpatel" } } ], "cursor": "eyJwYWdlIjoy..." } ``` **Limits**: Up to 100 per page, paginate with cursor. Automatic rate limiting. **Invocations** - **REST** — `POST /v1/actions/get-post-comments/v1` - **n8n** — resource: `Post`, operation: `Get Comments` - **MCP** — tool_name: `get-post-comments` --- ### Get Post Reactions URL: https://actions.periodix.net/playbooks/actions/get-post-reactions Slug: `get-post-reactions` List the people who reacted to a LinkedIn post, including full author details. These are warm leads who already engaged with your topic, the raw material for signal-based prospecting. Optionally target reactions on a specific comment. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. | | postId | string | yes | The post's social_id (returned by Get User Posts), not the numeric ID in the post URL. | | commentId | string | no | Get reactions on a specific comment instead of the post. | | limit | number | no | Reactions per page, up to 100. | | cursor | string | no | Pagination cursor. | **JSON output** ```json { "items": [ { "reaction_type": "LIKE", "author": { "provider_id": "ACoAA...", "name": "Jane Doe", "headline": "VP Sales at Acme", "company": "Acme", "profile_url": "https://www.linkedin.com/in/jane-doe" } } ], "cursor": "eyJwYWdlIjoy..." } ``` **Limits**: Up to 100 per page, paginate with cursor. Automatic rate limiting. **Invocations** - **REST** — `POST /v1/actions/get-post-reactions/v1` - **MCP** — tool_name: `get-post-reactions` - **n8n** — resource: `Post`, operation: `Get Reactions` --- ### Get Profile URL: https://actions.periodix.net/playbooks/actions/get-profile Slug: `get-profile` Retrieve the full LinkedIn profile of a person by public identifier or internal ID. Returns name, headline, summary, location, complete work experience, education, skills, languages, and certifications. It works on any LinkedIn profile, including leads you found through a LinkedIn or Sales Navigator search. The core enrichment action that turns a search result into rich data for CRM push or ICP scoring. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. From List Profiles. | | identifier | string | yes | The person to look up: public identifier (the part after /in/, e.g. john-doe) or internal ID (e.g. ACoAA...). | | notify | boolean | no | Whether the viewee sees the profile visit. Default false. | **JSON output** ```json { "name": "Jane Doe", "headline": "VP Sales at Acme", "summary": "Revenue leader ...", "location": "San Francisco, United States", "current_company": { "name": "Acme", "position": "VP Sales" }, "experience": [ { "title": "VP Sales", "company": "Acme", "start": "2022" } ], "education": [ { "school": "MIT", "degree": "BSc" } ], "skills": ["Sales", "SaaS", "Outbound"], "languages": ["English"], "certifications": [] } ``` **Limits**: One profile per call. Automatic rate limiting. **Invocations** - **n8n** — resource: `Profile`, operation: `Get` - **MCP** — tool_name: `get-profile` - **REST** — `POST /v1/actions/get-profile/v1` --- ### Get Result URL: https://actions.periodix.net/playbooks/actions/get-result Slug: `get-result` Retrieve the result of a long-running action, such as LinkedIn Search, by its resultId. Returns a status of pending, completed with output, or failed with an error. Poll until the status is no longer pending. **Inputs** | name | type | required | description | |---|---|---|---| | resultId | string | yes | The resultId returned by LinkedIn Search. | **JSON output** ```json { "status": "completed", "output": { "items": [ { "name": "Jane Doe", "headline": "VP Sales at Acme", "company": "Acme", "profile_url": "https://www.linkedin.com/in/jane-doe" } ] } } ``` **Limits**: Poll at a reasonable interval. **Invocations** - **REST** — `GET /v1/actions/{action}/{version}/results/{id}` - **REST** — `GET /v1/actions/{action}/{version}/results/{id}` - **MCP** — tool_name: `get-result ` --- ### Get User Posts URL: https://actions.periodix.net/playbooks/actions/get-user-posts Slug: `get-user-posts` List the recent posts published by a LinkedIn person or company, with full post content. Use it to analyze what a lead talks about before you reach out, so AI can personalize the first message. It also returns each post's social_id, which Get Post Reactions and Get Post Comments need. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. | | identifier | string | yes | The author's internal ID. Person starts with ACo or ADo; company is the numeric company ID (enable Is Company). | | isCompany | boolean | no | Set true when the author is a company. | | limit | number | no | Posts per page, up to 100. | | cursor | string | no | Pagination cursor. | **JSON output** ```json { "items": [ { "social_id": "urn:li:activity:73...", "text": "We ran an outbound experiment ...", "url": "https://www.linkedin.com/posts/...", "posted_at": "2026-07-01", "reactions_count": 132, "comments_count": 24 } ], "cursor": "eyJwYWdlIjoy..." } ``` **Limits**: Up to 100 per page, paginate with cursor. Automatic rate limiting. **Invocations** - **n8n** — resource: `Post`, operation: `Get Many` - **REST** — `POST /v1/actions/get-user-posts/v1` - **MCP** — tool_name: `get-user-posts` --- ### LinkedIn & Sales Navigator Search URL: https://actions.periodix.net/playbooks/actions/linkedin-search Slug: `linkedin-search` Run a LinkedIn or Sales Navigator search by URL and get clean, structured rows back. Works for People, Companies, Posts, and Jobs on both Classic and Sales Navigator. Paste a search URL, and Periodix Actions returns the matching results with automatic rate limiting. This is the core of any LinkedIn lead generation or list-building workflow. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | The connected LinkedIn profile to run the search from. Get it from List Profiles. | | searchUrl | string | yes | A LinkedIn or Sales Navigator search URL. The result shape depends on the URL type (People, Companies, Posts, or Jobs). | | limit | number | yes | Maximum number of results to return (up to 2500). | | callbackUrl | string | no | Webhook URL to receive the search result when it is ready | **JSON output** ```json { "resultId": "res_01H..." } ``` **Limits**: Up to 2500 results per search. Automatic LinkedIn rate limiting is handled for you. Results count against your plan (1,000 included on pay-as-you-go, unlimited on Unlimited). **Invocations** - **MCP** — tool_name: `tool linkedin-search` - **REST** — `POST /v1/actions/linkedin-search/v1` - **n8n** — resource: `Search`, operation: `Search` --- ### List Profiles URL: https://actions.periodix.net/playbooks/actions/list-profiles Slug: `list-profiles` List the LinkedIn profiles connected to your organization. Use it to discover the profileId that every other action requires, and to check whether a profile has Sales Navigator access. Only profiles with a connection status connected can be used. **Inputs** _No inputs._ **JSON output** ```json { "_embedded": { "profiles": [ { "id": "prf_01H...", "name": "My LinkedIn", "provider": "linkedin", "connectionStatus": "connected", "salesNavigator": true } ] } } ``` **Limits**: None notable **Invocations** - **REST** — `GET /v1/profiles` - **MCP** — tool_name: `list-profiles` - **REST** — `GET /v1/profiles` --- ### Lookup Search Parameter URL: https://actions.periodix.net/playbooks/actions/lookup-search-parameter Slug: `lookup-search-parameter` Resolve a free-text query to LinkedIn search parameter IDs for use in Search People. Filter IDs are not free text, so resolve them first. Classic uses LOCATION, INDUSTRY, COMPANY, JOB_TITLE. Sales Navigator uses REGION, SALES_INDUSTRY, DEPARTMENT, JOB_TITLE, COMPANY. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. | | type | string | yes | LOCATION, INDUSTRY, COMPANY, JOB_TITLE, REGION, SALES_INDUSTRY, or DEPARTMENT. | | keywords | string | yes | The free-text query, e.g. fintech or Berlin. | | service | string | no | CLASSIC or SALES_NAVIGATOR. Default CLASSIC. | | limit | number | no | Up to 25 candidates | **JSON output** ```json { "candidates": [ { "id": "90009496", "text": "Berlin, Germany", "type": "LOCATION" } ] } ``` **Limits**: Up to 25 candidates per lookup. **Invocations** - **MCP** — tool_name: `lookup-search-parameter` --- ### Search People URL: https://actions.periodix.net/playbooks/actions/search-people Slug: `search-people` Search LinkedIn for people with structured filters instead of a URL. Filter by location, industry, company, and keywords on Classic, and add function, role, seniority, tenure, and company headcount on Sales Navigator. Returns one page of up to 100 matching people. Ideal for building precise, ICP-shaped prospect lists. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile. From List Profiles. A Sales Navigator profile is required for api sales_navigator. | | api | string | yes | Which search engine to use: classic (LinkedIn Classic) or sales_navigator (Sales Navigator, requires a connected Sales Navigator profile). | | keywords | string | no | Boolean keyword query for skills and technologies, e.g. Node.js AND Vue AND ("full stack" OR full-stack). | | location | array or object | no | LOCATION (classic) or REGION (Sales Navigator). Resolve IDs first with Lookup Search Parameter. | | industry | array or object | no | INDUSTRY (classic) or SALES_INDUSTRY (Sales Navigator). | | company | array or object | no | COMPANY IDs (classic) or company names include/exclude (Sales Navigator). | | function | object | no | Sales Navigator only. DEPARTMENT include/exclude IDs. | | role | object | no | Sales Navigator only. JOB_TITLE or free text include/exclude. | | seniority | object | no | Sales Navigator only. Levels like cxo, vice_president, director, owner/partner. | | tenure | array | no | Sales Navigator only. Years in role, min/max bands. | | company_headcount | array | no | Sales Navigator only. Company size bands, min/max. | | network_distance | array | no | Connection degree: 1, 2, 3, or GROUP. | | profile_language | array | no | Two-letter language codes. | | limit | number | no | Results per page, up to 100. | | cursor | string | no | Pagination cursor from the previous page. | **JSON output** ```json { "items": [ { "provider_id": "ACoAA...", "name": "Jane Doe", "headline": "VP Sales at Acme", "company": "Acme", "location": "San Francisco", "profile_url": "https://www.linkedin.com/in/jane-doe" } ], "cursor": "eyJwYWdlIjoy..." } ``` **Limits**: Up to 100 results per page, paginate with cursor. Sales Navigator search requires an active Sales Navigator subscription on the connected profile. Automatic rate limiting. **Invocations** - **MCP** — tool_name: ` search-people` --- ### Send Connection Request URL: https://actions.periodix.net/playbooks/actions/send-connection-request Slug: `send-connection-request` Send a LinkedIn connection request (invitation), optionally with a personalized note. The main follow-up once you have found and qualified prospects. Available in n8n, MCP, and REST. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile sending the invite. | | recipientId | string | yes | The internal ID of the person, from a People search result or Get Profile. | | note | string | no | Invitation note. LinkedIn caps it at 300 chars for Premium/Sales Navigator senders and 200 for free accounts; about 120 to 180 chars tends to get the best acceptance. | **JSON output** ```json { "status": "sent", "recipientId": "ACoAA..." } ``` **Limits**: Subject to safe daily connection limits you control. **Invocations** - **n8n** — resource: `Connection`, operation: `Send Request` - **MCP** — tool_name: `send-connection-request` - **REST** — `POST /v1/actions/send-connection-request/v1` --- ### Send Message URL: https://actions.periodix.net/playbooks/actions/send-message Slug: `send-message` Send a direct message to a LinkedIn connection or open profile, the first message after an accepted invitation, or a follow-up. Set InMail to send a paid InMail that reaches people outside your network, which requires a subject and a Premium or Sales Navigator allowance. Available in n8n, MCP, and REST. **Inputs** | name | type | required | description | |---|---|---|---| | profileId | string | yes | Connected LinkedIn profile sending the message. | | recipientId | string | yes | The internal ID of the person, from a People search result, Get Profile, or Get Connections. | | text | string | yes | The message body, up to 10000 characters. | | inmail | boolean | no | Send a paid InMail instead of a regular message. | | subject | string | no | InMail subject, up to 200 characters. Required when inmail is true. | **JSON output** ```json { "conversation_id": "conv_01H...", "message_id": "msg_01H...", "new_conversation": true } ``` **Limits**: Subject to safe daily message limits you control. InMail requires a Premium or Sales Navigator allowance. **Invocations** - **MCP** — tool_name: `send-message` - **n8n** — resource: `Message`, operation: `Send` - **REST** — `POST /v1/actions/send-message/v1` ## Playbooks --- ### Automate your LinkedIn job search URL: https://actions.periodix.net/playbooks/automate-linkedin-job-search Slug: `automate-linkedin-job-search` **Problem**: Job hunting on LinkedIn is a timing game played by hand. You open the same searches every day, scroll past reposts and roles you already saw, and still miss fresh posts because you were not online when they went up. The good roles collect applicants fast, so being early matters, and manual checking cannot keep up with that. **Outcome**: A pipeline that runs on a schedule, pulls fresh job posts for the roles, keywords, and locations you care about, filters out what does not fit, removes duplicates you already saw, and drops the new ones into a clean sheet or sends you an alert. You see new relevant roles first, without scrolling, so you can apply while the post is still fresh. **Flow** 1. **Schedule** 2. **Periodix Job Search** — `linkedin-search` 3. **Filter (fresh, match criteria)** 4. **Dedup** 5. **Google Sheet or Slack / email alert** **Actions used** - [LinkedIn & Sales Navigator Search](https://actions.periodix.net/playbooks/actions/linkedin-search) — `linkedin-search` **JSON output** ```json { "job_title": "Senior Cloud Engineer", "company_name": "Acme Cloud", "job_location": "Remote, EU", "job_url": "https://www.linkedin.com/jobs/view/...", "date_posted": "2026-07-06" } ``` --- ### Enrich Any LinkedIn Profile With Full Structured Data URL: https://actions.periodix.net/playbooks/enrich-linkedin-profile Slug: `enrich-linkedin-profile` **Problem**: A LinkedIn search returns names and headlines, but outreach built on a headline alone sounds generic. You need the full picture: current and past roles, company details, skills, education, and summary. Manually clicking into each profile and copying fields does not scale past a dozen leads. **Outcome**: A single API call or MCP prompt that returns the complete structured profile of any LinkedIn member: work experience with dates and descriptions, education, skills, certifications, languages, and summary. Use it to personalize outreach, qualify leads by experience depth, or feed an AI scoring model with real data instead of guesses. It also typically costs a fraction of enriching the same volume through credit-based platforms - up to roughly 10x less per 1,000 profiles. **Flow** 1. **1. LinkedIn profile URL or provider_id** 2. **2. Get Profile** — `get-profile` 3. **AI: draft personalized outreach** — `get-profile` **Actions used** - [Get Profile](https://actions.periodix.net/playbooks/actions/get-profile) — `get-profile` **Integrations**: HubSpot, Notion, OpenAI, Claude (Anthropic), Google Sheets **Proof — metrics** - Lower cost than Clay enrichment: Up to 20X - Lower cost than Apify scraping: Up to 9X - vs ~1-5 min manual research: <2 sec **JSON output** ```json { "provider_id": "abc123", "first_name": "Jane", "last_name": "Doe", "headline": "VP of Sales at Acme Corp", "summary": "15 years driving B2B revenue...", "location": "San Francisco, CA", "industry": "Software", "experience": [ { "title": "VP of Sales", "company": "Acme Corp", "start_date": "2022-03", "end_date": null, "description": "Leading a team of 20 AEs..." } ], "education": [ { "school": "Stanford University", "degree": "MBA", "field": "Business Administration" } ], "skills": ["B2B Sales", "SaaS", "Revenue Operations"], "certifications": [], "languages": ["English", "Spanish"] } ``` --- ### Mine LinkedIn post engagement for intent signals URL: https://actions.periodix.net/playbooks/find-linkedin-post-engagers Slug: `find-linkedin-post-engagers` **Problem**: The people who like and comment on posts in your niche are already raising their hand, and that intent is spread across dozens of posts and buried in the feed. To work it by hand you first have to find the right posts, then open each one, scroll every reaction, read every comment, and copy profiles. It does not scale, so the warmest signals go to waste and teams keep buying cold lists instead. **Outcome**: A scheduled pipeline that finds the posts your buyers engage with on your topic, or starts from posts you already have, pulls everyone who reacted or commented, and runs them cheap-to-expensive: free rules drop obvious non-fits, AI scores only the survivors against your ICP, and only the strong fits get a drafted connection note and first message that reference the exact post or comment they engaged with. You cover the whole conversation in your niche, not just one post, and you never waste AI or sends on non-fits. Hot and cold leads land in Google Sheets, ready to send. No manual scrolling, no scrapers to maintain. **Flow** 1. **Search posts by topic** — `linkedin-search` 2. **Get Post Reactions** — `get-post-reactions` 3. **Get Post Comments** — `get-post-comments` 4. **Pre-filter** 5. **AI ICP score ** 6. **AI draft personalized outreach** 7. **Google Sheets (Hot / Cold)** **Actions used** - [LinkedIn & Sales Navigator Search](https://actions.periodix.net/playbooks/actions/linkedin-search) — `linkedin-search` - [Get Post Reactions](https://actions.periodix.net/playbooks/actions/get-post-reactions) — `get-post-reactions` - [Get Post Comments](https://actions.periodix.net/playbooks/actions/get-post-comments) — `get-post-comments` **Integrations**: Google Gemini, Claude (Anthropic), Google Sheets, OpenAI **Proof — metrics** - Connection acceptance: 73.26% - Reply rate: 16.86% **JSON output** ```json { "linkedin_url": "https://www.linkedin.com/in/jane-doe", "first_name": "Jane", "last_name": "Doe", "headline": "VP Sales at Acme", "company": "Acme", "location": "San Francisco", "source": "reaction", "post_url": "https://www.linkedin.com/posts/...", "score": 9, "connection_note": "Saw you react to the post on outbound signals ...", "message": "Hi Jane, your take on ...", "status": "hot", "added_at": "2026-07-06T09:00:00Z" } ``` --- ### Research Any Company on LinkedIn in One API Call URL: https://actions.periodix.net/playbooks/enrich-company-profile Slug: `enrich-company-profile` **Problem**: You have a company name or LinkedIn URL but no structured intel. Manually reading a company page gives you a paragraph of "About" text, but not structured data you can filter, score, or feed to an AI. You need industry, headcount, specializations, headquarters, and website in a format your pipeline can use. **Outcome**: A single call that returns the full company profile as structured JSON: industry, employee count, description, specializations, locations, website, and founding year. Use it to filter companies by size and industry before enriching people, to feed company context into AI-drafted outreach, or to build an account-level ICP scoring model. Running it alongside search also cuts the toolstack down to one bill instead of two. **Flow** 1. **Company LinkedIn URL or company ID** 2. **Get Company Profile** — `get-company-profile` 3. **Filter: ICP match** **Actions used** - [Get Company Profile](https://actions.periodix.net/playbooks/actions/get-company-profile) — `get-company-profile` **Integrations**: OpenAI, Notion, Google Sheets, Google Gemini, HubSpot, Claude (Anthropic) **Proof — metrics** - vs 3–5 min manual company research: <2 sec - Lower cost than Apify stack: Up to 10X **JSON output** ```json { "id": "12345", "name": "Acme Corp", "universal_name": "acme-corp", "url": "https://www.linkedin.com/company/acme-corp", "website": "https://acme.com", "industry": "Computer Software", "headcount": "201-500", "description": "Acme Corp builds revenue intelligence...", "specializations": ["Sales Intelligence", "B2B Data", "AI"], "locations": [ { "city": "San Francisco", "country": "US", "is_hq": true } ], "founded_year": 2018 } ``` --- ### Score Linkedin or Sales Navigator leads by ICP and draft outreach URL: https://actions.periodix.net/playbooks/score-linkedin-leads-by-icp Slug: `score-linkedin-leads-by-icp` **Problem**: LinkedIn or Sales Navigator search returns hundreds of profiles, and most of them are not a fit. Teams handle this in two expensive ways. Some message everyone, which burns limited sending capacity, hurts reply rate, and trains them to blast more. Others pay to enrich and AI-score every single row in a tool like Clay, spending credits on leads that were never going to qualify. Either way you pay full price for the whole list before you know who is worth it. **Outcome**: A funnel that spends effort only where it pays off. It collects clean, structured profiles from Periodix Search (name, title, company, location, and summary for every result), applies free rule-based filters to drop the obvious non-fits, then lets AI score only the survivors into validated and rejected, and drafts a personalized connection note and first message for the validated ones alone. You do not blast everyone, and you do not pay to AI-score the whole list. Validated leads land ready to send; rejected ones are logged with a reason to sharpen your ICP. Waterfall outreach is usually expensive; run cheap-to-expensive, it is not. **Flow** 1. **Notion: pending Sales Nav URLs** 2. **Periodix Search** — `linkedin-search` 3. **Normalize profile** 4. **Pre-filter (free rules, drop obvious non-fits)** 5. **AI ICP score (1 to 10)** 6. **AI draft note + message (validated)** 7. **Google Sheets: Validated ** 8. **Google Sheets: Rejected (with reason)** **Actions used** - [LinkedIn & Sales Navigator Search](https://actions.periodix.net/playbooks/actions/linkedin-search) — `linkedin-search` **Integrations**: OpenAI, Google Gemini, Google Sheets, Notion, Claude (Anthropic) **Testimonial**: "We used to have SDRs do all of this by hand: pulling leads, scoring them against our ICP, and sending the same cold template. This workflow replaced that end to end, and now every first message is personalized, not a template. The output is as good as our best rep, and it runs every day without dropping a lead." — Olga, Co-founder, Reivix **JSON output** ```json { "linkedin_url": "https://www.linkedin.com/in/jane-doe", "full_name": "Jane Doe", "headline": "VP Sales at Acme", "company": "Acme", "location": "San Francisco", "icp_score": 9, "reason": "VP-level at a 200-person SaaS, owns the buying decision for our category.", "connection_note": "Hi Jane, saw you lead sales at Acme ...", "message": "Following up with a quick thought on ...", "status": "validated" } ``` --- ### Turn hiring signals into outbound leads URL: https://actions.periodix.net/playbooks/hiring-signals-to-outbound-leads Slug: `hiring-signals-to-outbound-leads` **Problem**: When a company posts a job for a role you sell around, it is telling you it has a new priority, a fresh budget, and a pain. That is one of the strongest buying signals in B2B. The trouble is that job posts are scattered across LinkedIn, most are from recruiting agencies and staffing firms you do not want, and the person who posted is a recruiter, not the decision-maker you need to reach. Working this by hand does not scale, and by the time you get to a post it is often stale. **Outcome**: A scheduled pipeline that watches LinkedIn job posts for the roles that signal demand for you, validates each company against your ICP with AI (dropping agencies and non-fit companies), finds the right decision-makers at each hiring company through Sales Navigator, deduplicates, and saves a lead per contact along with the job that triggered the outreach, ready to send. **Flow** 1. **Schedule** 2. **Periodix Job Search ** — `linkedin-search` 3. **AI filter companies (drop agencies / non-ICP)** 4. **Find decision-makers (Sales Navigator people) ** — `search-people` 5. **Dedup ** 6. **Google Sheets / CSV** **Actions used** - [LinkedIn & Sales Navigator Search](https://actions.periodix.net/playbooks/actions/linkedin-search) — `linkedin-search` - [Search People](https://actions.periodix.net/playbooks/actions/search-people) — `search-people` **Integrations**: Google Sheets, Claude (Anthropic), Google Gemini, Google Drive, OpenAI **Proof — metrics** - Reply rate, every 3 days vs weekly: 12X **JSON output** ```json { "company_name": "Acme Cloud", "company_linkedin_url": "https://www.linkedin.com/company/acme-cloud", "first_name": "Jane", "last_name": "Doe", "lead_title": "CTO", "lead_linkedin_url": "https://www.linkedin.com/in/jane-doe", "job_title": "Senior DevOps Engineer", "job_url": "https://www.linkedin.com/jobs/view/...", "job_location": "Berlin, Germany", "date_scraped": "2026-07-06" } ``` ## Use cases --- ### Lead generation URL: https://actions.periodix.net/playbooks/use-cases/lead-generation Slug: `lead-generation` Build qualified lead lists without manual prospecting. These playbooks search LinkedIn and Sales Navigator, enrich and score the results against your ICP, and export ready-to-work lists, built with Periodix Actions in n8n, MCP, REST, or Make. **Playbooks** - [Turn hiring signals into outbound leads ](https://actions.periodix.net/playbooks/hiring-signals-to-outbound-leads) — `hiring-signals-to-outbound-leads` - [Mine LinkedIn post engagement for intent signals](https://actions.periodix.net/playbooks/find-linkedin-post-engagers) — `find-linkedin-post-engagers` - [Score Linkedin or Sales Navigator leads by ICP and draft outreach ](https://actions.periodix.net/playbooks/score-linkedin-leads-by-icp) — `score-linkedin-leads-by-icp` --- ### Job search URL: https://actions.periodix.net/playbooks/use-cases/job-search Slug: `job-search` See relevant roles first, without scrolling. These playbooks run a scheduled LinkedIn job search for your keywords and location, filter and deduplicate, and alert you to fresh matches, for job seekers and freelancers, built with Periodix Actions in n8n, MCP, REST, or Make. **Playbooks** - [Automate your LinkedIn job search](https://actions.periodix.net/playbooks/automate-linkedin-job-search) — `automate-linkedin-job-search` --- ### Buying / intent signals URL: https://actions.periodix.net/playbooks/use-cases/buying-intent-signals Slug: `buying-intent-signals` Find buyers when they are actually in-market. These playbooks turn LinkedIn intent signals into a pipeline of warm, timely leads: search the posts your buyers engage with and pull everyone who liked or commented, watch hiring posts, and act on other activity, built with Periodix Actions in n8n, MCP, REST, or Make. **Playbooks** - [Mine LinkedIn post engagement for intent signals](https://actions.periodix.net/playbooks/find-linkedin-post-engagers) — `find-linkedin-post-engagers` - [Turn hiring signals into outbound leads ](https://actions.periodix.net/playbooks/hiring-signals-to-outbound-leads) — `hiring-signals-to-outbound-leads` --- ### Data enrichment & scoring URL: https://actions.periodix.net/playbooks/use-cases/data-enrichment-scoring Slug: `data-enrichment-scoring` Turn raw search results into rich, scored data. These playbooks pull full LinkedIn profiles and company details and score each lead against your ICP with AI, so you qualify before you reach out, built with Periodix Actions in n8n, MCP, REST, or Make. **Playbooks** - [Score Linkedin or Sales Navigator leads by ICP and draft outreach ](https://actions.periodix.net/playbooks/score-linkedin-leads-by-icp) — `score-linkedin-leads-by-icp` - [Enrich Any LinkedIn Profile With Full Structured Data](https://actions.periodix.net/playbooks/enrich-linkedin-profile) — `enrich-linkedin-profile` - [Research Any Company on LinkedIn in One API Call](https://actions.periodix.net/playbooks/enrich-company-profile) — `enrich-company-profile` ## Blog --- ### Hiring Signals Are Buying Signals: How to Turn LinkedIn Job Posts Into Leads URL: https://actions.periodix.net/blog/hiring-signals-are-buying-signals Slug: `hiring-signals-are-buying-signals` Category: Strategy and frameworks (https://actions.periodix.net/blog/category/strategy-frameworks) Published: 2026-07-06T09:00:00.000Z Tags: signals, LinkedIn, outbound, hiring, n8n, MCP **TL;DR**: When a company posts a job, it reveals a new priority, a budget, and a pain. If that role maps to what you sell, the company just became a warm account. This is signal-based prospecting applied to hiring: read LinkedIn job posts as buying signals, filter out the noise of agencies and staffing firms, reach the decision-maker rather than the recruiter, and move fast while the signal is fresh. Here is how to think about it, and how to automate it with Periodix Actions in n8n or MCP. Why a job post is a buying signal Companies do not hire for fun. A new role means a new initiative, a new budget line, and a problem someone was told to solve. That is exactly the context you want to sell into. If you sell developer tooling and a company posts for three platform engineers, they are scaling infrastructure. If you sell security and they open a role for a compliance lead, they have a compliance need. The job post is the company telling the market what it is working on next. Compared to a static list built from title and company size, a hiring signal adds the one thing filters ca… **FAQ** - **What is a hiring signal in sales?** It is a job post that reveals a company has a new priority and budget for something you can help with. When the role maps to your offer, the company becomes a warm account. - **How do I find companies hiring for a specific role on LinkedIn?** Search job posts by role keywords, recency, and location. Tools like Periodix Actions let you do this on a schedule and pull the results into a workflow. - **How do I reach the decision-maker instead of the recruiter?** Once a company passes your ICP filter, use Sales Navigator people search to find leadership by title, so you contact the buyer rather than the person who posted the job. - **How fast should I follow up on a hiring signal?** As fast as you can. Fresh signals convert far better. In our pilot, moving from weekly to every 3 days lifted replies about 12x. --- ### AI Lead Scoring: How to Qualify LinkedIn Leads by ICP Before You Reach Out URL: https://actions.periodix.net/blog/ai-lead-scoring-linkedin-icp Slug: `ai-lead-scoring-linkedin-icp` Category: Strategy and frameworks (https://actions.periodix.net/blog/category/strategy-frameworks) Published: 2026-07-05T09:00:00.000Z Tags: LinkedIn, Sales Navigator, ICP, lead scoring, n8n, MCP, AI SDR **TL;DR**: Cold outreach fails mostly because it targets the wrong people. AI lead scoring rates each prospect against your ICP first, so you reach out only to good-fit leads, with a message written for them. Here is how it works, how to write the ICP prompt, and how to turn a Sales Navigator or LinkedIn search into a scored, qualified list in n8n or MCH with Periodix Actions and Claude, OpenAI or Gemini. Cold outreach fails mostly because it goes to the wrong people. You pull a Sales Navigator or LinkedIn search, it returns a few hundred profiles, and you message all of them, including the ones who were never a fit. That burns your sending limits, your reputation, and your time. AI lead scoring fixes the order of operations: qualify every lead against your ideal customer profile first, then only reach out to the ones worth reaching, with a message written for them. This article explains how AI lead scoring works, what makes a scoring prompt good, and how to turn a raw Sales Navigator or Linke… **FAQ** - **What is AI lead scoring?** Using an AI model to rate each prospect on how well they match your ideal customer profile, returning a score and a reason, so you prioritize outreach on the best-fit leads. - **Why score leads before outreach instead of after?** Your sending capacity is limited and personalization is only worth it on real prospects. Scoring first concentrates your effort on leads that can convert. - **How do I write a good ICP scoring prompt?** Describe what you sell, who buys, the fitting roles and company types, and the disqualifiers, and ask for a number plus a short reason. Refine the prompt by reading the reasons on a sample batch. - **Can I do this with a Sales Navigator search?** Yes. Pull the search, score each profile against your ICP, and route qualified leads to outreach and the rest to a rejected list for ICP refinement. - **How is this cheaper than enriching everyone in a tool like Clay?** Tools that enrich and score every row charge credits per lead, so you pay across the whole list. A waterfall drops obvious non-fits with free rules first, scores only the survivors with a cheap AI call, and personalizes only the validated leads, so you pay for the expensive steps where they matter, not on people who were never a fit. - **Can I use OpenAI or Gemini instead of Claude for scoring?** Yes. The scoring step is a standard model call, so you can run it on Claude, OpenAI GPT, or Google Gemini. Use whichever model you already work with; the rest of the pipeline stays exactly the same. --- ### We Sent 344 Connection Requests to LinkedIn Post Engagers: 73% Accepted, 17% Replied URL: https://actions.periodix.net/blog/linkedin-post-engagement-outreach-results Slug: `linkedin-post-engagement-outreach-results` Category: Benchmarks and data (https://actions.periodix.net/blog/category/benchmarks-data) Published: 2026-07-02T09:00:00.000Z Tags: signals, LinkedIn, outbound, benchmarks, n8n, MCP **TL;DR**: We ran a signal-based prospecting campaign that reached only people who liked or commented on relevant LinkedIn posts, with no cold lists. For one week, we sent 344 connection requests. 252 were accepted (73.26%), 58 replied (16.86%), and 15 said they were interested (4.36%). The takeaway is simple: prospects who already engaged with a topic accept and reply at rates cold lists rarely see. The numbers For the first week of this campaign. Two rates are worth reading twice. Acceptance was 73.26%, and reply was 16.86% of everyone we sent to, which is 23% of the people who accepted. The setup The whole point of this campaign was the audience. We did not buy a list or filter by title and company. Every single person we contacted had already liked or commented on a LinkedIn post about our topic. That is it. The audience was 100% post engagers. We pulled those engagers with Periodix Actions running inside n8n or MCP. The workflow find target post URLs, calls Get Post Reactions and Get… **FAQ** - **What is a good LinkedIn connection acceptance rate?** It varies by audience, offer, and message. In this campaign, aimed only at people who had engaged with relevant posts, acceptance was 73.26%. Cold audiences typically sit much lower (around 20-30%), which is the point at which working intent signals come into play. - **How were these leads sourced?** Entirely from LinkedIn post engagement. We used Periodix Actions to find targeted posts, pull everyone who reacted to or commented on them, score them, and message them. - **Why were no calls booked?** The campaign routed interested people to a website rather than to a booking page, so booked calls were zero by design. - **Can I reproduce this?** Yes. The workflow is documented as a playbook, and Periodix Actions runs in n8n, MCP, REST, and Make. --- ### Signal-Based Prospecting: How to Turn LinkedIn Post Likes and Comments Into Leads URL: https://actions.periodix.net/blog/signal-based-prospecting-linkedin-post-engagement Slug: `signal-based-prospecting-linkedin-post-engagement` Category: Strategy and frameworks (https://actions.periodix.net/blog/category/strategy-frameworks) Published: 2026-07-01T09:00:00.000Z Tags: signals, LinkedIn, outbound, n8n, MCP **TL;DR**: The warmest B2B prospects on LinkedIn are the people who like and comment on relevant posts. They have already shown interest in the topic, which makes them far easier to reach than a cold list. Signal-based prospecting means pulling those engagers, scoring them against your ideal customer profile, and reaching out with a message tied to the exact post they engaged with. With Periodix Actions you can automate the whole loop in n8n or MCP: get reactions and comments, enrich the people, score them with AI, and draft personalised outreach. What are LinkedIn intent signals An intent signal is any action that tells you a person cares about a topic right now. On LinkedIn the clearest ones are public and easy to observe: a like or reaction on a post, a comment, a reshare, a new follow, or a job change. When someone reacts to a post about outbound, or comments on a thread about hiring SDRs, they have self-selected into that subject. That is a buying signal, and it is the opposite of a cold list where you are guessing. Signal-based prospecting is simply the practice of building your outreach around these signals instead of around sta… **FAQ** - **What is signal-based prospecting?** It is outreach built around intent signals, like post likes, comments, and reshares, instead of static filters alone. You start from people who already showed interest in your topic. - **How do I find who liked a LinkedIn post?** Use a tool that returns the reaction list from a post URL. Periodix Actions has a Get Post Reactions action that gives you everyone who reacted with their profile details, so you do not scroll by hand. - **Are commenters better leads than likers?** Often yes. A comment takes more effort than a like and shows stronger intent, and the comment text gives you material to personalize with. - **Is working post engagement against LinkedIn rules?** Reading public reactions and comments is different from spamming. Keep sending within safe daily limits, personalize, and treat people like humans. The risk is in reckless volume, not in the signal itself.