询价表单一般是这么长出来的:销售说要问数量,运营说要问预算,老板说要问公司名,两年下来变成十一项必填。结果提交变少了,内容也没好到哪去——邮箱是真的,数量和公司名是随手填的。
字段数的答案不在「几个」上,在「哪些字段会改变你下一封邮件」上。下面给一张能按行业直接套的表,再把每个字段单独过一遍。
拿一个字段问自己:买家填 A 和填 B,我回他的第一封邮件会不一样吗?
会。比如型号不同,报价单完全不同,那它就该必填。不会。比如他填不填公司名,你的回信都是「这个型号 100 件的价格是……请确认交期」,那它就选填或者删掉。
这条判据能砍掉大部分表单里的装饰性字段。它也能解释为什么「姓名」在 B2B 询价表单里没什么用:你回信开头写「Hi」就够了。
你卖的东西 | 必填 | 选填 | 可以不问 |
|---|---|---|---|
标准品,型号在页面上能定位 | 邮箱、型号(页面带进来,可改)、数量、收货国家/地区 | 公司、电话、期望交期 | 预算、长段描述 |
定制件,按图或按样品加工 | 邮箱、用途或工况一句话、图纸附件 | 数量、公司、电话 | 预算 |
整机、项目型,要选配置 | 邮箱、应用场景、项目所在地 | 预算区间、希望到货时间 | 公司规模、职位 |
样品、小批量试单 | 邮箱、数量、收货国家 | 型号、公司 | 电话、预算 |
本地服务(安装、维修、上门) | 手机号或邮箱(二选一)、地址或邮编、要做的事 | 期望时间 | 公司名、数量 |
左边一列找不到自己,就退回上面那条判据,别硬套。
邮箱是唯一值得无条件必填的字段,它是你唯一能主动触达的通道。输入框写 type="email"、autocomplete="email"、inputmode="email",手机上会直接弹对键盘。
电话只有在成交路径一定要打电话时才必填:本地上门服务、大件物流、时差大到邮件来回要一天的市场。其他情况选填,旁边写一句为什么需要(「交期紧的时候我们会直接打给你」),愿意留的人反而多。
公司名在首轮必填有两个副作用:用个人邮箱的小买家会被挡在门外;另一批人会随手填一个看着像样的词,你的客户表里从此多了一堆假公司。选填,等他回第二封邮件再问。
姓名可以删。真要称呼,用一个「怎么称呼你」的选填框,比「姓」「名」两个必填框友好。
数量必填的前提是价格随数量变。如果 1 件和 1000 件一个价,问它只是给自己添活。数量旁边给单位下拉(件、箱、托、米、公斤),别让买家猜你按什么算。
预算在首轮基本问不到真话,而且容易让人直接关页面。改成「期望价位段」下拉,选项里留一个还没定:
<label for="budget">期望价位段</label>
<select id="budget" name="budget">
<option value="">不便透露</option>
<option value="lt-1k">1k 以内</option>
<option value="1k-5k">1k - 5k</option>
<option value="5k-20k">5k - 20k</option>
<option value="gt-20k">20k 以上</option>
<option value="tbd">还没定,想先听建议</option>
</select>区间比精确数字好用:他愿意点一下,你也能据此决定要不要推高配方案。
国家/地区在运费、电压、认证、插头标准跟地区挂钩时必须问,并且用下拉,不要给文本框——USA、US、America 在三张表里是三个国家。
详细描述放最后一个,选填。提示语要具体:「写清型号、用在什么设备上、目标价和交期,我们回得更准」,比一句「请输入您的问题」有用得多。
从产品页点「询价」进到表单,型号自动填上是转化效果最好的一步。但带进来的值必须是可编辑的输入框,不能是隐藏字段——买家往往想问的是同系列另一个型号。
<label for="model">要询价的型号</label>
<input id="model" name="model" type="text" maxlength="64" autocomplete="off">
<input type="hidden" name="model_source" value="manual">
<script>
const params = new URLSearchParams(location.search);
const fromUrl = (params.get('model') || '').slice(0, 64);
if (fromUrl) {
document.getElementById('model').value = fromUrl;
document.querySelector('input[name="model_source"]').value = 'product-page';
}
</script>服务端把 model 当普通用户输入处理:长度截断、字符白名单、不接受 HTML。同时把 model_source 一起存下来,报价时你就知道这个型号是页面带进来的原样值,还是买家改过的。
字段超过八到十个、又确实都要问,再考虑分步。第一步只放邮箱加一个选择题(要报价、要样品、还是要技术支持),第二步再问细节。
分步的代价是把弃填从第一步挪到了第二步。所以每一步都要单独埋点:第一步展示数、第一步提交数、第二步提交数。只看总提交量,你分不清是第一步太长还是第二步太长。
条件字段的坑更具体:被隐藏的必填字段,浏览器还会校验它。表现是买家什么都没看到,点提交却提示「请填写期望交期」。
<div id="lead-time-wrap" hidden>
<label for="lead_time">期望交期</label>
<input id="lead_time" name="lead_time" type="text" disabled>
</div>const qty = document.getElementById('qty');
const wrap = document.getElementById('lead-time-wrap');
const leadTime = document.getElementById('lead_time');
qty.addEventListener('change', () => {
const show = Number(qty.value) >= 1000;
wrap.hidden = !show;
leadTime.disabled = !show; // disabled 的字段既不参与校验也不提交
});服务端还要按可见逻辑再校验一遍,别信前端传来的空值就是没填。买家绕过 JS 直接 POST 的情况一直存在。
移动端和无障碍上顺手能做的:
aria-describedby 跟输入框关联,不要只把边框变红。图纸、照片、样品清单这类附件,收得方便和存得安全是两件事。
$finfo = new finfo(FILEINFO_MIME_TYPE);
$mime = $finfo->file($_FILES['drawing']['tmp_name']);
$allowed = [
'application/pdf' => 'pdf',
'image/jpeg' => 'jpg',
'image/png' => 'png',
];
if (!isset($allowed[$mime])) {
// 拒绝,并记一条日志
}必须做的几件事:
Content-Type,也不只看扩展名。用免费邮箱域名直接拒收,会挡掉一批真实的个体买家和小贸易商——他们就是这个行业的常态。同行询盘也一样,靠域名黑名单识别不出来,误伤的代价更大。
改成打分进待审队列,规则可以是:
分数过了阈值就进待审,人工看一眼再决定回不回。正常买家在人工审核期间照样收到自动回执。
蜜罐字段的做法:
<div class="hp" aria-hidden="true">
<label for="website">Website</label>
<input id="website" name="website" type="text" tabindex="-1" autocomplete="off">
</div>
<style>
.hp { position: absolute; left: -9999px; }
</style>用 CSS 挪出视口而不是 display:none——一部分机器人会跳过 display:none 的字段。另外在页面里记一个加载时间戳随表单一起提交,服务端算一下耗时。
字段数量本身不是目标。能让销售在第一封邮件里把价格和交期说清楚,同时让买家不用填一堆他自己也不知道答案的框,找到这个点就够了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。