2026-10-05 · 原文发布日
餐厅菜谱成本自动重算并预警毛利侵蚀
这个免费n8n模板帮餐饮经营者盯住食材涨价:供应商新价格通过webhook提交后写入Google Sheets价格页并回执确认;每天早上的扫描按最新价格重算每道菜的分份成本和成本率,超过目标毛利的菜品记入CostAlerts页并邮件列出;每周一再由AI把当周数据写成一封纯文本摘要,点名问题最大的菜品并给出拉回目标毛利的建议定价。缺价格的食材会在提醒中标注。
原文要点
该免费模板用webhook(POST路径menu-cost-intake-0926)接收供应商改价,校验ingredient与unit_price后写入Google Sheets的Prices页并回执邮件;缺字段则发拒绝邮件。每天06:00扫描按最新price_date取价,重算每道菜cost_per_portion和cost_pct,超target_cost_pct的记入CostAlerts页并汇总成一封预警邮件,缺价食材列入missing_ingredients。每周一07:00由模板内称为gpt-6-luna的模型把统计数据写成180词以内的纯文本摘要并给出建议定价。
这次做成什么
在n8n里搭好"改价入库→每日重算预警→每周AI摘要"的完整链路,并用本站设计的合成数据跑通一次演练:提交两条改价、触发一次手动扫描、确认预警邮件和CostAlerts行生成。
准备什么
- 一个可编辑的Google账号,用于建表和Google Sheets/Gmail的OAuth2凭据
- n8n实例(自托管或云)且能开通webhook外部访问
- 一个AI聊天模型凭据(模板标注为[OI]chat model,具体模型名以模板节点为准)
- 经营者的收件邮箱,用于接收预警与周报
具体怎么做
建四张表页并填合成数据
新建一个Google Sheets文件,建Prices、Recipes、Menu、CostAlerts四个页签。Prices列:ingredient、unit_price、unit、price_date、supplier、submitted_by、update_id;Recipes列:recipe、ingredient、qty_per_portion;Menu列:recipe、sale_price、target_cost_pct;CostAlerts列:alert_date、recipe、cost_per_portion、cost_pct、target_cost_pct、status。先填入下文artifacts里的合成CSV作为演练数据。
导入模板并替换表格与凭据
从n8n模板页导入该工作流,把所有Google Sheets节点指向你自己的表格文件与对应页签,配置Google Sheets OAuth2与Gmail OAuth2凭据,把预警和周报节点里的占位收件地址改成你的邮箱。
用webhook提交一条改价
激活工作流后,向https://你的n8n域名/webhook/menu-cost-intake-0926发送POST请求,body用下文示例JSON(含ingredient、unit_price、owner_email)。预期:Prices页新增一行带update_id的记录,并收到一封确认邮件,邮件里写出食材名、新价格和参考号。
手动执行每日扫描验证预警
为不必等到06:00,可临时手动触发Daily Margin Sweep分支(或把定时器改到几分钟后)。由于演练数据里鸡腿排涨价后成本率超过目标,预期CostAlerts页出现一行status为flagged的记录,并收到标题形如"Menu margin alert: 1 item(s) over target"的邮件,邮件中列出分份成本、成本率对比和缺失价格提示。
触发周一摘要并核对时区
为不必等到06:00,可临时手动触发Daily Margin Sweep分支(或把定时器改到几分钟后)。演练数据中鸡腿排涨到26.5元/kg后,照烧鸡腿饭成本率约33.5%超过32%目标,预期CostAlerts页出现一行status为flagged的记录,并收到标题形如"Menu margin alert: 1 item(s) over target"的邮件,列出分份成本与成本率对比;若某食材从未有价格,邮件会同时列出missing_ingredients。
可直接复制的材料
webhook改价测试请求体
本站虚构示例。owner_email换成你的邮箱;unit、supplier、submitted_by可省略,但ingredient和unit_price必填,否则会收到拒绝邮件。
{
"ingredient": "鸡腿排",
"unit_price": 26.5,
"unit": "kg",
"supplier": "示例供应商A",
"submitted_by": "采购-测试",
"owner_email": "owner@example.com"
}四页合成演练数据(按页签分别粘贴)
本站合成数据,仅用于跑通流程。售价19元时,旧价22元/kg对应成本为5.55元、成本率约29.2%,不触发;webhook提交26.5元/kg后按最新price_date取价,成本升至6.36元、成本率约33.5%,超过32%目标即触发预警。
[Recipes页]
recipe,ingredient,qty_per_portion
照烧鸡腿饭,鸡腿排,0.18
照烧鸡腿饭,米饭,0.25
照烧鸡腿饭,照烧酱,0.03
[Menu页]
recipe,sale_price,target_cost_pct
照烧鸡腿饭,19,0.32
[Prices页]
ingredient,unit_price,unit,price_date,supplier,submitted_by,update_id
米饭,4.2,kg,2026-09-28,示例供应商A,采购-测试,seed-001
照烧酱,18,kg,2026-09-28,示例供应商B,采购-测试,seed-002
鸡腿排,22,kg,2026-09-28,示例供应商A,采购-测试,seed-003
[CostAlerts页] 只保留表头,留空每周摘要节点可用提示词(本站撰写版)
模板原文只描述行为未给提示词全文,此为按描述独立撰写的版本,可粘贴进AI节点后按模板实际字段名调整变量引用。
你是餐厅成本控制助理。根据下面的JSON统计写一封不超过180个汉字的纯文本周报(不要Markdown):
1) 开头一句总评;若flagged_count为0,说明菜单状态良好并点名毛利最好的菜品。
2) 按成本率从高到低点名最差菜品(最多3个),每个给出建议售价,计算公式:建议售价 = 成本率对应的分份成本 ÷ 该菜target_cost_pct,四舍五入到0.5元。
3) 结尾写一句需要向供应商核实什么(如涨价原因、锁价周期)。
统计JSON:{{ $json.stats }}输入与输出示例
本站虚构演示数字,仅展示计算口径,非模板实际运行结果;成本率是否触发取决于你自己Menu页的售价与目标值。
输入
向webhook提交:鸡腿排 unit_price 26.5 元/kg;Menu中照烧鸡腿饭售价19元、target_cost_pct 0.32;Recipes用量:鸡腿排0.18kg、米饭0.25kg、照烧酱0.03kg对应输出
重算分份成本 = 0.18×26.5 + 0.25×4.2 + 0.03×18 = 4.77+1.05+0.54 = 6.36元;cost_pct = 6.36÷19 ≈ 33.5%,超过32%目标,触发预警:CostAlerts新增一行 status=flagged,邮件标题"Menu margin alert: 1 item(s) over target",正文列出6.36元/份、33.5%对比目标32%。旧价22元/kg时成本为5.55元、成本率约29.2%,不会触发。做完检查这些
- Prices页在POST后新增一行,且update_id与received时间戳非空
- 缺少unit_price的POST不会写入表格,且收到列明必填字段的拒绝邮件
- 手动扫描后CostAlerts出现status为flagged的行,alert_date为当天
- 预警邮件标题包含"item(s) over target"且正文列出分份成本与目标对比
- 周一摘要邮件为纯文本、不超过180词,并包含至少一个建议售价
容易卡住的地方
- Google Sheets节点默认按列名匹配,列名拼写或大小写不一致会导致字段为空
- 模板按price_date取最新价,若改价的price_date早于已有记录,新价不会生效
- 时区未调整时,06:00/07:00触发会按n8n服务器时区执行而非本地时间
- 模板内模型名gpt-6-luna需以你实际AI节点可用模型为准,必要时换成你已开通的模型
- Recipes中某食材从未有过价格时该菜成本偏低,务必看missing_ingredients提示
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Track menu food costs and flag margin erosion with GPT-6-luna, Google Sheets and Gmail
- 原作者
- Khairul Muhtadin
- 原始发布日期
- 2026-10-05T10:57:38.310Z
- 来源
- https://n8n.io/workflows/20442