在开始编写代码之前,必须先定义清楚我们要监控哪些核心行为。对于线索转化,通常需要关注三个关键节点:页面曝光(PV)、咨询按钮点击、表单提交成功。我们需要设计一套通用的数据结构来承载这些信息。
我们需要定义三个事件类型,用于区分用户的不同行为阶段:
为了保证后端能统一处理,前端上报的数据必须包含以下通用字段。我们将采用 JSON 格式进行传输:
前端的核心任务是拦截用户行为并组装数据。为了保证数据不丢失,我们将使用 navigator.sendBeacon API,它支持在页面关闭时也能异步发送数据,且不阻塞页面跳转。
在项目中创建一个 tracker.js 文件。这个文件将负责生成设备 ID 和发送请求。请直接复制以下代码:
```javascript // tracker.js const TRACK_SERVER_URL = 'http://localhost:3000/api/track'; // 生成或获取设备 ID function getDeviceId() { let deviceId = localStorage.getItem('tracker_device_id'); if (!deviceId) { deviceId = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) { var r = Math.random() 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8); return v.toString(16); }); localStorage.setItem('tracker_device_id', deviceId); } return deviceId; } // 核心上报函数 function track(eventId, properties = {}) { const payload = { event_id: eventId, device_id: getDeviceId(), timestamp: Date.now(), page_url: window.location.href, properties: properties }; // 使用 sendBeacon 确保数据可靠性 const blob = new Blob([JSON.stringify(payload)], { type: 'application/json' }); navigator.sendBeacon(TRACK_SERVER_URL, blob); } // 导出供业务使用 window.Tracker = { track }; ```在业务页面的 HTML 中引入上述 JS,并进行具体的埋点操作。以下是完整的 HTML 示例,展示了如何监控页面加载、按钮点击和表单提交:
```html后端我们使用 Node.js 搭建一个轻量级的接收服务。你需要确保本地已安装 Node.js 环境。我们将使用 Express 框架处理请求,并使用 mysql2 库将数据直接写入数据库。
新建一个文件夹 track-server,在终端执行以下命令初始化项目并安装依赖:

npm init -y
npm install express cors body-parser mysql2
在项目根目录创建 server.js。这个文件将创建 API 接口,解析前端发来的 JSON 数据,并将其插入 MySQL 数据库。请确保数据库配置信息与你本地的一致。
```javascript // server.js const express = require('express'); const cors = require('cors'); const bodyParser = require('body-parser'); const mysql = require('mysql2'); const app = express(); const PORT = 3000; // 配置数据库连接 const db = mysql.createConnection({ host: 'localhost', user: 'root', // 请替换为你的数据库用户名 password: 'password', // 请替换为你的数据库密码 database: 'tracking_db' }); // 连接数据库 db.connect(err => { if (err) { console.error('数据库连接失败:', err); return; } console.log('数据库连接成功'); initDb(); // 启动时初始化表 }); // 初始化数据表 function initDb() { const createTableSql = ` CREATE TABLE IF NOT EXISTS events ( \`id\` INT AUTO_INCREMENT PRIMARY KEY, \`event_id\` VARCHAR(50) NOT NULL, \`device_id\` VARCHAR(100) NOT NULL, \`page_url\` TEXT, \`properties\` JSON, \`timestamp\` BIGINT, \`created_at\` TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4; `; db.query(createTableSql, (err, result) => { if (err) throw err; console.log('数据表检查完成'); }); } // 中间件配置 app.use(cors()); // 允许跨域 app.use(bodyParser.json()); // 核心接收接口 app.post('/api/track', (req, res) => { const { event_id, device_id, page_url, properties, timestamp } = req.body; if (!event_id || !device_id) { return res.status(400).json({ error: '缺少必要参数' }); } const sql = ` INSERT INTO events (event_id, device_id, page_url, properties, timestamp) VALUES (?, ?, ?, ?, ?) `; db.query(sql, [event_id, device_id, page_url, JSON.stringify(properties), timestamp], (err, result) => { if (err) { console.error('数据插入失败:', err); return res.status(500).json({ error: '服务器内部错误' }); } // 返回 200 OK,sendBeacon 不需要处理响应体 res.status(200).json({ success: true }); }); }); app.listen(PORT, () => { console.log(`监控服务运行在 http://localhost:${PORT}`); }); ```保存文件后,在终端执行 node server.js 启动服务。此时,前端页面的埋点数据将开始源源不断地写入 MySQL 数据库。
数据入库后,最后一步是计算转化率。我们需要分析从“曝光”到“点击”再到“提交”的漏斗模型。
我们在上一步的代码中已经自动创建了 events 表。其中 properties 字段被定义为 JSON 类型,这使得我们可以直接在 SQL 中查询表单内的具体字段(如手机号),极大地方便了后续的数据清洗。
以下 SQL 语句展示了如何统计某一天内的全链路转化数据。它会计算每个步骤的独立用户数(UV),以及每一步的转化率。你可以直接在 Navicat 或命令行中运行此 SQL:
```sql SELECT -- 统计页面曝光人数 (步骤1) (SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'view_page' AND DATE(created_at) = CURDATE()) AS step1_pv_uv, -- 统计咨询按钮点击人数 (步骤2) (SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'click_contact' AND DATE(created_at) = CURDATE()) AS step2_click_uv, -- 统计表单提交人数 (步骤3) (SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'submit_form' AND DATE(created_at) = CURDATE()) AS step3_submit_uv, -- 计算点击转化率 (步骤2 / 步骤1) ROUND( (SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'click_contact' AND DATE(created_at) = CURDATE()) 100.0 / NULLIF((SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'view_page' AND DATE(created_at) = CURDATE()), 0), 2) AS click_rate_percent, -- 计算表单转化率 (步骤3 / 步骤2) ROUND( (SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'submit_form' AND DATE(created_at) = CURDATE()) 100.0 / NULLIF((SELECT COUNT(DISTINCT device_id) FROM events WHERE event_id = 'click_contact' AND DATE(created_at) = CURDATE()), 0), 2) AS submit_rate_percent; ```如果发现转化率异常低,你可以通过以下 SQL 查询“只看了页面但没有任何点击”的设备 ID,定位流失用户:
```sql SELECT device_id, page_url, timestamp FROM events WHERE event_id = 'view_page' AND DATE(created_at) = CURDATE() AND device_id NOT IN ( SELECT DISTINCT device_id FROM events WHERE event_id = 'click_contact' AND DATE(created_at) = CURDATE() ); ```通过以上步骤,你已经完成了一套从前端采集、后端存储到数据分析的完整线索转化监控系统。这套系统无需依赖第三方昂贵的 SAAS 平台,代码完全可控,且能够精确到每一个用户的点击行为。
上一篇: 线索转化技巧:别让到手的客户悄悄溜走
下一篇: 高转化率线索运营体系搭建与效能优化实战
易频IT社区是综合性互联网IT技术门户网站,专注分享网络技术、服务器运维、网络安全、编程开发、系统架构、云计算、大数据等行业干货,实时更新IT行业资讯、零基础教程、实战案例,为IT从业者、技术爱好者提供专业的学习交流平台。
Copyright © 2021-2026 易频IT社区. All Rights Reserved. 备案号:闽ICP备2023013482号 网站地图