2026-09-20 · 原文发布日
自动搜索与评分演讲和活动机会
n8n免费模板:接收搜索Webhook后触发Gumloop寻找行业展会或演讲机会,结果回调写入Supabase并按截止日期或新鲜度评分排序,可选邮件发送结果;另有Webhook调OpenAI为选定机会起草外联邮件。提供轮询接口供前端应用查进度。
原文要点
原模板免费,主线是:搜索Webhook接收Lovable类前端参数,先在Supabase/Postgres建running记录并立刻回request_id供轮询;按event或speaker模式触发对应Gumloop流程;Gumloop回调带request_id与results数组后,按活动截止日或演讲新鲜度评分排序,把状态改completed,可用Gmail发结果;另有GET结果接口和POST draft-email接口调OpenAI Chat Completions返回JSON主题与正文。需要Supabase表、Postgres/Gmail OAuth2/OpenAI Header Auth凭据,并替换两个Gumloop触发URL。
这次做成什么
做一个可练习的“机会雷达”最小闭环:前端提交搜索→后台立即给查询号→异步检索回调→统一评分排序→可查状态→对入选机会起草外联邮件。评分细则原文只给方向,本站采用可复算的练习公式:event模式越临近截止且仍有效越靠前;speaker模式越近期越靠前。
准备什么
- n8n可运行实例并能配置Webhook生产地址、Postgres/Supabase凭据、可选Gmail OAuth2
- 一个Supabase项目及建表权限,练习可用独立schema避免污染正式数据
- Gumloop两个incoming webhook触发端点,或可先用HTTP测试端点模拟回调
- OpenAI API Key以HTTP Header Auth保存;草稿功能可暂时禁用
- 前端或curl/Postman,能发送POST JSON并按request_id轮询GET
具体怎么做
建表并约定字段映射
在Supabase SQL编辑器执行下方建表SQL。字段映射固定为:请求体mode/industry/location/vendor_type或topic/context→temp_search_results.mode与检索上下文;request_id由Postgres默认UUID生成;results存jsonb数组;error_message存失败文本;subscribers仅在提交email时写入email与source。
配置搜索入口Webhook并立即返回
POST /webhook/search-opportunities接收JSON,先校验mode只能是event/speaker、event需industry,speaker需topic;Insert Supabase状态running并Select回request_id;立即Respond {request_id,status:"running"},同一请求后续分支再触发Gumloop,避免前端等待检索完成。
连接Gumloop与回调分支
把两个HTTP请求节点分别指向你的event/speaker Gumloop触发URL,body必须带回调地址与request_id。回调POST /webhook/gumloop-callback校验request_id存在且status=running;用Supabase查询原mode;若results为空或缺数组,更新status=failed与error_message;否则进入评分。
评分排序、完成与通知
在Function/Code类节点按下方公式计算score并降序排序,Update results、status=completed、updated_at;若记录有email且Gmail凭据已配置,发送纯文本结果;无论是否发信,GET /webhook/search-results?request_id=都返回status、results或error_message。
起草外联邮件
POST /webhook/draft-outreach接收request_id与opportunity_index;从Supabase取出对应机会,调OpenAI Chat Completions,要求只输出JSON{subject,body};失败时返回502风格错误对象并写error_message,不把模型原文直接当成功。
可直接复制的材料
Supabase练习建表SQL
本站练习schema;生产可加索引、RLS与保留期。不要把真实订阅者邮箱放入演示库。
create table if not exists temp_search_results (
request_id uuid primary key default gen_random_uuid(),
status text not null default 'running',
email text,
mode text not null check (mode in ('event','speaker')),
context jsonb not null default '{}'::jsonb,
results jsonb not null default '[]'::jsonb,
error_message text,
created_at timestamptz not null default now(),
updated_at timestamptz not null default now()
);
create table if not exists subscribers (
email text primary key,
source text not null default 'opportunity-radar',
created_at timestamptz not null default now()
);评分与排序练习算法
本站独立设计的可复算练习公式;原模板只说按截止日/新鲜度,未给权重。生产应把过期活动过滤规则单独核对。
// 输入 items: 数组;mode: 'event' | 'speaker';now: new Date()
function scoreItem(it, mode, now) {
if (mode === 'event') {
const d = new Date(it.deadline);
const days = (d - now) / 86400000;
if (Number.isNaN(days) || days < 0) return -1;
return Math.max(0, 100 - Math.min(days, 100)) + (it.vendor_match ? 10 : 0);
}
const p = new Date(it.published_at || it.updated_at || now);
const age = (now - p) / 86400000;
if (Number.isNaN(age)) return 0;
return Math.max(0, 100 - Math.min(age, 100)) + (it.relevance ? Number(it.relevance) : 0);
}
const ranked = items.map(it => ({...it, score: scoreItem(it, mode, now)}))
.sort((a,b) => b.score - a.score);OpenAI外联草稿提示词
粘贴到draft-email分支;{opportunity}与{context}由n8n表达式替换。模型服务可能另收费,原模板不含模型额度。
你是B2B外联助理。根据给定机会信息起草简短中文邮件,只能输出一个JSON对象,不要Markdown,不要解释。字段:subject不超过38字,body为120至180字,包含称呼占位{姓名}、我方价值占位{我方简介}、明确一次15分钟通话请求。若机会字段缺失,不要编造主办方、日期或费用。
机会JSON:
{opportunity}
请求方上下文:
{context}一条隔离测试数据
example.test为保留测试域;不发送给真实邮箱。生产Webhook应加密钥或允许名单。
{"mode":"event","industry":"咖啡设备","location":"上海","vendor_type":"制造商","email":"demo@example.test","source":"aiplay-lab"}输入与输出示例
本站虚构演示,request_id/分数/邮件均为示意,未调用Gumloop/OpenAI,不代表原作者运行结果。
输入
POST搜索体:{"mode":"event","industry":"咖啡设备","location":"上海","vendor_type":"制造商","email":"demo@example.test"};回调results:[{"title":"上海国际咖啡展","deadline":"2026-10-08","vendor_match":true},{"title":"华东饮品供应链日","deadline":"2026-12-20","vendor_match":false}]对应输出
搜索立即返回:{"request_id":"7d1f6f9e-3c2a-4f0f-9c8b-demo00000001","status":"running"}。轮询完成时results排序为上海国际咖啡展在前,因截止更近且vendor_match加10;华东饮品供应链日在后。GET返回status:"completed", error_message:null;draft-outreach对index0返回{"subject":"咖啡展演讲合作咨询","body":"{姓名}您好,我们看到上海国际咖啡展正在征集行业分享,{我方简介}与咖啡设备实践相关,想确认是否有15分钟沟通机会,了解选题与提交要求。"}做完检查这些
- 提交合法event请求后应立即返回request_id与running状态,不阻塞等待Gumloop结果
- temp_search_results同一条记录从running变completed,results为jsonb数组且每项含score字段
- 回调带未知request_id时不改库,轮询接口返回failed或not_found风格错误且不泄露凭据
- 过期截止日event被过滤或score=-1排最后,speaker按较新published_at优先
- draft-outreach输出可被JSON.parse,且缺字段时不生成虚构主办方、日期或价格
容易卡住的地方
- Gumloop触发与回调URL必须成对替换,request_id缺失会让回调无法找回原mode
- Supabase/Postgres字段名若改成camelCase,所有Insert/Select/Update映射要同步改
- 公开Webhook容易被刷,至少加Header密钥、速率限制或只允许前端域名
- OpenAI草稿接口不要把敏感采购预算、未公开报价放进prompt上下文
- 原模板免费可下载,但Gmail/OpenAI/Gumloop与Supabase用量可能分别计费
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Find and score event and speaker opportunities with Gumloop, Supabase, and OpenAI
- 原作者
- Ruth Olatunji
- 原始发布日期
- 2026-09-20T05:10:23.917Z
- 来源
- https://n8n.io/workflows/19748