精细化用户运营是跨境独立站、反向海淘平台提升复购率的核心抓手,而用户行为统计看板是运营分层运营的数据底座。我在完善 Taocarts 后台用户概况统计页面时发现,早期版本仅能统计累计用户总数,缺失访客流量、浏览量、新增用户、成交用户、地域分布、性别占比等核心分析维度,运营完全无法区分新老用户消费潜力,无法精准投放优惠券、定向营销活动。结合截图中用户趋势折线图、地域 TOP 表格、性别环形饼图的落地过程,本文完整分享跨境电商平台用户行为统计模块前后端开发流程,包含用户时序埋点聚合、地域数据分组、饼图环形可视化、环比增长率计算逻辑,附带完整可复用业务代码,解决绝大多数代购源码用户统计功能简陋、无分层分析能力的痛点。
先梳理跨境独立站用户统计的专属业务需求,和国内电商系统存在明显区别:
第一,用户地域无法精准识别国内省市,大量海外用户属地标记为 "未知",统计逻辑需要兼容未知地域分组;
第二,用户访问流量分散全球,访客、浏览量数据需要独立时序存储,不能和订单数据混合统计;
第三,需要区分订单成交用户、运单成交用户两类转化群体,分别统计环比增长;
第四,性别数据存在大量未知字段,饼图渲染时需要做占比加权处理,避免未知用户数据挤占可视化图表;
第五,环比增长率计算需要自动获取上一同期周期数据,减少运营手动切换日期对比的操作成本。
整套模块分为三层实现:前端用户行为埋点上报、后端定时聚合时序用户数据、后台可视化统计看板。前端页面加载、商品点击、下单操作时自动上报埋点数据存入日志表,每日凌晨定时任务汇总当日访客数、浏览量、新增注册用户、成交用户数据,写入用户时序统计表;后台接口根据起止日期读取预聚合数据,自动计算环比增减比例,同时按用户注册属地分组统计 TOP 地域数据,分别返回折线图、表格、饼图所需结构化数据。
后端用户统计环比、地域分组核心代码
typescript
// src/modules/statistics/service/user-stat.service.ts
import { Injectable } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository, Between } from 'typeorm';
import { UserStatDaily } from 'src/modules/statistics/entities/user-stat-daily.entity';
import { User } from 'src/modules/user/entities/user.entity';
@Injectable()
export class UserStatService {
constructor(
@InjectRepository(UserStatDaily) private userStatRepo: Repository<UserStatDaily>,
@InjectRepository(User) private userRepo: Repository<User>
) {}
// 计算周期用户汇总+环比增长率
async getUserOverview(start: Date, end: Date) {
// 当前周期聚合数据
const currStat = await this.userStatRepo
.createQueryBuilder('stat')
.select('SUM(stat.visitNum)', 'totalVisit')
.addSelect('SUM(stat.viewNum)', 'totalView')
.addSelect('SUM(stat.newUser)', 'totalNewUser')
.addSelect('SUM(stat.orderPayUser)', 'orderPayUser')
.addSelect('SUM(stat.transPayUser)', 'transPayUser')
.where('stat.statDate BETWEEN :start AND :end', { start, end })
.getRawOne();
// 计算同期上一周期,用于环比计算
const dayDiff = Math.ceil((end.getTime() - start.getTime()) / (1000 * 3600 * 24));
const lastStart = new Date(start.getTime() - dayDiff * 24 * 3600 * 1000);
const lastEnd = new Date(end.getTime() - dayDiff * 24 * 3600 * 1000);
const lastStat = await this.userStatRepo
.createQueryBuilder('stat')
.select('SUM(stat.newUser)', 'lastNewUser')
.addSelect('SUM(stat.orderPayUser)', 'lastOrderUser')
.addSelect('SUM(stat.transPayUser)', 'lastTransUser')
.where('stat.statDate BETWEEN :lStart AND :lEnd', { lStart: lastStart, lEnd: lastEnd })
.getRawOne();
// 环比增长率计算,避免除0报错
const calcRate = (curr: number, last: number) => {
if(last === 0) return curr > 0 ? '-100.00' : '0.00';
return (((curr - last) / last) * 100).toFixed(2);
}
const totalUser = await this.userRepo.count();
return {
totalUser,
visitNum: Number(currStat.totalVisit || 0),
viewNum: Number(currStat.totalView || 0),
newUser: Number(currStat.totalNewUser || 0),
orderPayUser: Number(currStat.orderPayUser || 0),
transPayUser: Number(currStat.transPayUser || 0),
rateNewUser: calcRate(Number(currStat.totalNewUser || 0), Number(lastStat.lastNewUser || 0)),
rateOrderUser: calcRate(Number(currStat.orderPayUser || 0), Number(lastStat.lastOrderUser || 0)),
rateTransUser: calcRate(Number(currStat.transPayUser || 0), Number(lastStat.lastTransUser || 0))
}
}
// 用户地域TOP数据统计
async getUserAreaTop(start: Date, end: Date) {
return this.userRepo
.createQueryBuilder('user')
.select('IFNULL(user.province, "未知")', 'areaName')
.addSelect('COUNT(user.id)', 'totalUser')
.addSelect("SUM(CASE WHEN user.createTime BETWEEN :start AND :end THEN 1 ELSE 0 END)", 'newUser')
.groupBy('areaName')
.orderBy('totalUser', 'DESC')
.setParameters({ start, end })
.getRawMany();
}
}
前端可视化分为三块:顶部指标卡片展示全部汇总数据并标注环比增减;中间多指标折线图展示每日访客、新增用户、成交用户波动;下方左侧地域分布表格、右侧环形饼图展示用户性别占比。饼图自动合并占比过小的类目,优化可视化展示效果,适配海外用户性别数据大量未知的业务场景。
ECharts 环形饼图渲染代码
typescript
const renderGenderPie = (userList) => {
const genderMap = { man: 0, woman: 0, unknown: 0 };
userList.forEach(item => {
if(item.gender === 1) genderMap.man += 1;
else if(item.gender === 2) genderMap.woman += 1;
else genderMap.unknown += 1;
})
pieChart.setOption({
tooltip: { trigger: 'item' },
series: [{
type: 'pie',
radius: ['40%', '70%'],
avoidLabelOverlap: false,
label: { show: true, position: 'outside' },
data: [
{ name: '男', value: genderMap.man },
{ name: '女', value: genderMap.woman },
{ name: '未知', value: genderMap.unknown }
]
}]
})
}
这套用户统计模块上线后,运营可以精准定位高转化用户地域、分析新老用户成交占比,针对性开展定向营销活动,大幅提升反向海淘跨境独立站的用户复购。市面上绝大多数代购源码仅提供简单用户列表,缺失完整行为统计与可视化分析能力,这套全栈开发方案可以直接嵌入淘宝 1688 代购系统、跨境转运平台二次开发,完整支撑精细化用户运营的数据需求。