投放做到第二周,我开始怀疑报表里那些行。同一批物料只走一个邮件渠道,后台却把来源拆成两行,一行写 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,补三个 utm | 44 | 78 | 123 | from 沿用原值,三个 utm 都是新增 |
旧链接已有 utm_source=weibo 等三条,活动名换成 nov-2026-beta | 44 | 67 | 112 | 三条 utm 覆盖原值,id=88 沿用原值 |
| 落地页带锚点和中文查询词,补四个参数 | 34 | 98 | 133 | 原查询词沿用原值,四个新增,锚点仍在最后 |
落地页带端口 :8080,补三个参数 | 49 | 68 | 118 | 三条都是新增 |
同一条落地页补到四个参数,素材位写 banner-top | 44 | 88 | 133 | 四条都是新增 |
换活动名那条最有用:同名参数只留一组,换成 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%A2 | 5 字符变 39 字符 |
双十一大促 | 每字节展开成 3 个 %XX | 15 字节变 45 字符 |
双十一 大促 | %E5%8F%8C%E5%8D%81%E4%B8%80%20%E5%A4%A7%E4%BF%83 | 6 字符 16 字节变 48 字符 |
| 一个空格 | %20 | 3 字符 |
只把 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 行,我知道先查哪一格混了大小写,而不是怀疑统计。