杂记 › 技术笔记 › 同一批投放链接为什么跑出两行数据?UTM 五个参数、大小写与一次百分号编码

同一批投放链接为什么跑出两行数据?UTM 五个参数、大小写与一次百分号编码

投放做到第二周,我开始怀疑报表里那些行。同一批物料只走一个邮件渠道,后台却把来源拆成两行,一行写 Newsletter,一行写 newsletter,两行加起来才对得上文档。另一件事更早埋下:运营发出去的链接里活动名带了一个空格,百分号编码之后整串字符比文档里的写法长出一截,谁也说不出该以哪一条为准。这两件都不是参数名记不住,我把那批链接逐条拆开对了一遍。

五个参数各自管一个维度

标准的五个键各回答一个问题:utm_source 是谁把流量送过来,utm_medium 走哪一类渠道,utm_campaign 属于哪一次活动,utm_term 是付费投放的哪个词,utm_content 是同一位置的哪版素材。维度之间是乘法关系,报表行数就是这么来的。

  • 来源 3 个、媒介 2 个、活动 4 个、素材 2 个,相乘是 48 条链接。
  • 素材位先不分、只算到活动那一层,是 24 条。
  • 同一个来源写成大小写两种,按大小写敏感聚合的口径下各算一行,48 条变成 96 行;这个口径看平台配置,不是所有分析工具都一样。
  • 取值里有中文时长度还会再变:5 个字符的 拼音 转换 编码后是 39 个字符。
  • 双十一 大促 是 6 个字符,UTF-8 占 16 字节,编码后 48 个字符,那个空格单独占 %20 这 3 个字符。

样例链接的构成,按字符数记一遍

下面几条是我文档里的样例,长度按 URL 字符串本身的字符数记;? 不属于任何一段,所以前两列相加不等于完整长度。

样例链接部分参数部分完整长度参数状态
落地页自带 from=push,补三个 utm4478123from 沿用原值,三个 utm 都是新增
旧链接已有 utm_source=weibo 等三条,活动名换成 nov-2026-beta4467112三条 utm 覆盖原值,id=88 沿用原值
落地页带锚点和中文查询词,补四个参数3498133原查询词沿用原值,四个新增,锚点仍在最后
落地页带端口 :8080,补三个参数4968118三条都是新增
同一条落地页补到四个参数,素材位写 banner-top4488133四条都是新增

换活动名那条最有用:同名参数只留一组,换成 nov-2026-beta 后链接里不会同时挂两组 utm_campaign,读到哪一组就轮不到我们决定;id、from 这类非 utm 参数原样带走。

48 条逐条手拼不现实,我想兜住的是命名口径。UTM链接生成器 把五个参数拆成格子填,来源和媒介用渠道预设一次填成同一个小写连字符名,自动做 percent-encoding,并逐条标出新增、覆盖原值、沿用原值;批量变体每行一个取值,同批链接可以逐行比对;拼接在浏览器本地完成,不上传。

编码膨胀的是长度,不是含义

utm_content=拼音 转换
utm_content=%E6%8B%BC%E9%9F%B3%20%E8%BD%AC%E6%8D%A2
框里写的值拼进链接的形式长度变化
拼音 转换%E6%8B%BC%E9%9F%B3%20%E8%BD%AC%E6%8D%A25 字符变 39 字符
双十一大促每字节展开成 3 个 %XX15 字节变 45 字符
双十一 大促%E5%8F%8C%E5%8D%81%E4%B8%80%20%E5%A4%A7%E4%BF%836 字符 16 字节变 48 字符
一个空格%203 字符

只把 utm_content 填成带空格的中文取值,整条链接是 96 个字符,参数部分 51:含义没动,字面长度却变了。

加号是另一个口径问题。加号只在表单编码(application/x-www-form-urlencoded)里表示空格,写在 URL 的路径或查询串里它就是字面加号;两种口径混用会出现加号变空格那类事故。我的规则是取值里不放空格,用减号分隔,写 banner-top 而不是 banner top。只想核对一段编码结果,用 URL编解码 就够。

顺序没改语义,但改了字符串

? 之后那串是键值集合,把 utm_campaign 写在 utm_source 前面,落进分析工具还是同一组键值:

?utm_source=weixin&utm_medium=social&utm_campaign=oct-2026-release&utm_content=banner-top
?utm_campaign=oct-2026-release&utm_content=banner-top&utm_source=weixin&utm_medium=social

但这是两条不同的 URL 字符串,按 URL 字符串去重的口径会把它们当成两条记录。我后来把顺序固定:落地页本身没参数时按 source、medium、campaign、term、content 排,已带参数的样例里被沿用或被覆盖的保持原位,新增的接在后面。

Q:utm_term 要不要填?

只在讲得出付费投放词的时候填。搜索引擎早就不给具体的自然搜索词,非付费渠道硬填 term 只是多一个没有对照的维度;我这批的 medium 是 email,term 那一格整个留空,那批样例链接里也都没有出现 utm_term。

Q:大小写谁来统一?

没有谁会替我们统一,值是我们自己写进去的。按大小写敏感聚合的口径下 Weibo 与 weibo 是两行,具体口径取决于平台配置;我按敏感那种情况准备,取值表里只留小写连字符名。

Q:锚点 # 和 ? 的先后呢?

按我那条带锚点的样例,#top 仍然排在最后,参数插在 ? 与 # 之间;锚点不进查询串,也不参与这批参数的区分。

Q:手工拼和生成的区别在哪?

手工拼留下的是这一次的正确,生成留下的是可核对的东西:五个键一次填齐、同名参数标清覆盖还是沿用、长度分开记。想弄清链接被切成哪几段、查询编码在哪一步发生,URL 的分段与查询编码 讲得比我这里细。

回到开头那两行。来源被拆开,不是谁写错了参数名,而是同一个值有两种字面写法,报表按字面把它们分开了;带空格的活动名和文档对不上,也不是编码出了错,它本来就该比原文长。我的取舍是:命名表先定,全小写、减号分隔、同一活动全渠道同名比如 oct-2026-release,编码留到最后一步统一做,参数顺序固定成一套。这样 48 条链接分给几个人发出去,报表里也该只有该出现的行;真变成 96 行,我知道先查哪一格混了大小写,而不是怀疑统计。

📎 相关文章

sin(π) 算出 0.0548 而不是 0:角度制、弧度制和计算器的优先级 2026-10-21 JWT 那三段字符串里到底写了什么?header、payload 与 exp 的真实读法 2026-10-21 网址里哪一段会到服务器?六段拆分与 %20、+、二次编码 2026-10-19 身份证最后一位为什么是 X?前 17 位加权取模算出的校验位 2026-10-19 子网掩码写成 /22 能带多少台设备?主机位、网络地址与广播地址 2026-10-19