跳到主要内容

把任何表单 指向同一个 URL。

FormFlow 接收由你自己的 HTML 表单发送到 FormFlow URL 的提交,过滤垃圾内容,将其存储,并转发到你配置的目的地(例如你的收件箱或 webhook 端点)。FormFlow 不托管你嵌入的前端,也不决定你的表单收集哪些数据;付费套餐也可以使用 FormFlow 托管的页面。

action https://formflow.digital/api/v1/f/ab12x9
提交申报单 FF-1 · 示例
1 发件人
jane@acme.dev
2 目的地
https://formflow.digital/api/v1/f/ab12x9
3 内容
name · email · message
4 随附文件
2 images · 4.1 MB
5 筛查
0.02 · 非垃圾信息

一次提交的路径:接收、筛查、存储、送达。

已接收 · 已筛查 · 已存储 · 已送达 · 已扣留 · 有原因 · 可找回

你的 <form> POST /api/v1/f/ab12x9 name · email · message 筛查 每表单模型 honeypot · turnstile · schema 扣留柜台 已扣留 · 距离成为线索只差一个设置 收件箱 Jane 0.02 Marco 0.05 Priya 0.01 buy-now-bot 0.98 webhook 签名 邮件 摘要 导出 CSV · XLSX · JSON
真实提交——绿色通道 机器人——在收件箱中标记,绝不送达、绝不计入 因你自己的设置被拒——已扣留,可找回

改一个属性。即可上线。

把表单的 action 属性指向 FormFlow 的 URL 就完成了——没有 SDK、没有客户端库、不需要起服务器。静态站点、服务器或一次性 curl 都能用。

  • 描述您的表单 — 启用后可在付费套餐中使用。 描述此表单要收集的内容,或您想出的测验。创建表单前,您可以检查这些字段。
  • 导入表单架构 — 问题电子表格 · 查看导入的字段

字段也不用手写。FormFlow 从表单自身的流量推断其模式(schema),生成无障碍的标记——HTML、Blade、Vue 或 React——可直接粘贴。18 种字段类型 — text, email, tel, url, number, textarea, select, checkbox, radio, multiselect, date, file, scale, rating, time, duration, grid, checkbox_grid — 均由模式支持。编辑时构建器会依据尚未保存的设置,在字段列表旁实时绘制表单。长表单可以拆成多步,在没有 JavaScript 时回退为单页平铺。在 HTML 和 Blade 片段上,复制时开启实时渲染,此后表单会跟随你的字段列表——粘贴的标记则作为后备。

它自带样式。七张自包含样式表随标记一起交付——无需安装、无需引用——并为已经加载 Bootstrap 的站点提供类名映射。每一张都遵守同一预算:标签与输入框绑定、44px 触控目标、可见的焦点环,以及上线前逐样式核验的对比度。

<!-- 你现有的表单。无 JS,无 SDK。 -->
<form method="POST"
      action="https://formflow.digital/api/v1/f/ab12x9">
  <input  name="email"   type="email" required>
  <textarea name="message"></textarea>
  <button>Send</button>
</form>
同一张表单,FormFlow 发布的每种风格都能呈现 /form-styles/minimal

由生成你代码片段的同一套生成器渲染——不存在单独的营销复制品。

样例从 /form-styles/minimal. 实时获取。若保持空白,说明该路由从这里不可达——但样式表仍会随片段一起交付。

收文件上传。免掉存储烦恼。

声明一个 file 字段,你的表单就能通过普通 multipart 接受图片上传——无需任何配置。单个字段一次最多接受二十个文件,接受哪些格式由你决定。FormFlow 将文件存放在私有磁盘上,并向收件箱提供会过期的签名链接,附件因此绝不会停留在公开 URL 上。

  • JPEG、PNG、WebP 和 GIF——拒绝 SVG,每个文件都按魔数字节校验,不轻信扩展名。
  • 按套餐设定的大小上限,入口处即强制执行——Starter Lite 为 2 MB,Starter 为 5 MB,Pro 为 25 MB
  • 私有存放;收件箱显示会过期的签名链接,绝不内联显示 <img>
随附文件 contact-form · 已声明 2 个
roof-damage.jpg
image/jpeg · 3.2 MB · 已校验
已接受
meter-reading.png
image/png · 0.9 MB · 已校验
已接受
logo.svg 已拒绝 · 不允许 SVG

一个会学习每张表单的过滤器。

每张表单都有自己的模型。每次提交落地即被打分——你每纠正一次判定,该表单就变得更准。分数、原因、下一步行动:全部直白陈述,并附有逐表单的模型实际表现报告。试一试 →

教这张表单: 该表单的模型已更新。
收件箱 contact-form · ab12x9
Jane Okafor
Loved the demo — can we talk pricing this week?
0.02 · 已送达
promo-reply@bulk-seo.link
CHEAP backlinks + guaranteed SEO boost!!!
0.61 · 存疑
buy-now-bot
🔥 crypto doubler, act now, limited spots
0.98 · 垃圾信息
  1. 01

    蜜罐

    屏幕外字段,机器人会填而人永远看不见。零成本,所以最先运行。

  2. 02

    每表单模型

    每表单一个朴素贝叶斯模型,由你的纠正训练。新表单借用团队先验,从第一次提交就能识别。

  3. 03

    Turnstile

    可选的 Cloudflare 挑战。服务中断时自动放行——真实提交绝不会随检查一同失败。

  4. 04

    严格模式

    开启后,表单从未声明过的字段会在门口被拒收。默认关闭。

这四个阶段是为拦住机器人调校的。其中一个不止做这件事:你的严格模式分不清机器人和买家,你的来源白名单上传规则也一样。这三者按你的指令直接拒绝——而拒绝只会到达陌生人的浏览器,永远不会到你这里。

线索会在四个地方消失。其中只有一个是垃圾信息。

另外三个发生在你这侧的线路上,那里没有任何故障响亮到有人能注意到——提交者以为自己发出去了,也没有任何错误到达 FormFlow。所以每一个都被单独盯防,按提交者遭遇它们的顺序。

  1. 发送之前 一条他们看不见的规则拒绝了他们,于是他们放弃。 预检
  2. 在途中 浏览器自己的请求在落地前就死了。 浏览器发件箱
  3. 在门口 你自己的设置拒收了一次真实提交。 扣留柜台
  4. 时间久了 表单在你的网站上坏了,却一声不吭。 表单健康

问端点一句:它本来会怎么说。

在线索押上赌注之前:开启严格模式,FormFlow 为你生成的表单会让每个字段在任何人按下发送前经过真实判断——同样的规则、同样的措辞、没有任何后果。这补上了生成方式补不上的缺口:浏览器会强制 requiredtype="email",却不会强制你在构建器里设置的验证规则——因此通过浏览器检查的表单仍可能被服务器拒绝。现在,在人还来得及修正时就会被告知。拦下他们的原因同样会计入统计。

  • 契约保证无副作用——不写行、不占配额、不投递、不打垃圾分。
  • 在它询问的问题上——请求体形状、来源、模式——它从不与所预测的端点相左;测试会把同一请求体发给两端并比对结果。
  • 此外一概不问。垃圾信息、Turnstile 和文件字段都留给真正的 POST,因此预检通过只意味着这套配置接受这次提交,绝不代表它会被存储。
  • 与 POST 共用同一个速率限制,其中留有只有真实提交才能动用的储备。
POST /api/v1/f/ab12x9/preflight 示例

离开该字段,看看端点本来会如何作答。

表单规则 · 对 message 施加 min:20 · 严格模式已开启

一次没送达的提交仍然可以送达。

在抵达我们之前就出的事:连接断开、标签页过早关闭——没人会听说,因为提交者以为已经发出,而 FormFlow 又没有可记录的失败。开启浏览器发件箱后,这次尝试会被保存并在下一次页面加载时重发,以普通提交的身份抵达——被计数、被送达,并在你的控制台上标记为“已找回”。它会随你开启实时渲染复制的原生 HTML 和 Blade 片段一起提供。

  • 按表单选择开启,且绝不在带文件字段的表单上启用——上传内容无法从本地留存重建。
  • 在提交者自己的设备上保留 24 小时,最多等待五个,也绝不会恢复进他们看得见的表单。
  • 重发携带端点用来登记回执的 Idempotency-Key,找回的线索因此只被存储、计数和送达恰好一次。该请求头已在接入契约中公布,你自己的客户端也可以发送它。
  • 网络失败或 5xx 会留在队列中等下次页面加载;凡是端点真正应答过的都会被丢弃。

审查并恢复

被拒绝的提交不会被丢弃——而是连同原因和责任字段一起被扣留。FormFlow 随后通读你流量的两侧——已接受的与被拒绝的——推导出能把大多数找回来的那一个设置改动。任何会损失哪怕一条已接受提交的改动都会被丢弃,绝不展示。

扣留 · 被拒绝的提交 contact-form · 最近 7 天
dana@meridian.co
Quote for 40 units — my number is 0161 496 0000
已拒绝 · phone
t.okonkwo@brightside.dev
Can you invoice us? Reachable on 020 7946 0102
已拒绝 · phone
hello@fieldnotes.studio
Interested in the annual plan — call 0117 496 0999
已拒绝 · phone

他们得到的答复是 此表单不接受电话字段。

312 本周被拒绝 · 40 已接受

从你自己的流量推导而来 提案

接受 phone ——你的表单在发送、而你的模式从未声明过的字段。

找回
312 条被拒绝
代价
0 条已接受

用这张表单最近的流量演练过——最新几百条它接受的,以及被它拒收的。

已经在你接受的流量上验证过的放宽可以立即生效,不必等谁登录来点击确认,让表单在无人值守时也不再拒收线索。在你亲自开启之前它保持关闭,FormFlow 自行做出的任何更改若无流量确认都会回到你选择的设置。沉默即回退——队列停摆、服务中断、无人查看——因为回头路是与更改同时记录的。

当确实发生更改时,会有邮件说明改了什么、能找回什么,并链接到恢复旧设置的页面。找回的线索会再次经现行设置评判,像其他提交一样计数、送达。不做任何追溯。

而当表单本身出问题时,同样没有人告诉你。

上线很久之后,你的 HTML 仍活在你的网站上——损坏或被改动的表单会静默失败,任何错误都不会到达 FormFlow。健康度不是别人报给 FormFlow 的;它从流量中计算得出,并在第一次出现故障时邮寄给你。

  • 拒收 — 正在拒收其自身流量的相当一部分。作为独立信号上报,而不是算作枯竭,也绝不与之并列。
  • 枯竭 — 提交量相对表单自身基线骤降。
  • 漂移 — 一个已声明的字段,流量悄悄停止了发送。
  • 过早停止 — 提交者反复失败的那个字段,在他们仍在页面上时就被计入。

从表单到结果。

产品就是路径本身。把现成的 HTML 表单指向一个 URL;FormFlow 让交接、判定、找回与投递全程清晰可见。

保留你已有的前端,然后让 FormFlow 展示 Send 之后发生什么:字段可以跟随当前表单,客户侧造成的拒收可以保持可找回,每个接收方也各自保留自己的投递义务。

  • 托管页面在 Starter Lite、Starter 和 Pro 套餐中可用。
  • 名册可在 Starter Lite、Starter 和 Pro 套餐中使用,并带有托管页面。
示例:申报单的当前字段经由深色登记轨接入,粘贴的兜底标记仍留在下方。
实时渲染

复制原生 HTML 或 Blade 组件时即可启用:当前字段列表可以跟随表单,粘贴的标记仍是原生兜底,样式也仍是你复制的那个选择。

示例:一份赭色的已拒绝记录先经过现行策略闸口,才抵达绿色准入托盘。
找回

找回不是绕过,也不是 webhook 重试。FormFlow 会依据表单当时的生效设置重新判定被存档的拒收;此后它才成为一条真正的提交,消耗当前用量,并进入同一条投递路径。

示例:三份不同的表单申报汇聚到同一个绿色入口,并作为一条留痕路径继续前行。
一个公开写入点

表单令牌就是公开的写入交接点。FormFlow 接收请求、加以判定、存储提交或拒收,并把下一次投递决策留在同一条留痕路径之内。

而计时在我们手里,不在浏览器手里。

考试场次自题目渲染之时开始,其截止时间按当时生效的时长盖在考位上。接收流程会将到达时间与该截止时间加一段永不公开的固定宽限相比较——页面倒数至零。

  • 开始时间只写一次。再次登录、清除 Cookie、刷新页面、无痕窗口——都不能让它重跑。它走墙上时钟,就像监考考场本来那样。
  • 三十人正在应考时缩短时长,不会缩短任何人的答卷;新时长只约束其后开始的场次。
  • 交卷铃响,答卷依然有效。 限时表单不再强制必填字段,所以第四十题空着也能提交——未声明的字段依旧被拒,让模式契约始终朝着保护你的方向成立。
  • 无论是否有内容到达,截止时间都会消耗考位,所以读一遍题目明天再回来是骗不过计时的。

一个收件箱,分发到你需要的每个地方。

在一个地方读取它们——并把同一条提交推送到你接好的每一个目的地。

签名 webhook

每条提交都以 POST 发到你的端点,附带由你校验的 HMAC 签名。六次尝试,退避从十秒拉长到两小时,每次都记录在该提交名下。从未成功过的端点会被停用,并向其所有者邮件告知最后的错误——死掉的 URL 不再永久重试,而你一定会知道。

正文内容由你选择:FormFlow 自己的签名 JSON,或为 Slack 频道阅读而写的消息。格式只决定正文,别无其他——签名、重试与退避两种情况下完全相同,而本身就是凭证的 URL 在保存后绝不再显示。

提交摘要

每周或每月一封邮件发给团队,覆盖所有表单——不是每条提交一封。如果收件箱和 webhook 已经够用,也可以关闭。机器人永远不会出现在其中。

CSV · XLSX · JSON export

从控制台导出整个收件箱。FormFlow 通过队列生成文件,并用邮件发送一小时后过期签名链接——表格文件可防公式注入。

提交者回执

给填表人的自动回复,发往你在表单上声明的邮箱字段。主题和正文由你决定;他们的答案只出现在你放置占位符的地方,并按纯文本转义,数据载荷绝不复制进邮件。选择退订的人保持退订,每个团队的上限也能约束突然走红的表单。付费套餐。

以上的一切都落在一个你可以动手处理的地方。

接入端点只要两分钟;这里才是你周一早上打开的部分。它先用一行回答一个问题——现在有什么需要我——每种真实成立的条件一行,附原因和处理它的唯一链接。没有需要对比的计数器:数字不是答案。在这之下,收件箱是一张表格,而不是仪表盘:筛出未读、滤掉机器人、选日期范围、精确导出筛选结果,并打开任意提交查看完整投递历史。

acme · dashboard 4 件事需要你
  • 接近配额 本周期已使用 2,540 / 3,000 条提交。 查看账单
  • contact-form 有提交正在被拒收。 打开表单
  • contact-form — webhook 故障 连续 3 次投递失败,最近一次在 4 分钟前。 打开表单
  • 23 条未读提交 打开收件箱
acme · submissions 含 3,000 条 · Starter
未读 垃圾邮件 8 月 1 日–31 日收到 导出 CSV · XLSX · JSON
Jane Okafor
Loved the demo — can we talk pricing this week?
0.02
dana@meridian.co
40 件的报价——从拒收中找回
已找回
  • webhookhttps://acme.dev/hooks/formflow已送达 · 第 2 次尝试
  • webhookhttps://crm.acme.dev/intake502 Bad Gateway · 5 分钟后重试
  • digest每周 · 3 位收件人排队中
buy-now-bot
🔥 crypto doubler, act now, limited spots
0.98

同一张表格支撑着扣留台账:原因、出错字段、以及告知提交者的原话——找回线索就是读懂它为何被挡下,然后点击“找回”。

再把它们逐条读出来。

同样的提交,通过 HTTP,用你在控制台铸造的令牌访问:收件箱、按 id 取单条提交、你的表单、拒收台账。游标分页且可筛选,夜间同步到自己的仓库或 CRM 时只请求变化的部分而非全部,并且永远不需要浏览器。

  • 结构上就是只读。令牌只会携带 submissions:readrefusals:readforms:read 的某种组合——没有任何写权限可授予,因为根本不存在。
  • 铸造时只显示一次,之后以哈希存储,可选有效期。FormFlow 无法再把它显示给你,能接触到数据库的人同样不能。
  • 独立的管理 API 每分钟配额,随套餐提升,并与表单接收提交的速率分开——繁忙的同步永远占不走真正线索所需的空间。
  • 付费套餐。Free 团队的令牌会得到 management_api_unavailable 而不是空列表,原因从来不是谜。
GET /api/v1/manage/submissions 示例
# 最新的在前,游标分页。
curl https://formflow.digital/api/v1/manage/submissions \
  -H "Authorization: Bearer ff_…"

{
  "data": [
    {
      "uuid": "9f1c8a2e…",
      "form_uuid": "3b7ed004…",
      "payload": {
        "email": "jane@acme.dev",
        "message": "Loved the demo"
      },
      "is_spam": false,
      "spam_score": 0.02,
      "created_at": "2026-08-15T09:14:22+00:00"
    }
  ],
  "meta": { "has_more": true, "next_cursor": "eyJpZCI6…" }
}

为真正送达的内容付费,不为机器人发的买单。

垃圾信息在计数前就被过滤。Free 含 100 条提交并设硬上限;付费套餐以透明超额继续计费,直到触及支出或安全上限。用量到一半、五分之四和全部时都会邮件提醒你——忙碌的月份是有人告诉你的事,而不是账单上的意外。

Free

$0 永久有效

你的第一个表单,两分钟接好。

100 条提交已包含

每 1,000 条超额单价
硬上限
每日上限
20
周期上限
100
提交数 / 分钟
60
已存文件
不包含
单张图片上限
不包含
托管表单页
不包含
多步表单
不包含
提交者收据
不包含
API 读取 / 分钟
不包含
免费开始

Starter Lite

$5.99 USD 每月

为小而稳定的表单准备的真实套餐。

1,100 条提交已包含

每 1,000 条超额单价
$7
每日上限
550
周期上限
16,500
提交数 / 分钟
150
已存文件
256 MB
单张图片上限
2 MB
托管表单页
包含
多步表单
包含
提交者收据
包含
API 读取 / 分钟
60
选择 Starter Lite

Pro

$29.99 USD 每月

更高用量,更大文件。

10,000 条提交已包含

每 1,000 条超额单价
$3
每日上限
5,000
周期上限
150,000
提交数 / 分钟
1,200
已存文件
10 GB
单张图片上限
25 MB
托管表单页
包含
多步表单
包含
提交者收据
包含
API 读取 / 分钟
300
选择 Pro
各套餐之间不同的每一项限额
Free Starter Lite Starter Pro
包含提交数 100 1,100 3,000 10,000
每 1,000 条超额单价 硬上限 $7 $5 $3
每日上限 20 550 1,500 5,000
周期上限 100 16,500 45,000 150,000
提交数 / 分钟 60 150 300 1,200
已存文件 不包含 256 MB 1 GB 10 GB
单张图片上限 不包含 2 MB 5 MB 25 MB
托管表单页 不包含 包含 包含 包含
多步表单 不包含 包含 包含 包含
提交者收据 不包含 包含 包含 包含
API 读取 / 分钟 不包含 60 120 300

每个套餐都包含,Free 也不例外: 任意数量的表单、每表单的垃圾信息模型及其训练、为供审核而保留的拒绝提交、实时渲染与浏览器救援、签名 webhook、摘要邮件,以及 CSV · XLSX · JSON 导出。

同样处处都有:所有者与成员角色及邮件邀请、可选的两步验证登录、任意表单的暂停开关、完整活动日志,以及符合 GDPR 的数据保留——邮箱地址与 IP 以键控哈希存储并按计划清除。Free 按自然月重置;付费套餐按账期重置。付费价格由 Paddle 按地区本地化显示,可能含税。请参阅退款政策

把你的第一个表单指向 FormFlow。

两分钟接好一个表单,看着收件箱填满。按团队计费,机器人永不占用配额。无需搭建后端,无需托管前端。