Overview
This workflow monitors Reddit daily for discussions showing buying intent: people asking for recommendations, comparing tools, or expressing frustration with current solutions. It scores each discussion by intent strength and engagement, producing a prioritized list of warm outreach opportunities where prospects are actively seeking what you offer.
Trigger
Cron schedule (daily at 7:00 AM UTC)
Schedule
Runs daily at 7:00 AM UTC
Workflow Steps
Load intent keyword patterns
Read buying-intent patterns (e.g., 'looking for', 'anyone recommend', 'switching from') combined with product keywords from config.
Search Reddit for intent signals
Query Scavio Reddit search for each intent + product keyword combination to find active discussions.
Score intent strength
Score each post by combining upvotes, comment count, recency, and intent keyword match quality.
Deduplicate and rank
Remove duplicate posts across keyword combinations and rank by composite intent score.
Output outreach opportunities
Save the top 20 opportunities with post links, context snippets, and suggested outreach angles.
Python Implementation
import requests
import json
from pathlib import Path
from datetime import datetime
API_KEY = "your_scavio_api_key"
INTENT_PATTERNS = ["looking for", "anyone recommend", "need a tool for", "switching from", "frustrated with"]
PRODUCT_KEYWORDS = ["search API", "SERP data", "web scraping"]
def search_reddit(query: str) -> list[dict]:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "reddit", "query": query},
timeout=15,
)
res.raise_for_status()
return res.json().get("organic", [])
def score_intent(post: dict, intent_pattern: str) -> float:
base_score = post.get("score", 0) + (post.get("comments", 0) * 3)
# Boost for stronger intent signals
if "need" in intent_pattern or "frustrated" in intent_pattern:
base_score *= 1.5
return base_score
def run():
all_opportunities = []
seen_titles = set()
for intent in INTENT_PATTERNS:
for product_kw in PRODUCT_KEYWORDS:
query = f"{intent} {product_kw}"
posts = search_reddit(query)
for post in posts:
title = post.get("title", "")
if title in seen_titles:
continue
seen_titles.add(title)
intent_score = score_intent(post, intent)
if intent_score > 10:
all_opportunities.append({
"title": title,
"subreddit": post.get("subreddit", ""),
"link": post.get("link", ""),
"score": post.get("score", 0),
"comments": post.get("comments", 0),
"intent_score": round(intent_score, 1),
"intent_pattern": intent,
"snippet": post.get("snippet", "")[:200],
})
all_opportunities.sort(key=lambda x: x["intent_score"], reverse=True)
top = all_opportunities[:20]
date = datetime.utcnow().strftime("%Y-%m-%d")
Path(f"intent_outreach_{date}.json").write_text(json.dumps(top, indent=2))
print(f"Found {len(all_opportunities)} intent signals, top {len(top)} saved")
for opp in top[:5]:
print(f" [{opp['subreddit']}] {opp['title'][:60]} (intent: {opp['intent_score']})")
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const INTENT_PATTERNS = ["looking for", "anyone recommend", "need a tool for", "switching from"];
const PRODUCT_KEYWORDS = ["search API", "SERP data", "web scraping"];
async function searchReddit(query) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "reddit", query }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
return (await res.json()).organic ?? [];
}
async function run() {
const fs = await import("fs/promises");
const opps = [];
const seen = new Set();
for (const intent of INTENT_PATTERNS) {
for (const kw of PRODUCT_KEYWORDS) {
const posts = await searchReddit(`${intent} ${kw}`);
for (const post of posts) {
const title = post.title ?? "";
if (seen.has(title)) continue;
seen.add(title);
const intentScore = (post.score ?? 0) + (post.comments ?? 0) * 3;
if (intentScore > 10) opps.push({ title, subreddit: post.subreddit ?? "", link: post.link ?? "", intentScore, snippet: (post.snippet ?? "").slice(0, 200) });
}
}
}
opps.sort((a, b) => b.intentScore - a.intentScore);
const date = new Date().toISOString().slice(0, 10);
await fs.writeFile(`intent_outreach_${date}.json`, JSON.stringify(opps.slice(0, 20), null, 2));
console.log(`Found ${opps.length} signals, top 20 saved`);
for (const o of opps.slice(0, 5)) console.log(` [${o.subreddit}] ${o.title.slice(0, 60)} (${o.intentScore})`);
}
run();Platforms Used
Community, posts & threaded comments from any subreddit