2026-09-03 · 原文发布日
自动生成退租押金结算单
这个n8n模板帮房东处理退租结算:物业系统或表单通过webhook提交退租信息(房客、单元、押金、欠费、损坏清单),OpenAI把每项损坏归类为可扣费或正常损耗并估价,再合计扣除项和欠租,算出应退押金或应收金额。明细结算单通过Gmail发给房客,结果写回Google Sheets,房东在Telegram收通知;另有每日定时任务扫描滞留超3天的待办并提醒。
原文要点
这是n8n.io上的免费模板(作者Khairul Muhtadin,2026年9月更新,标注免费非付费)。原文说明流程为:webhook接收退租数据(房客、单元、押金、欠费、损坏清单)→校验并入Google Sheets的MoveOutLog页标记pending→OpenAI把每项损坏分为可扣费或正常损耗并估价→计算扣款、欠租与应退净额→Gmail发明细结算单给房客→更新表格并Telegram通知房东,欠费时另发Gmail副本→每日定时扫描滞留3天以上案件并提醒或报平安。
这次做成什么
照本指南在n8n里从零搭一条等价流程:收退租 webhook、AI 判定损坏性质并估价、自动算应退押金或应收金额、发邮件通知并落表,另有每日滞留提醒。全部用本站设计的练习数据跑通,不依赖原模板文件。
准备什么
- 一个可登录的n8n实例(云端或自托管均可),能创建webhook和定时触发器
- OpenAI API密钥(在n8n中新建OpenAI凭据,模型调用可能产生费用)
- 已授权的Google Sheets OAuth2凭据和Gmail OAuth2凭据
- Telegram Bot Token及房东自己的chat ID
- 一个Google表格,含MoveOutLog工作表,列名见步骤2
具体怎么做
建webhook入口与字段校验
新建工作流,添加Webhook节点,方法POST,路径设为/lease/moveout,响应模式选立即返回。后面接一个Code节点:从请求体读取tenant_name、tenant_email、unit、move_out_date、deposit_amount、unpaid_rent、unpaid_utilities和damages数组;任一必填字段缺失或damages不是数组时,走“无效”分支,用Telegram和Gmail节点给房东发“收到无效退租登记,请人工补录”的告警;字段齐全则继续。用下方材料里的测试JSON在测试URL上POST一次,确认两条分支都能走通。
建表并写入待办行
在Google Sheets新建文档,工作表命名MoveOutLog,首行列依次为:moveout_id, tenant_name, tenant_email, unit, move_out_date, deposit_amount, unpaid_rent, unpaid_utilities, damages, status, received_at, deduction_total, unpaid_total, net_refund, classified_at。回到n8n加Google Sheets节点选Append,凭据选刚才授权的账号,操作列把webhook字段逐列映射,moveout_id用表达式生成如MO-{{$now.toFormat('yyyyLLddHHmmss')}},status固定写pending,received_at写当前时间。执行后表格应新增一行待办记录。
OpenAI分类损坏并解析JSON
加OpenAI Chat节点,系统消息用下方“损坏分类提示词”全文,用户消息把damages数组和单元类型以JSON字符串拼入。提示词要求模型只输出JSON。其后接Code节点做清洗:去掉模型可能带回的```json代码围栏,JSON.parse结果,校验每项含item、classification、estimated_cost三个键;解析失败时把status改为needs_review并提醒房东,避免脏数据进入结算。
计算结算并生成结算单
再接一个Code节点:deduction_total=所有classification为chargeable项的estimated_cost之和;unpaid_total=unpaid_rent+unpaid_utilities;net=deposit_amount-deduction_total-unpaid_total;net为正记应退押金,为负记应收金额(net_refund可为负,邮件文案分支表述)。用n8n的HTML拼接或Code节点生成逐行明细(项目、判定、金额、依据一句话),这就是发给房客的结算单正文。
发邮件、回写表格、通知房东
Gmail节点发送结算单给tenant_email,主题“退租押金结算单-{{unit}}”。Google Sheets节点选Update,匹配列moveout_id,回写status=done、deduction_total、unpaid_total、net_refund、classified_at。Telegram节点给房东chat ID发摘要(房客、单元、净额);当net为负时再加一个Gmail节点把结算单副本发给房东邮箱。
加每日滞留扫描
复制一份工作流或同一画布加Schedule Trigger(默认每日一次,时区按你所在地),接Google Sheets读取全部行,Code节点筛选status=pending且received_at距今超过3天的行:有结果时Telegram+Gmail提醒房东列出滞留moveout_id;无结果时发一条“今日无滞留案件”的平安消息。阈值3天和发送时间在节点参数里自行调整。
可直接复制的材料
退租登记测试数据(POST请求体)
本站虚构练习数据;tenant_email请换成你自己的测试邮箱,别用真实房客信息。
{
"tenant_name": "陈晓芸",
"tenant_email": "tenant-demo@example.com",
"unit": "3栋2单元502",
"move_out_date": "2026-09-20",
"deposit_amount": 8000,
"unpaid_rent": 1200,
"unpaid_utilities": 260,
"damages": [
{"item": "客厅墙面大面积涂鸦", "note": "多处马克笔痕迹"},
{"item": "厨房地砖轻微磨损", "note": "使用三年正常痕迹"},
{"item": "卧室门锁损坏", "note": "锁芯断裂无法反锁"}
]
}损坏分类提示词(OpenAI系统消息全文)
本站独立编写;估价是模型估计值,正式使用建议人工复核后再发房客。
你是住房租赁退租定损助手。用户会给你一份退租损坏清单(JSON数组,每项含item和note)以及单元信息。
对每一项判断它是 chargeable(房客原因造成、可从押金扣费) 还是 wear_and_tear(正常使用损耗、不可扣费),并给出合理的中文估价(人民币元,整数)和一句不超过40字的判定依据。正常老化、轻微磨损、正常使用痕迹一律判 wear_and_tear 且估价为0。
只输出一个JSON数组,不要输出任何其他文字、解释或代码围栏。每项格式:
{"item":"项目名称","classification":"chargeable或wear_and_tear","estimated_cost":数字,"reason":"判定依据"}
估价应符合中国大陆一般维修市场价,同一项目不要重复计费。结算单HTML正文模板(Gmail节点用)
本站示例模板;表格行需在n8n中用表达式或Code节点按损坏数组动态生成,变量名按你的节点输出调整。
<h2>退租押金结算单 - {{$json.unit}}</h2>
<p>尊敬的 {{$json.tenant_name}}:</p>
<p>您于 {{$json.move_out_date}} 退租,结算明细如下:</p>
<table border="1" cellpadding="6" cellspacing="0">
<tr><th>项目</th><th>判定</th><th>金额(元)</th><th>说明</th></tr>
<!-- 对每项损坏循环输出一行,wear_and_tear行金额显示0 -->
</table>
<p>押金:{{$json.deposit_amount}} 元;扣款合计:{{$json.deduction_total}} 元;欠租及水电:{{$json.unpaid_total}} 元。</p>
<p><b>应退押金:{{$json.net_refund}} 元</b>(若为负数则为应补缴金额,请在15日内结清)。</p>
<p>如有异议请在收到本邮件7日内回复。</p>输入与输出示例
本站虚构演示,分类与估价为示意,未实际调用任何模型;真实运行结果会随模型与数据变化。
输入
用上面的测试数据POST到/lease/moveout:押金8000元,欠租1200元,欠水电260元,三项损坏分别为墙面涂鸦、地砖轻微磨损、门锁损坏。对应输出
OpenAI返回示例:[{"item":"客厅墙面大面积涂鸦","classification":"chargeable","estimated_cost":600,"reason":"非正常使用造成的污损需重新粉刷"},{"item":"厨房地砖轻微磨损","classification":"wear_and_tear","estimated_cost":0,"reason":"三年使用正常损耗"},{"item":"卧室门锁损坏","classification":"chargeable","estimated_cost":150,"reason":"锁芯断裂属损坏需更换"}]。计算结果:deduction_total=750,unpaid_total=1460,net_refund=8000-750-1460=5790元应退。表格该行status变为done,房客收到含这三行明细的结算邮件,房东Telegram收到“3栋2单元502 应退5790元”。做完检查这些
- 用缺tenant_email的请求体POST时,流程走无效分支且房东收到Telegram和Gmail两条告警,表格不新增行
- 完整测试数据执行后,MoveOutLog新增一行且status=done,deduction_total=750、unpaid_total=1460、net_refund=5790与手算一致
- 房客测试邮箱收到的邮件中,每项损坏都有判定和金额行,且wear_and_tear项金额为0
- 把一条pending行的received_at改成4天前,手动触发定时扫描后,房东收到含该moveout_id的滞留提醒
容易卡住的地方
- OpenAI偶尔在JSON外包代码围栏或加解释文字,必须保留清洗解析步骤,否则后续计算节点会报错
- Google Sheets的Update节点以moveout_id为匹配列,列名拼写不一致会更新错行或找不到行
- 欠费字段若传来字符串而非数字,合计会拼接成文本,需在规范化步骤里统一转数值
- webhook测试URL只在编辑器监听时有效,正式接入物业系统或表单前要激活工作流并使用生产URL
- OpenAI调用和Gmail发送都可能受额度与费用限制,练习阶段先用小数据量
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Generate move-out deposit statements with gpt-5.6-terra, Gmail, and Google Sheets
- 原作者
- Khairul Muhtadin
- 原始发布日期
- 2026-09-03T12:37:46.293Z
- 来源
- https://n8n.io/workflows/19124