Job Posting Intent Detection

Detect buying intent from job postings.

How to use it

  1. Hit Copy SKILL.md — or use the Claude Code line below to get every file.
  2. Claude: ⋯ → Download .md, then Customize → Skills → Add → Upload skill.
    ChatGPT: make a Project and paste it into Instructions.
    Neither? Paste it at the top of a new chat — it works for that chat.
  3. Describe your job in plain words. The AI follows the skill from there.
Claude Code — installs the whole folder, not just SKILL.md
npx degit gooseworks-ai/goose-skills/skills/lead-generation/capabilities/job-posting-intent#main ~/.claude/skills/job-posting-intent

For one project only, change the path to .claude/skills/job-posting-intent. This skill also uses search_jobs.py, results.json — copying SKILL.md alone won't be enough. See the folder on GitHub.

Not working?
  • Check which app you pasted it into — the steps above name the right one.
  • Some skills need the paid tier of Claude or ChatGPT.
Step-by-step guide with screenshots · Ask in the forum

Paste into Claude, ChatGPT or Cursor.

Show the full text241 lines
job-posting-intent/SKILL.md241 lines8.6 KBpushed 96d agoRawView on GitHub

Job Posting Intent Detection

Find companies that are hiring for roles related to the problem you solve. A job posting is a budget signal — the company has allocated money to solve a problem your product addresses.

Results are automatically exported to a Google Sheet with signal strength, decision-maker suggestions, outreach angles, and personalization context.

Why This Works

When a company posts a job, they've:

  • Allocated budget (headcount is expensive)
  • Acknowledged the problem exists
  • Started actively solving it

If your product helps solve that problem faster, cheaper, or better than a hire alone, the timing is perfect.

Cost

Apify Actor: harvestapi/linkedin-job-search (pay-per-event)

Component Cost
Actor start (per run) $0.001
Per job result $0.001
Apify platform fee +20%

Typical run costs:

Scenario Titles Jobs/title Runs Est. Cost
Quick scan 3 25 3 ~$0.09
Standard 5 25 5 ~$0.16
Deep search 5 100 5 ~$0.60
Multi-location 5×3 25 15 ~$0.47

Google Sheet creation is free (uses Rube/Composio integration).

Always run --estimate-only first to see the Apify cost before executing.

Track usage: https://console.apify.com/billing

Setup

1. Apify API Token

# Get your token at https://console.apify.com/account/integrations
export APIFY_API_TOKEN="apify_api_YOUR_TOKEN_HERE"

2. Install dependencies

pip3 install requests

3. Rube/Composio (for Google Sheets)

Google Sheet creation uses Rube MCP with Composio. The token is preconfigured. If it stops working, update the RUBE_TOKEN env var or the default in search_jobs.py.

Usage

Step 1: Define your ICP and target titles

Think about it this way: "If a company is hiring for [role], it means they're investing in [problem area you solve]."

Examples:

  • GTM agency: "Growth Marketing Manager", "SDR Manager", "RevOps Engineer", "GTM Engineer"
  • AI dev tools: "AI Engineer", "ML Ops Engineer", "Prompt Engineer", "LLM Engineer"
  • Sales automation: "SDR", "BDR Manager", "Sales Ops", "Revenue Operations"

Step 2: Estimate cost

python3 scripts/search_jobs.py \
  --titles "GTM Engineer,SDR Manager,Head of Demand Gen" \
  --locations "United States" \
  --max-per-title 25 \
  --estimate-only

Step 3: Run the search

The script searches LinkedIn Jobs, groups results by company, qualifies leads, and creates a Google Sheet automatically.

# Standard search (creates Google Sheet)
python3 scripts/search_jobs.py \
  --titles "GTM Engineer,SDR Manager,RevOps Engineer" \
  --locations "United States" \
  --max-per-title 25

# Deep search with custom sheet name
python3 scripts/search_jobs.py \
  --titles "AI Engineer,ML Ops Engineer,Prompt Engineer" \
  --locations "United States" \
  --max-per-title 50 \
  --sheet-name "AI Hiring Signals - Feb 2026"

# Filter results to only relevant titles (LinkedIn search is fuzzy)
python3 scripts/search_jobs.py \
  --titles "GTM Engineer,Growth Marketing Manager,SDR Manager" \
  --locations "United States" \
  --relevance-keywords "gtm,growth,sdr,marketing,demand gen,revops"

# Also save raw JSON alongside the sheet
python3 scripts/search_jobs.py \
  --titles "GTM Engineer,SDR Manager" \
  --locations "United States" \
  --output results.json

# Skip Google Sheet, console + JSON only
python3 scripts/search_jobs.py \
  --titles "GTM Engineer" \
  --no-sheet --json

What the Script Does

  1. Searches LinkedIn Jobs for each title/location combination via Apify
  2. Groups results by company (deduplicates)
  3. Computes signal strength based on number of relevant postings + seniority
  4. Extracts personalization context from job descriptions (tech stack, growth signals, pain points)
  5. Suggests decision-maker title (one level above the hired role)
  6. Suggests outreach angle (accelerate / replace / multiply the hire)
  7. Creates a Google Sheet with all qualified leads
  8. Prints a console summary of all companies found

Options Reference

Required:
  --titles              Comma-separated job titles to search

Optional:
  --locations           Comma-separated locations (default: no filter)
  --max-per-title       Max jobs per title per location (default: 25)
  --posted-limit        Recency: 1h, 24h, week, month (default: week)
  --output, -o          Also save raw JSON to this file path
  --json                Print JSON output to console
  --estimate-only       Show cost estimate without running
  --no-sheet            Skip Google Sheet creation
  --sheet-name          Custom Google Sheet title (default: "Job Posting Intent Signals - {date}")
  --relevance-keywords  Comma-separated keywords to filter truly relevant postings

Google Sheet Columns

Column Description
Signal HIGH / MEDIUM / LOW based on # postings + seniority
Company Company name
Employees Employee count
Industry Company industry
Website Company website
LinkedIn Company LinkedIn URL
# Postings Number of relevant job postings found
Job Titles The actual job titles posted
Job URL Link to the primary job posting
Location Job location(s)
Decision Maker Suggested title of person to contact
Outreach Angle Accelerate / Replace / Multiply the hire
Tech Stack Technologies mentioned in job descriptions
Growth Signals Growth indicators (first hire, scaling, series stage)
Pain Points Pain indicators (automate, optimize, manual processes)
Description Company description snippet

AI Agent Integration

When using this skill as an agent, the typical flow is:

  1. User describes their product and the types of roles that signal intent
  2. Agent runs --estimate-only and confirms cost with user
  3. Agent runs the search (Google Sheet is created automatically)
  4. Agent shares the Google Sheet link with the user
  5. Agent provides a brief summary of top leads and why they're qualified

Example prompt:

"Find companies hiring growth marketers and SDRs in the US this week. These are signals they need GTM help. We sell AI-powered GTM systems to Series A-C B2B SaaS companies with 20-200 employees."

The agent should NOT:

  • Do any outreach
  • Send any emails or messages
  • Contact anyone

The agent SHOULD:

  • Present cost estimate before running
  • Run the search (sheet is created automatically)
  • Share the Google Sheet link
  • Provide a brief summary of the top leads with reasoning

Outreach Angle Templates

The script auto-assigns an angle based on job posting context:

"Accelerate while you hire" — Best when: posting is recent, role is junior/mid

They're looking for someone to do X. Your product can deliver X outcomes while they ramp the hire.

"Replace the hire" — Best when: small company, "first hire" signals, building from scratch

They want the output of a [role] but may not need a full-time person if they use your product.

"Multiply the hire" — Best when: company is clearly scaling, multiple related roles

When their new hire starts, your product makes them 10x more effective from day one.

Troubleshooting

"No jobs found"

  • Try broader titles (e.g., "marketing" instead of "demand generation specialist")
  • Extend the time window: --posted-limit month
  • Remove location filter to search globally

"Too many irrelevant results"

  • Use --relevance-keywords to filter by title keywords
  • LinkedIn's search is fuzzy — the grouping and qualification step helps filter

"Google Sheet creation failed"

  • Check that Rube MCP is accessible (the token may have expired)
  • Use --no-sheet --json --output results.json to save results without a sheet
  • You can create the sheet later with scripts/create_sheet_mcp.py

High cost estimate

  • Reduce --max-per-title (25 is usually enough)
  • Search fewer titles
  • Use --posted-limit 24h for a quick daily scan

Links

1---
2name: job-posting-intent
3version: 1.1.0
4description: >
5 Detect buying intent from job postings. When a company posts a job in your problem area,
6 they've allocated budget and are actively thinking about the problem. This skill finds those
7 companies, qualifies them, extracts personalization context, and outputs everything to a
8 Google Sheet. Does NOT do outreach — just delivers qualified leads with reasoning.
9tags: [lead-generation, outreach]
10---
11 
12# Job Posting Intent Detection
13 
14Find companies that are hiring for roles related to the problem you solve. A job posting is a **budget signal** — the company has allocated money to solve a problem your product addresses.
15 
16Results are automatically exported to a **Google Sheet** with signal strength, decision-maker suggestions, outreach angles, and personalization context.
17 
18## Why This Works
19 
20When a company posts a job, they've:
21- Allocated budget (headcount is expensive)
22- Acknowledged the problem exists
23- Started actively solving it
24 
25If your product helps solve that problem faster, cheaper, or better than a hire alone, the timing is perfect.
26 
27## Cost
28 
29**Apify Actor:** `harvestapi/linkedin-job-search` (pay-per-event)
30 
31| Component | Cost |
32|-----------|------|
33| Actor start (per run) | $0.001 |
34| Per job result | $0.001 |
35| Apify platform fee | +20% |
36 
37**Typical run costs:**
38| Scenario | Titles | Jobs/title | Runs | Est. Cost |
39|----------|--------|------------|------|-----------|
40| Quick scan | 3 | 25 | 3 | ~$0.09 |
41| Standard | 5 | 25 | 5 | ~$0.16 |
42| Deep search | 5 | 100 | 5 | ~$0.60 |
43| Multi-location | 5×3 | 25 | 15 | ~$0.47 |
44 
45Google Sheet creation is free (uses Rube/Composio integration).
46 
47Always run `--estimate-only` first to see the Apify cost before executing.
48 
49Track usage: https://console.apify.com/billing
50 
51## Setup
52 
53### 1. Apify API Token
54 
55```bash
56# Get your token at https://console.apify.com/account/integrations
57export APIFY_API_TOKEN="apify_api_YOUR_TOKEN_HERE"
58```
59 
60### 2. Install dependencies
61 
62```bash
63pip3 install requests
64```
65 
66### 3. Rube/Composio (for Google Sheets)
67 
68Google Sheet creation uses Rube MCP with Composio. The token is preconfigured.
69If it stops working, update the `RUBE_TOKEN` env var or the default in `search_jobs.py`.
70 
71## Usage
72 
73### Step 1: Define your ICP and target titles
74 
75Think about it this way: **"If a company is hiring for [role], it means they're investing in [problem area you solve]."**
76 
77Examples:
78- GTM agency: "Growth Marketing Manager", "SDR Manager", "RevOps Engineer", "GTM Engineer"
79- AI dev tools: "AI Engineer", "ML Ops Engineer", "Prompt Engineer", "LLM Engineer"
80- Sales automation: "SDR", "BDR Manager", "Sales Ops", "Revenue Operations"
81 
82### Step 2: Estimate cost
83 
84```bash
85python3 scripts/search_jobs.py \
86 --titles "GTM Engineer,SDR Manager,Head of Demand Gen" \
87 --locations "United States" \
88 --max-per-title 25 \
89 --estimate-only
90```
91 
92### Step 3: Run the search
93 
94The script searches LinkedIn Jobs, groups results by company, qualifies leads, and creates a Google Sheet automatically.
95 
96```bash
97# Standard search (creates Google Sheet)
98python3 scripts/search_jobs.py \
99 --titles "GTM Engineer,SDR Manager,RevOps Engineer" \
100 --locations "United States" \
101 --max-per-title 25
102 
103# Deep search with custom sheet name
104python3 scripts/search_jobs.py \
105 --titles "AI Engineer,ML Ops Engineer,Prompt Engineer" \
106 --locations "United States" \
107 --max-per-title 50 \
108 --sheet-name "AI Hiring Signals - Feb 2026"
109 
110# Filter results to only relevant titles (LinkedIn search is fuzzy)
111python3 scripts/search_jobs.py \
112 --titles "GTM Engineer,Growth Marketing Manager,SDR Manager" \
113 --locations "United States" \
114 --relevance-keywords "gtm,growth,sdr,marketing,demand gen,revops"
115 
116# Also save raw JSON alongside the sheet
117python3 scripts/search_jobs.py \
118 --titles "GTM Engineer,SDR Manager" \
119 --locations "United States" \
120 --output results.json
121 
122# Skip Google Sheet, console + JSON only
123python3 scripts/search_jobs.py \
124 --titles "GTM Engineer" \
125 --no-sheet --json
126```
127 
128## What the Script Does
129 
1301. **Searches** LinkedIn Jobs for each title/location combination via Apify
1312. **Groups** results by company (deduplicates)
1323. **Computes signal strength** based on number of relevant postings + seniority
1334. **Extracts personalization context** from job descriptions (tech stack, growth signals, pain points)
1345. **Suggests decision-maker title** (one level above the hired role)
1356. **Suggests outreach angle** (accelerate / replace / multiply the hire)
1367. **Creates a Google Sheet** with all qualified leads
1378. **Prints a console summary** of all companies found
138 
139## Options Reference
140 
141```
142Required:
143 --titles Comma-separated job titles to search
144 
145Optional:
146 --locations Comma-separated locations (default: no filter)
147 --max-per-title Max jobs per title per location (default: 25)
148 --posted-limit Recency: 1h, 24h, week, month (default: week)
149 --output, -o Also save raw JSON to this file path
150 --json Print JSON output to console
151 --estimate-only Show cost estimate without running
152 --no-sheet Skip Google Sheet creation
153 --sheet-name Custom Google Sheet title (default: "Job Posting Intent Signals - {date}")
154 --relevance-keywords Comma-separated keywords to filter truly relevant postings
155```
156 
157## Google Sheet Columns
158 
159| Column | Description |
160|--------|-------------|
161| Signal | HIGH / MEDIUM / LOW based on # postings + seniority |
162| Company | Company name |
163| Employees | Employee count |
164| Industry | Company industry |
165| Website | Company website |
166| LinkedIn | Company LinkedIn URL |
167| # Postings | Number of relevant job postings found |
168| Job Titles | The actual job titles posted |
169| Job URL | Link to the primary job posting |
170| Location | Job location(s) |
171| Decision Maker | Suggested title of person to contact |
172| Outreach Angle | Accelerate / Replace / Multiply the hire |
173| Tech Stack | Technologies mentioned in job descriptions |
174| Growth Signals | Growth indicators (first hire, scaling, series stage) |
175| Pain Points | Pain indicators (automate, optimize, manual processes) |
176| Description | Company description snippet |
177 
178## AI Agent Integration
179 
180When using this skill as an agent, the typical flow is:
181 
1821. User describes their product and the types of roles that signal intent
1832. Agent runs `--estimate-only` and confirms cost with user
1843. Agent runs the search (Google Sheet is created automatically)
1854. Agent shares the Google Sheet link with the user
1865. Agent provides a brief summary of top leads and why they're qualified
187 
188**Example prompt:**
189> "Find companies hiring growth marketers and SDRs in the US this week. These are signals they need GTM help. We sell AI-powered GTM systems to Series A-C B2B SaaS companies with 20-200 employees."
190 
191The agent should NOT:
192- Do any outreach
193- Send any emails or messages
194- Contact anyone
195 
196The agent SHOULD:
197- Present cost estimate before running
198- Run the search (sheet is created automatically)
199- Share the Google Sheet link
200- Provide a brief summary of the top leads with reasoning
201 
202## Outreach Angle Templates
203 
204The script auto-assigns an angle based on job posting context:
205 
206**"Accelerate while you hire"** — Best when: posting is recent, role is junior/mid
207> They're looking for someone to do X. Your product can deliver X outcomes while they ramp the hire.
208 
209**"Replace the hire"** — Best when: small company, "first hire" signals, building from scratch
210> They want the output of a [role] but may not need a full-time person if they use your product.
211 
212**"Multiply the hire"** — Best when: company is clearly scaling, multiple related roles
213> When their new hire starts, your product makes them 10x more effective from day one.
214 
215## Troubleshooting
216 
217### "No jobs found"
218- Try broader titles (e.g., "marketing" instead of "demand generation specialist")
219- Extend the time window: `--posted-limit month`
220- Remove location filter to search globally
221 
222### "Too many irrelevant results"
223- Use `--relevance-keywords` to filter by title keywords
224- LinkedIn's search is fuzzy — the grouping and qualification step helps filter
225 
226### "Google Sheet creation failed"
227- Check that Rube MCP is accessible (the token may have expired)
228- Use `--no-sheet --json --output results.json` to save results without a sheet
229- You can create the sheet later with `scripts/create_sheet_mcp.py`
230 
231### High cost estimate
232- Reduce `--max-per-title` (25 is usually enough)
233- Search fewer titles
234- Use `--posted-limit 24h` for a quick daily scan
235 
236## Links
237 
238- [Apify LinkedIn Job Search Actor](https://apify.com/harvestapi/linkedin-job-search)
239- [Apify API Token](https://console.apify.com/account/integrations)
240- [Apify Billing Dashboard](https://console.apify.com/billing)
241 

Discussion

Alternatives

Also in Buying signals