Platform Scraper
Scrapes freelance and community platforms for gig listings and posts matching the agency's services. Covers 17 platforms: Freelancer, PeoplePerHour, Guru, Fiverr, Upwork, Reddit, LinkedIn, Behance, Dribbble, Shopify Community, IndieHackers, Funding News, Twitter/X, Instagram Brands, Product Hunt, Google Maps, and Shopify Store Discovery. Extracted from Hawk's watcher architecture but expressed as Claude-readable instructions, not TypeScript.
Prerequisites
agency.config.json at repo root with services, icp, and scoring sections
- WebSearch tool available
- Optional:
crm-writer skill for logging results
Phase 0: Intake
Read agency.config.json from the project root.
Extract:
services[].keywords -- all service keyword arrays
icp.primary_keywords, icp.secondary_keywords
icp.negative_keywords -- to filter out self-promoters and irrelevant results
Accept parameters:
platforms -- list of platforms to search, or "all" (default: "all")
max_results -- max leads to return (default: 20)
time_window -- how far back to search (default: "past week")
Available platforms: Freelancer, PeoplePerHour, Guru, Fiverr, Upwork, Reddit, LinkedIn, Behance, Dribbble, Shopify Community, IndieHackers, Funding News, Twitter/X, Instagram Brands, Product Hunt, Google Maps, Shopify Store Discovery.
Phase 1: Platform-Specific Scraping
For each selected platform, use WebSearch with site-specific queries. Generate 2-3 queries per platform by rotating service keywords. Execute searches with rate limiting: max 3 concurrent, 2-second pause between batches of 3.
Freelancer.com
- Query:
site:freelancer.com/projects "{keyword}" for each service keyword
- Extract: project title, description, budget range, skills required, posted date, URL, proposals count
- Note: Freelancer projects always have
/projects/ in the URL path. Filter results missing this pattern.
PeoplePerHour
- Query:
site:peopleperhour.com "{keyword}" "project"
- Extract: project title, description, budget, posted date, URL
Guru
- Query:
site:guru.com/jobs "{keyword}"
- Extract: title, description, budget, skills, URL
Fiverr
- Query:
site:fiverr.com/categories "{keyword}" OR search for buyer request forums
- Note: Fiverr is seller-first. Focus on buyer request threads and "looking for" language, not seller profiles.
Upwork
- Query:
site:upwork.com/freelance-jobs "{keyword}"
- Extract: title, description, budget, client history, URL
Reddit
- Query:
site:reddit.com/r/shopify OR site:reddit.com/r/ecommerce "{keyword}" "{intent_keyword}"
- Also search: r/smallbusiness, r/Entrepreneur, r/DTC, r/forhire
- Extract: post title, body text, subreddit, author, post date, URL, comment count
- Prioritize posts with question marks and help-seeking language ("need", "looking for", "recommend", "anyone know").
LinkedIn
- Query:
site:linkedin.com/posts "{keyword}" "{intent_keyword}"
- Also:
site:linkedin.com/jobs "{keyword}"
- Extract: post text, author, company, post date, URL
- Note: LinkedIn post URLs are not always indexable. Accept partial results.
Behance
- Query:
site:behance.net/joblist "{keyword}"
- Extract: job title, company, description, URL
Dribbble
- Query:
site:dribbble.com/jobs "{keyword}"
- Extract: job title, company, description, URL
Shopify Community
- Query:
site:community.shopify.com "{keyword}" "{intent_keyword}"
- Extract: thread title, body, author, date, URL
- Focus on threads in "Shopify Design" and "Shopify Apps" categories.
IndieHackers
- Query:
site:indiehackers.com "{keyword}" "{intent_keyword}"
- Extract: post title, body, author, date, URL
- Look for founders asking about ecommerce, Shopify, or D2C store builds.
Funding News
- Query:
"{industry} startup" "raises" OR "funding" OR "seed round" this week
- Sources to check: TechCrunch, Crunchbase, YourStory (for India)
- Extract: company name, amount raised, round, industry, investors, URL
- Parse headline for company name (usually the first entity before "raises" or "secures").
- Parse for funding amount: look for patterns like
$X million, Rs X crore, etc.
Twitter/X
- Query:
site:twitter.com OR site:x.com "{keyword}" "shopify" OR "ecommerce" OR "d2c"
- Also:
site:x.com "{industry}" "just launched" OR "coming soon" OR "new store"
- Extract: tweet text, handle, bio, website from profile, follower count
- Focus on brand accounts, not agencies or developers
Instagram Brands
- Query:
site:instagram.com "{keyword}" "shop" OR "store" OR "link in bio"
- Target hashtags: #shopifystore, #d2cbrand, #ecommerce, #shopifyseller
- Extract: profile name, handle, bio, website link from bio, follower count
- Focus on D2C brands with active storefronts
Product Hunt
- Query:
site:producthunt.com "{keyword}" OR "ecommerce" OR "shopify"
- Extract: product name, tagline, maker name, website, launch date, upvotes
- Focus on recently launched D2C products and ecommerce tools
Google Maps / Business Directories
- Query:
site:google.com/maps "{industry}" "{market}" + site:justdial.com "{keyword}" (India) + site:yelp.com "{keyword}" (US/UK)
- Extract: business name, phone number, website, address, rating
- Phone numbers are a key differentiator for multi-channel outreach
Shopify Store Discovery
- Query:
site:myshopify.com "{industry_keyword}" + site:builtwith.com "shopify" "{industry}"
- Extract: store name, URL, theme (if visible), industry
- Look for stores with basic themes (Dawn, Debut) indicating redesign need
- These are warm leads: they already use Shopify but need upgrades
Phase 2: Normalize Results
Normalize all results from every platform into a single standard format:
{
"title": "Project or post title",
"description": "First 500 chars of description or body text",
"platform": "Freelancer",
"url": "https://...",
"budget": "$500-$1000",
"posted_date": "2024-01-15",
"market": "US",
"contact": "username or name if available",
"company": "Company name if identifiable from context",
"skills_required": ["shopify", "liquid", "theme-development"],
"contact_surfaces": {
"has_email": false,
"has_linkedin": false,
"has_instagram": false,
"has_phone": false,
"has_website": true,
"channel_count": 1,
"discovery_notes": "Website from store URL."
},
"raw_data": {}
}
Rules:
market should be inferred from currency symbols, country mentions, or TLD patterns in the content.
budget should be normalized to a consistent format: "$X" or "$X-$Y" or "Rs X" for Indian currency. Set to empty string if not found.
contact should capture the username, author name, or poster identity if visible.
skills_required should be extracted from explicit skill tags or inferred from description keywords.
Phase 3: Filter
Apply filters in this order:
Negative keyword filter: Check title + description against icp.negative_keywords. Reject any result matching a negative keyword (these are typically self-promoters, spam, or irrelevant categories).
Relevance check: The result must match at least one primary_keyword OR one secondary_keyword from the config. Results matching zero keywords are discarded.
Recency filter: Skip results with a posted_date older than the time_window parameter. If posted_date is empty/unknown, keep the result but mark it with "date_unknown": true.
Dedup by URL: Remove exact URL duplicates. If the same company or person appears from different URLs (same underlying opportunity), keep only the most recent or most detailed one.
Phase 4: Output
Return an array of normalized leads, sorted by relevance:
- Primary keyword matches first (stronger signal)
- Secondary keyword matches second
- Within each group, sort by recency (newest first)
Present results grouped by platform with counts:
Found {N} leads across {M} platforms:
Freelancer ({count}):
1. "Project title" - $budget - URL
2. ...
Reddit ({count}):
1. "Post title" - r/subreddit - URL
2. ...
LinkedIn ({count}):
...
[Other platforms with results]
Total: {N} leads
Filtered out: {X} (negative keywords: {a}, irrelevant: {b}, stale: {c}, duplicates: {d})
Trim to max_results after sorting. If more results exist, note the overflow count.
Example Usage
Trigger phrases:
- "Scrape platforms for leads"
- "Find gigs on Freelancer and Upwork"
- "Search all platforms for Shopify projects"
- "Run platform scraper"
- "Find freelance gigs matching our services"
User: Scrape Freelancer and Reddit for Shopify leads
Assistant: [reads config, generates site-specific queries for Freelancer and Reddit, executes with rate limiting, normalizes to standard format, filters and deduplicates, presents grouped results]
User: Run platform scraper on all platforms, last 3 days
Assistant: [same flow across all 12 platforms, time_window set to 3 days]
1---2name: platform-scraper3description: Scrape gig platforms and communities for leads matching agency services4---56# Platform Scraper78Scrapes freelance and community platforms for gig listings and posts matching the agency's services. Covers 17 platforms: Freelancer, PeoplePerHour, Guru, Fiverr, Upwork, Reddit, LinkedIn, Behance, Dribbble, Shopify Community, IndieHackers, Funding News, Twitter/X, Instagram Brands, Product Hunt, Google Maps, and Shopify Store Discovery. Extracted from Hawk's watcher architecture but expressed as Claude-readable instructions, not TypeScript.910## Prerequisites1112- `agency.config.json` at repo root with `services`, `icp`, and `scoring` sections13- WebSearch tool available14- Optional: `crm-writer` skill for logging results1516## Phase 0: Intake17181. Read `agency.config.json` from the project root.192. Extract:20 - `services[].keywords` -- all service keyword arrays21 - `icp.primary_keywords`, `icp.secondary_keywords`22 - `icp.negative_keywords` -- to filter out self-promoters and irrelevant results233. Accept parameters:24 - `platforms` -- list of platforms to search, or `"all"` (default: `"all"`)25 - `max_results` -- max leads to return (default: 20)26 - `time_window` -- how far back to search (default: `"past week"`)27284. Available platforms: Freelancer, PeoplePerHour, Guru, Fiverr, Upwork, Reddit, LinkedIn, Behance, Dribbble, Shopify Community, IndieHackers, Funding News, Twitter/X, Instagram Brands, Product Hunt, Google Maps, Shopify Store Discovery.2930## Phase 1: Platform-Specific Scraping3132For each selected platform, use WebSearch with site-specific queries. Generate 2-3 queries per platform by rotating service keywords. Execute searches with rate limiting: max 3 concurrent, 2-second pause between batches of 3.3334### Freelancer.com3536- Query: `site:freelancer.com/projects "{keyword}"` for each service keyword37- Extract: project title, description, budget range, skills required, posted date, URL, proposals count38- Note: Freelancer projects always have `/projects/` in the URL path. Filter results missing this pattern.3940### PeoplePerHour4142- Query: `site:peopleperhour.com "{keyword}" "project"`43- Extract: project title, description, budget, posted date, URL4445### Guru4647- Query: `site:guru.com/jobs "{keyword}"`48- Extract: title, description, budget, skills, URL4950### Fiverr5152- Query: `site:fiverr.com/categories "{keyword}"` OR search for buyer request forums53- Note: Fiverr is seller-first. Focus on buyer request threads and "looking for" language, not seller profiles.5455### Upwork5657- Query: `site:upwork.com/freelance-jobs "{keyword}"`58- Extract: title, description, budget, client history, URL5960### Reddit6162- Query: `site:reddit.com/r/shopify OR site:reddit.com/r/ecommerce "{keyword}" "{intent_keyword}"`63- Also search: r/smallbusiness, r/Entrepreneur, r/DTC, r/forhire64- Extract: post title, body text, subreddit, author, post date, URL, comment count65- Prioritize posts with question marks and help-seeking language ("need", "looking for", "recommend", "anyone know").6667### LinkedIn6869- Query: `site:linkedin.com/posts "{keyword}" "{intent_keyword}"`70- Also: `site:linkedin.com/jobs "{keyword}"`71- Extract: post text, author, company, post date, URL72- Note: LinkedIn post URLs are not always indexable. Accept partial results.7374### Behance7576- Query: `site:behance.net/joblist "{keyword}"`77- Extract: job title, company, description, URL7879### Dribbble8081- Query: `site:dribbble.com/jobs "{keyword}"`82- Extract: job title, company, description, URL8384### Shopify Community8586- Query: `site:community.shopify.com "{keyword}" "{intent_keyword}"`87- Extract: thread title, body, author, date, URL88- Focus on threads in "Shopify Design" and "Shopify Apps" categories.8990### IndieHackers9192- Query: `site:indiehackers.com "{keyword}" "{intent_keyword}"`93- Extract: post title, body, author, date, URL94- Look for founders asking about ecommerce, Shopify, or D2C store builds.9596### Funding News9798- Query: `"{industry} startup" "raises" OR "funding" OR "seed round" this week`99- Sources to check: TechCrunch, Crunchbase, YourStory (for India)100- Extract: company name, amount raised, round, industry, investors, URL101- Parse headline for company name (usually the first entity before "raises" or "secures").102- Parse for funding amount: look for patterns like `$X million`, `Rs X crore`, etc.103104### Twitter/X105106- Query: `site:twitter.com OR site:x.com "{keyword}" "shopify" OR "ecommerce" OR "d2c"`107- Also: `site:x.com "{industry}" "just launched" OR "coming soon" OR "new store"`108- Extract: tweet text, handle, bio, website from profile, follower count109- Focus on brand accounts, not agencies or developers110111### Instagram Brands112113- Query: `site:instagram.com "{keyword}" "shop" OR "store" OR "link in bio"`114- Target hashtags: #shopifystore, #d2cbrand, #ecommerce, #shopifyseller115- Extract: profile name, handle, bio, website link from bio, follower count116- Focus on D2C brands with active storefronts117118### Product Hunt119120- Query: `site:producthunt.com "{keyword}" OR "ecommerce" OR "shopify"`121- Extract: product name, tagline, maker name, website, launch date, upvotes122- Focus on recently launched D2C products and ecommerce tools123124### Google Maps / Business Directories125126- Query: `site:google.com/maps "{industry}" "{market}"` + `site:justdial.com "{keyword}"` (India) + `site:yelp.com "{keyword}"` (US/UK)127- Extract: business name, phone number, website, address, rating128- Phone numbers are a key differentiator for multi-channel outreach129130### Shopify Store Discovery131132- Query: `site:myshopify.com "{industry_keyword}"` + `site:builtwith.com "shopify" "{industry}"`133- Extract: store name, URL, theme (if visible), industry134- Look for stores with basic themes (Dawn, Debut) indicating redesign need135- These are warm leads: they already use Shopify but need upgrades136137## Phase 2: Normalize Results138139Normalize all results from every platform into a single standard format:140141```json142{143 "title": "Project or post title",144 "description": "First 500 chars of description or body text",145 "platform": "Freelancer",146 "url": "https://...",147 "budget": "$500-$1000",148 "posted_date": "2024-01-15",149 "market": "US",150 "contact": "username or name if available",151 "company": "Company name if identifiable from context",152 "skills_required": ["shopify", "liquid", "theme-development"],153 "contact_surfaces": {154 "has_email": false,155 "has_linkedin": false,156 "has_instagram": false,157 "has_phone": false,158 "has_website": true,159 "channel_count": 1,160 "discovery_notes": "Website from store URL."161 },162 "raw_data": {}163}164```165166Rules:167- `market` should be inferred from currency symbols, country mentions, or TLD patterns in the content.168- `budget` should be normalized to a consistent format: "$X" or "$X-$Y" or "Rs X" for Indian currency. Set to empty string if not found.169- `contact` should capture the username, author name, or poster identity if visible.170- `skills_required` should be extracted from explicit skill tags or inferred from description keywords.171172## Phase 3: Filter173174Apply filters in this order:1751761. **Negative keyword filter**: Check title + description against `icp.negative_keywords`. Reject any result matching a negative keyword (these are typically self-promoters, spam, or irrelevant categories).1771782. **Relevance check**: The result must match at least one `primary_keyword` OR one `secondary_keyword` from the config. Results matching zero keywords are discarded.1791803. **Recency filter**: Skip results with a `posted_date` older than the `time_window` parameter. If `posted_date` is empty/unknown, keep the result but mark it with `"date_unknown": true`.1811824. **Dedup by URL**: Remove exact URL duplicates. If the same company or person appears from different URLs (same underlying opportunity), keep only the most recent or most detailed one.183184## Phase 4: Output185186Return an array of normalized leads, sorted by relevance:1871. Primary keyword matches first (stronger signal)1882. Secondary keyword matches second1893. Within each group, sort by recency (newest first)190191Present results grouped by platform with counts:192193```194Found {N} leads across {M} platforms:195196Freelancer ({count}):1971. "Project title" - $budget - URL1982. ...199200Reddit ({count}):2011. "Post title" - r/subreddit - URL2022. ...203204LinkedIn ({count}):205...206207[Other platforms with results]208209Total: {N} leads210Filtered out: {X} (negative keywords: {a}, irrelevant: {b}, stale: {c}, duplicates: {d})211```212213Trim to `max_results` after sorting. If more results exist, note the overflow count.214215## Example Usage216217Trigger phrases:218- "Scrape platforms for leads"219- "Find gigs on Freelancer and Upwork"220- "Search all platforms for Shopify projects"221- "Run platform scraper"222- "Find freelance gigs matching our services"223224```225User: Scrape Freelancer and Reddit for Shopify leads226Assistant: [reads config, generates site-specific queries for Freelancer and Reddit, executes with rate limiting, normalizes to standard format, filters and deduplicates, presents grouped results]227```228229```230User: Run platform scraper on all platforms, last 3 days231Assistant: [same flow across all 12 platforms, time_window set to 3 days]232```