实时访客监测
最近 5 分钟活跃 UV 一目了然,包含当前所在页面、进入来源、所在地域与停留进度,新访客一眼识别。
- 在线人数秒级刷新
- 当前受访页面排行
- 实时事件流水
一行 JS · 30 秒接入 · 数据可私有化
自动采集 PV、UV、会话与来源渠道,结合无埋点点击与自定义事件,实时还原用户在你站点上的每一步行为。零依赖、可自建、口径透明,核心看板开箱即用。
以上指标为产品界面示例数据,用于展示统计后台的呈现效果。
从实时访客到长期趋势,四张核心看板覆盖运营日常要盯的全部指标。
最近 5 分钟活跃 UV 一目了然,包含当前所在页面、进入来源、所在地域与停留进度,新访客一眼识别。
按会话首次触点归因:直接访问、自然搜索、社交媒体、外部引荐与 UTM 投放,SDK 自动解析来源与媒介。
PV、UV、入口页、退出页与平均停留时长逐页呈现,识别真正留住用户的内容与需要优化的页面。
设备类型、浏览器、操作系统、分辨率、语言与时区全量采集,新访客与回头客分布清晰可见。
采集、上报、存储、分析解耦设计,既能立刻看数据,也能完全掌控数据。
引入一个 JS 文件并完成 init,自动开始采集页面浏览、路由切换与站外链接点击,无需改一行业务代码。
页面浏览全量计数,访客匿名 UUID 去重,会话按 30 分钟无操作自动切分,指标口径公开可核对。
给按钮加一个 data-track 就完成点击采集;复杂业务可用 track() 携带动态属性,后台自行聚合。
登录成功后调用 setUser 绑定业务用户 ID,后续所有事件自动带上该身份,可回溯完整行为轨迹。
本地队列批量防抖上报,失败自动塞回队首重试;页面卸载用 sendBeacon 兜底,离线数据不丢失。
配置 endpoint 即可上报到自有后端入库,也支持自定义 transport 加签转发,数据不出自己的机房。
复制代码片段粘贴到你的页面,刷新后即可在后台看到第一条 PV。
<!-- 第 1 步:引入 SDK -->
<script src="https://cdn.yourdomain.com/sdk/tracker.js"></script>
<!-- 第 2 步:初始化 -->
<script>
WebStats.init({
appId: 'my-site', // 给你的站点起个名字
endpoint: 'https://api.yourdomain.com/collect' // 后端上报地址
});
</script>
<!-- 第 3 步:给关心的按钮加埋点(可选) -->
<button data-track data-track-name="加入购物车" data-track-goods="机械键盘">加入购物车</button>
// main.js —— 在路由初始化之前加载 SDK
WebStats.init({
appId: 'vue-app',
endpoint: 'https://api.example.com/collect'
});
createApp(App).use(router).mount('#app');
// 组件内埋点
const addToCart = (product) => {
WebStats.track('add_to_cart', { goods: product.name, price: product.price });
};
// index.js
WebStats.init({
appId: 'react-app',
endpoint: 'https://api.example.com/collect'
});
createRoot(document.getElementById('root')).render(<BrowserRouter><App /></BrowserRouter>);
// 组件内埋点
function ProductCard(props) {
const handleAddCart = () => {
WebStats.track('add_to_cart', { goods: props.product.name, price: props.product.price });
};
return <button onClick={handleAddCart}>加入购物车</button>;
}
// Node.js / Express 最小实现:收数据 + 入库即可
app.use(express.json({ limit: '1mb' }));
app.post('/collect', (req, res) => {
const eventBody = req.body;
const appId = eventBody.appId;
const events = eventBody.events;
if (!Array.isArray(events)) return res.status(400).json({ error: 'events must be array' });
events.forEach(e => {
db.query(
'INSERT INTO events (eid, app_id, type, name, props, uid, sid, ts) VALUES ($1,$2,$3,$4,$5,$6,$7,$8)',
[e.eid, appId, e.type, e.name, JSON.stringify(e.props), e.uid, e.sid, new Date(e.ts)]
);
});
// 返回 2xx 即视为上报成功,非 2xx SDK 会自动重试
res.json({ ok: true, received: events.length });
});
上报优先级:自定义 transport > endpoint(标准 HTTP) > 本地 localStorage(演示模式)。
简单点击走属性,复杂行为走 API,其余交给 SDK 自动采集。
| 方式 | 适用场景 | 你要做的事 | 成本 |
|---|---|---|---|
| 自动采集 | 页面浏览、hash / history 路由切换、前进后退、站外链接点击 | 什么都不用做 | 零成本 |
| data-track 无埋点 | 按钮 / 链接点击,属性值是固定字符串 | 在元素上加 data-track、data-track-name、data-track-* | 改 HTML |
| WebStats.track() | 需要动态数据(商品 ID、订单金额)或非点击行为(表单提交、AJAX 回调、滚动、定时器) | 在 JS 中调用 track(事件名, 属性对象) | 写少量 JS |
不玩文字游戏,每个数字怎么算出来的,都写在下面。
时间范围内 page_view 事件条数;同一访客刷新或重复进入会重复计数。
时间范围内不同 uid 的数量;匿名标识存于本地,清缓存或无痕浏览会被视为新访客。
不同 sid 的数量;30 分钟无操作或关闭浏览器后再访问即新会话。
click 与 custom 事件条数之和,不含页面浏览事件。
PV ÷ UV,衡量内容粘性与站内流转效率。
会话结束时间减开始时间的均值,心跳 5 秒并在页面卸载时更新。
会话内 PV 恰好为 1 的会话占比。
最近 5 分钟产生过事件的去重 UV。
不贩卖概念,只解决“数据看不到”和“数据在别人手里”两件事。
原生 JavaScript 编写,无第三方库、无需构建工具,异步加载不阻塞渲染,点击采集采用单个委托监听。
事件先进本地队列,批量上报并做失败重试;从调试切换到生产只改一个 endpoint 参数。
默认生成匿名 UUID,不含任何个人信息;不调用 init 即完全不采集,便于通过隐私合规审查。
自定义 transport 可加签名、走网关或转发第三方分析平台;服务端可补 IP 归属地、反爬过滤与频控。
SDK 为单文件零依赖,建议异步引入。点击采集使用单个捕获阶段事件委托,心跳 5 秒一次,上报走本地队列批量发送,对首屏几乎无影响。
不需要。SDK 已内置 history.pushState / replaceState 的 hook,并监听 hashchange 与 popstate,路由切换会自动产生 PV。
默认使用本地存储的匿名 UUID 作为访客标识。生产环境可配合 Cookie 与服务端指纹兜底;对登录用户调用 setUser 绑定会员 ID,即可跨设备打通行为轨迹。
可以。不配置上报地址时数据只写本地,便于调试;配置 endpoint 后 SDK 通过 sendBeacon 或 fetch 批量 POST 到你自己的 /collect 接口,后端入库即可。
纯前端无法获取真实 IP 归属地,需要在服务端根据上报 IP 做 GeoIP 解析,这也是推荐自建上报接口的原因之一。
初始化时传入 debug: true,控制台会打印每条上报事件;也可在 DevTools 的 Network 面板搜索上报地址,查看请求体中的 events 数组。
网站统计控制台正在紧张开发中。上线后,以上能力将全部开放,接入方式不变,数据可无缝迁移。