- Published on
n8nでRedditから見込み客を探すフローを作る
- Authors
- Name
- Nomad Dev Life

Redditから見込み客を探す
現在、とあるBeta版のサービスを運用していて、見込み客をRedditで探す毎日です。
Redditをキーワードで検索してポストの内容を確認し、自分達が想定する見込み客に近いかどうかを判断し、見込みがありそうであればコールドメールを送信しています。
しかし、これを手作業で毎日行うのは結構です。マーケティングに気持ちが向いている時はあまり苦になりませんが、本業が忙しかったり、開発モードに入ってしまうと、この活動が疎かになってしまっています。
一部を自動化して、なるべく毎日活動を行うようにできないか考えた結果、n8n を使って「Redditで特定のキーワードを検索 → AIで見込み客っぽい投稿を判定 → Discordに通知」するワークフローを作ったので紹介します。
n8nとは?
n8n は、ワークフロー自動化(オートメーション)をノーコード/ローコードで実現できるオープンソースのツールです。
今回使用するReddit、Discordの他にも、Google、Slack、Databases など、多数のサービスと連携可能です。 また、OpenAIやAnthropic、GeminiといったAIと連携することもできます。
クラウド版とセルフホスト版
n8n には、クラウド版とセルフホスト版があります。今回は、VPS上にn8nのDocker Containerをdeployし、セルフホストの形で使いました。 設定は以下のとおりです。TLS無しで構築しています。
n8n:
image: n8nio/n8n
restart: always
ports:
- "5678:5678"
environment:
- N8N_PORT=5678
- N8N_HOST=(Host IP Address)
- N8N_SECURE_COOKIE=false
- GEMINI_API_KEY=(Gemini API Key)
volumes:
- /var/data/n8n:/home/node/.n8n
フローの全体像

今回作ったワークフローは以下の流れで動きます。
定期実行 (Cron Node)
毎日定時に自動でフローが走るように設定しています。Reddit 検索 (Reddit Node)
Redditの検索はOAuthによる認可が必須らしく、単に検索URLにアクセスすると403が返ってきます。幸い、n8nにはOAuthを使ったReddit検索ができるActionがすでに搭載されているので、今回はそれを使いました。n8nのReddit 検索は、Nodeを選択する際に"Actions in an app" -> "Reddit" -> "Search For a post"を選択してフローに追加します。

このReddit 検索Nodeをフローに入れる際に、事前にOAuthで接続するアプリケーション情報をpreferences (reddit.com)に登録する必要があります。今回は、Docker Containerでdeployしたn8nの情報を、Web Applicationとして登録しました。

n8n側のOAuthの設定は、Reddit 検索Nodeの"Credential for Reddit OAuth2 API"で"Create new credential"を選択すると、Redirect URIが表示され、Secret / Client Secretを入力することができるようになっています。

このNodeでは、検索するキーワード、検索結果の数、および検索結果の順序を指定することができます。
Rule Based Filter (Function Node)
Reddit 検索の結果を全部AIにチェックさせてしまうと、API呼び出しのコストがかなりかかってしまう可能性があります。 そこで、AIにチェックさせる前に、Rule Based Filterでフィルタします。Reddit 検索の結果は、タイトルや本文だけではなくいろんな情報が含まれているので、それらを使って調整します。今回は以下のようにしました。
- タイトル+本文に、既定のキーワードが一致した場合 → +6点
- Redditスコア5以上 → +2点
- コメント数2以上 → +2点
合計スコアが4以上なら「候補」として扱います。
AIによる精査 (Google Gemini Node)
今回のポイントとなる、AIによる判定です。今回はGeminiを使いました。プロンプトは以下です。You are a lead qualification assistant. Reddit Post: Title: {{$json.title}} Body: {{$json.selftext}} Subreddit: {{$json.subreddit}} Permalink: {{$json.permalink}} Score: {{$json.score}} CandidateScore: {{$json.candidateScore}} Task: Judge if this post shows strong interest in (Your interest). Respond strictly in JSON with {leadScore: 0-1, "reason": "...", "title": (title), "subreddit": (subreddit), "permalink": (permalink), "score": (score), "candidateScore": (candidateScore)}.
このプロンプトによって、候補投稿を Gemini に渡し、「見込み客となる可能性」を 0〜1 のスコアで判定してもらいます。
例:
{ "leadScore": 0.85, "reason": "具体的にxxxのエラー解決を求めている" }
なお、このプロンプトはあくまでサンプルなので、各自でカスタマイズする必要があります。自分が売ろうとしている製品の情報や、ポストの内容をどのような基準で評価するかなどを事前にインプットしておくと良いでしょう。
Geminiアウトプット整形 (Parse Function Node)
Geminiのアウトプットが返ってくるのですが、何故かmarkdownっぽい記述で返ってきてしまい、そのままだとJSONにできないので、ここで整形しました。ここはちょっと無理やり感あるので、もっと良い方法があるかもしれません。const items = $input.all(); const raw = items[0].json; let parsed; try { const text = raw.content.parts[0].text.replaceAll("```", "").replaceAll('json\n', '').replaceAll('\n', ''); parsed = JSON.parse(text); } catch (e) { parsed = { leadScore: 0, reason: 'Gemini parsing failed' }; } return [{ json: { ...$json, leadScore: parsed.leadScore, reason: parsed.reason, title: parsed.title, subreddit: parsed.subreddit, permalink: parsed.permalink, score: parsed.score, candidateScore: parsed.candidateScore } }];
リード判定 (IF Node)
Geminiの判定が0.7以上の場合は先に進むようにしています。Discord通知 (Discord Node)
見込み客と判定された投稿を Discord のチャンネルに通知。 通知には以下が含まれます:- タイトル
- Reddit URL
- Subreddit
- Redditスコア
- Geminiスコアと判定理由
Discordは予めWebhook URLを取得しておき、このNodeに設定します。
実際の通知イメージ
フローができたら、"Execute Workflow"をクリックして実行します。エラー無く実行が完了すると、Discord にはこんな感じで通知されます:
Title: [投稿タイトル]
URL: https://reddit.com/[permalink]
Subreddit: r/[subreddit]
Reddit Score: 12
Gemini Score: 0.82
Reason: xxxのエラーについて具体的に質問しているため
おわりに
今回は、n8nを使って、Redditから見込み客候補を取得し、AIに判定してもらいました。 判定だけでなく、見込み客候補にどのようなアプローチをするべきか、などを聞いてみても良いかもしれません。