<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
        <title>S2S - 标签 - Zack 的 Media Buy 笔记</title>
        <link>https://sopaa.cn/tags/s2s/</link>
        <description>S2S - 标签 - Zack 的 Media Buy 笔记</description>
        <generator>Hugo -- gohugo.io</generator><language>zh-cn</language><managingEditor>Webmaster@sopaa.com (Zack)</managingEditor>
            <webMaster>Webmaster@sopaa.com (Zack)</webMaster><lastBuildDate>Fri, 06 Nov 2026 09:20:00 &#43;0800</lastBuildDate><atom:link href="https://sopaa.cn/tags/s2s/" rel="self" type="application/rss+xml" /><item>
    <title>Postback 与 S2S 转化回传：从原理到四条排错路径</title>
    <link>https://sopaa.cn/postback/</link>
    <pubDate>Fri, 06 Nov 2026 09:20:00 &#43;0800</pubDate><author>
                        <name>Zack</name><uri>https://sopaa.cn/authors/zack</uri></author><guid>https://sopaa.cn/postback/</guid>
    <description><![CDATA[<div class="featured-image">
                <img src="/postback/cover.jpg" referrerpolicy="no-referrer">
            </div><h2 id="先看一个真实场景" class="headerLink">
    <a href="#%e5%85%88%e7%9c%8b%e4%b8%80%e4%b8%aa%e7%9c%9f%e5%ae%9e%e5%9c%ba%e6%99%af" class="header-mark"></a>先看一个真实场景</h2><p>Campaign 跑了 6 小时，流量平台后台显示 18,000 次点击，Tracker 只认到 15,200 次，联盟后台显示 23 个转化，Tracker 里只躺着 11 个。</p>
<p>三个数字，三套口径。这时候如果你没有把回传链路理清楚，所有优化动作都是猜——你不知道是该关 Campaign、换 Offer，还是该去修配置。</p>
<p>Media Buy 里<strong>大部分&quot;数据不准&quot;不是流量质量问题，是回传链路的问题</strong>。这篇把这条链路从头拆一遍。</p>
<hr>
<h2 id="一转化回传到底在传什么" class="headerLink">
    <a href="#%e4%b8%80%e8%bd%ac%e5%8c%96%e5%9b%9e%e4%bc%a0%e5%88%b0%e5%ba%95%e5%9c%a8%e4%bc%a0%e4%bb%80%e4%b9%88" class="header-mark"></a>一、转化回传到底在传什么</h2><p>一次投放的数据流其实有两条独立的链路，很多人会混成一条：</p>
<table>
<thead>
<tr>
<th>链路</th>
<th>方向</th>
<th>传的东西</th>
<th>谁负责</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>点击链路</strong></td>
<td>流量平台 → Tracker → Offer</td>
<td>click_id、来源、GEO、设备</td>
<td>Tracker 的 Campaign URL</td>
</tr>
<tr>
<td><strong>转化链路</strong></td>
<td>Offer / 联盟 → Tracker → 流量平台</td>
<td>哪个 click_id 转化了、payout 多少、什么状态</td>
<td><strong>Postback</strong></td>
</tr>
</tbody>
</table>
<p>点击链路是&quot;把人送过去&quot;，转化链路是&quot;把人送回来&quot;。你花钱买的是点击，但<strong>只有转化链路通了，你才知道哪一次点击赚了钱</strong>。</p>
<p>回传一断，剧本就变成：流量平台只知道有人点了，不知道有没有转化，它的自动出价算法学不到任何东西，只会把钱越烧越平均。</p>
<hr>
<h2 id="二三种回传实现以及它们各自会在哪出错" class="headerLink">
    <a href="#%e4%ba%8c%e4%b8%89%e7%a7%8d%e5%9b%9e%e4%bc%a0%e5%ae%9e%e7%8e%b0%e4%bb%a5%e5%8f%8a%e5%ae%83%e4%bb%ac%e5%90%84%e8%87%aa%e4%bc%9a%e5%9c%a8%e5%93%aa%e5%87%ba%e9%94%99" class="header-mark"></a>二、三种回传实现，以及它们各自会在哪出错</h2><h3 id="1-像素回传image-pixel--iframe" class="headerLink">
    <a href="#1-%e5%83%8f%e7%b4%a0%e5%9b%9e%e4%bc%a0image-pixel--iframe" class="header-mark"></a>1. 像素回传（Image Pixel / iframe）</h3><p>联盟平台给你一个像素 URL，你把它贴在 Offer 的 thank-you page 或者 Tracker 的转化页上，浏览器加载这张 1×1 图的时候顺便把参数带回去。</p>
<ul>
<li><strong>优点</strong>：配置最简单，不用服务器</li>
<li><strong>缺点</strong>：<strong>依赖浏览器</strong>。用户点了转化但立刻关页面、装了拦截插件、或者这是纯服务端的转化（比如 PIN Submit 的二次确认），像素就不会触发</li>
<li><strong>典型丢单场景</strong>：移动端弱网、页面加载被用户中断、跨域问题</li>
</ul>
<h3 id="2-s2s-postbackserver-to-server" class="headerLink">
    <a href="#2-s2s-postbackserver-to-server" class="header-mark"></a>2. S2S Postback（Server-to-Server）</h3><p>联盟的服务器在转化发生时，直接向你的 Tracker 发一个 HTTP 请求：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">https://tracker.example.com/pb?cid={click_id}&amp;payout={payout}&amp;status={status}&amp;txid={txid}
</span></span></code></pre></td></tr></table>
</div>
</div><ul>
<li><strong>优点</strong>：不依赖浏览器，转化发生在哪都能回传；可以带 <code>status</code>（pending / approved / rejected）</li>
<li><strong>缺点</strong>：需要你的 Tracker 有公网地址、能接收请求；参数名要和联盟的 macro 对上</li>
</ul>
<p><strong>这是我推荐的唯一方式</strong>。你不可能靠一张 1×1 像素图去追一个需要审核 30 天的 CPS 单。</p>
<h3 id="3-api-拉取pull" class="headerLink">
    <a href="#3-api-%e6%8b%89%e5%8f%96pull" class="header-mark"></a>3. API 拉取（Pull）</h3><p>部分联盟提供 Conversion API，让你定时去拉转化报表，再用 <code>txid</code> 匹配回 Tracker。</p>
<ul>
<li><strong>优点</strong>：绕开回传丢失，数据源是联盟的账本</li>
<li><strong>缺点</strong>：<strong>延迟</strong>。通常半小时到几小时一次，实时优化用不上，只适合对账</li>
</ul>
<blockquote>
<p>结论：<strong>S2S 用于优化，API 用于对账</strong>。两个都要，但不是一回事。</p>
</blockquote>
<hr>
<h2 id="三参数怎么传click_id-是整条链路的身份证" class="headerLink">
    <a href="#%e4%b8%89%e5%8f%82%e6%95%b0%e6%80%8e%e4%b9%88%e4%bc%a0click_id-%e6%98%af%e6%95%b4%e6%9d%a1%e9%93%be%e8%b7%af%e7%9a%84%e8%ba%ab%e4%bb%bd%e8%af%81" class="header-mark"></a>三、参数怎么传：click_id 是整条链路的身份证</h2><p>回传里最重要的只有一个字段：<strong>click_id</strong>（有的平台叫 <code>clickid</code>、<code>click_id</code>、<code>subid</code>、<code>cid</code>）。</p>
<p>流程是这样的：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span><span class="lnt">2
</span><span class="lnt">3
</span><span class="lnt">4
</span><span class="lnt">5
</span><span class="lnt">6
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">流量平台给 Tracker 一个 click_id
</span></span><span class="line"><span class="cl">   ↓ Tracker 把它写进自己的 sub1（或 c1）
</span></span><span class="line"><span class="cl">      ↓ Tracker 把 sub1 拼进 Offer 链接
</span></span><span class="line"><span class="cl">         ↓ 联盟把 sub1 存进自己的 click 记录
</span></span><span class="line"><span class="cl">            ↓ 转化发生时，联盟把 {sub1} 回传给你
</span></span><span class="line"><span class="cl">               ↓ Tracker 用 sub1 找到那次点击
</span></span></code></pre></td></tr></table>
</div>
</div><p><strong>中间任何一环没把值传下去，这条转化就永远匹配不上</strong>，只能躺在 Tracker 的&quot;未匹配&quot;里。</p>
<h3 id="常见平台-macro-对照" class="headerLink">
    <a href="#%e5%b8%b8%e8%a7%81%e5%b9%b3%e5%8f%b0-macro-%e5%af%b9%e7%85%a7" class="header-mark"></a>常见平台 macro 对照</h3><table>
<thead>
<tr>
<th>环节</th>
<th>平台</th>
<th>转化回传用的 macro</th>
</tr>
</thead>
<tbody>
<tr>
<td>转化回传</td>
<td>多数 CPA 联盟</td>
<td><code>{click_id}</code> / <code>{sub1}</code> / <code>{aff_sub1}</code></td>
</tr>
<tr>
<td>转化回传</td>
<td>常见 CPS / 电商联盟</td>
<td><code>{click_id}</code> + <code>{txn_id}</code></td>
</tr>
<tr>
<td>Tracker 接收</td>
<td>Binom</td>
<td><code>?cid={click_id}</code>（<code>cid</code> 是它的 click 参数）</td>
</tr>
<tr>
<td>Tracker 接收</td>
<td>BeMob</td>
<td><code>?cid={click_id}</code></td>
</tr>
<tr>
<td>Tracker 接收</td>
<td>Voluum</td>
<td><code>?cid={click_id}</code></td>
</tr>
<tr>
<td>流量平台回传（喂算法）</td>
<td>PropellerAds</td>
<td><code>postback=...&amp;status=...&amp;payout=...</code></td>
</tr>
<tr>
<td>流量平台回传（喂算法）</td>
<td>PopAds</td>
<td><code>?cid={click_id}&amp;payout={payout}</code></td>
</tr>
</tbody>
</table>
<blockquote>
<p>表里的参数名一定要以你后台<strong>当前</strong>显示的为准，各平台改名很勤。我这套是按&quot;点开后台看到的字段名&quot;抄下来的，抄错一个字母，整条链路就断。</p>
</blockquote>
<hr>
<h2 id="四用-curl-自己测一遍回传别等数据不对了才查" class="headerLink">
    <a href="#%e5%9b%9b%e7%94%a8-curl-%e8%87%aa%e5%b7%b1%e6%b5%8b%e4%b8%80%e9%81%8d%e5%9b%9e%e4%bc%a0%e5%88%ab%e7%ad%89%e6%95%b0%e6%8d%ae%e4%b8%8d%e5%af%b9%e4%ba%86%e6%89%8d%e6%9f%a5" class="header-mark"></a>四、用 curl 自己测一遍回传，别等数据不对了才查</h2><p>配置完 Postback，不用等真实转化，直接手动打一次请求：</p>
<div class="highlight"><div class="chroma">
<table class="lntable"><tr><td class="lntd">
<pre tabindex="0" class="chroma"><code><span class="lnt">1
</span></code></pre></td>
<td class="lntd">
<pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -i <span class="s2">&#34;https://tracker.example.com/pb?cid=TEST123&amp;payout=1.20&amp;status=approved&amp;txid=TEST-TX-1&#34;</span>
</span></span></code></pre></td></tr></table>
</div>
</div><p>看三件事：</p>
<ol>
<li><strong>HTTP 状态码</strong>必须是 200（不是 302、不是 404）</li>
<li>Tracker 后台的 Conversions 里<strong>出现一条 cid=TEST123 的记录</strong></li>
<li>这条记录能被归到正确的 Campaign / Offer / 流量源</li>
</ol>
<p>如果第 1 步 200 但第 2 步没记录，那说明请求到了但 Tracker 没识别参数——大概率是参数名不对，或者这个 cid 在你的 Tracker 里根本不存在（很多 Tracker 会静默丢弃匹配不上的 cid，不报错）。</p>
<hr>
<h2 id="五四条排错路径按这个顺序查最省时间" class="headerLink">
    <a href="#%e4%ba%94%e5%9b%9b%e6%9d%a1%e6%8e%92%e9%94%99%e8%b7%af%e5%be%84%e6%8c%89%e8%bf%99%e4%b8%aa%e9%a1%ba%e5%ba%8f%e6%9f%a5%e6%9c%80%e7%9c%81%e6%97%b6%e9%97%b4" class="header-mark"></a>五、四条排错路径（按这个顺序查最省时间）</h2><h3 id="路径-1点击链路就断了" class="headerLink">
    <a href="#%e8%b7%af%e5%be%84-1%e7%82%b9%e5%87%bb%e9%93%be%e8%b7%af%e5%b0%b1%e6%96%ad%e4%ba%86" class="header-mark"></a>路径 1：点击链路就断了</h3><p>症状：<strong>Tracker 的点击数明显少于流量平台</strong>（比如少 15% 以上）。</p>
<ul>
<li>检查 Campaign URL 有没有正确带上流量平台的 <code>{click_id}</code> macro</li>
<li>检查 Offer 链接里 <code>sub1</code> 是否被 URL 编码破坏（<code>&amp;</code> 被截断最常见）</li>
<li>用浏览器手动打开一次 Campaign URL，看跳转后的最终 URL 里 sub1 有没有值</li>
</ul>
<h3 id="路径-2转化回来了但没匹配上" class="headerLink">
    <a href="#%e8%b7%af%e5%be%84-2%e8%bd%ac%e5%8c%96%e5%9b%9e%e6%9d%a5%e4%ba%86%e4%bd%86%e6%b2%a1%e5%8c%b9%e9%85%8d%e4%b8%8a" class="header-mark"></a>路径 2：转化回来了但没匹配上</h3><p>症状：Tracker 里出现&quot;未匹配转化&quot;（Unmatched Conversions）一堆。</p>
<ul>
<li>说明请求到了、参数也带了，但 <code>cid</code> 的值在 Tracker 里查不到</li>
<li>常见原因：<strong>流量平台把 click_id 限制在 32 位或去掉特殊字符</strong>，你传回去的已经被截断</li>
<li>另一个原因：点击记录被 Tracker 按保留期清理了（Binom 默认 30 天，长周期 CPS 会超时）</li>
</ul>
<h3 id="路径-3回传-200但一条都没有" class="headerLink">
    <a href="#%e8%b7%af%e5%be%84-3%e5%9b%9e%e4%bc%a0-200%e4%bd%86%e4%b8%80%e6%9d%a1%e9%83%bd%e6%b2%a1%e6%9c%89" class="header-mark"></a>路径 3：回传 200，但一条都没有</h3><p>症状：curl 测试通过，真实转化不回来。</p>
<ul>
<li>看联盟后台里 Postback URL 是否真的保存成功（很多平台保存后需要点一次&quot;Test&quot;）</li>
<li>看联盟的 <code>{click_id}</code> 是不是在<strong>转化时</strong>才拼装——有些联盟的 macro 在点击时不记录，只有带 <code>sub1</code> 才有值</li>
<li>检查你的服务器是否拦了来源 IP（Cloudflare 的 WAF 常把联盟的回传请求当机器人拦掉，<strong>这条踩过</strong>）</li>
</ul>
<blockquote>
<p>血泪提示：如果你的 Tracker 前面挂了 Cloudflare，<strong>一定要把 <code>/pb</code> 这条路径加进 WAF 白名单</strong>，或者干脆给 Tracker 用独立域名、不套 CDN。</p>
</blockquote>
<h3 id="路径-4转化数比联盟多" class="headerLink">
    <a href="#%e8%b7%af%e5%be%84-4%e8%bd%ac%e5%8c%96%e6%95%b0%e6%af%94%e8%81%94%e7%9b%9f%e5%a4%9a" class="header-mark"></a>路径 4：转化数比联盟多</h3><p>症状：Tracker 显示 30 个转化，联盟只认 20 个。</p>
<ul>
<li>说明有<strong>重复回传</strong>，通常是联盟重试机制 + 你的 Tracker 没做 <code>txid</code> 去重</li>
<li>或者你的像素和 S2S 两条路都在回传，同一次转化被记了两遍</li>
</ul>
<p>处理方式：Tracker 里打开&quot;按 txid 去重&quot;，如果平台不支持，就在回传 URL 里带上 <code>txid</code> 并让 union 侧保证唯一。</p>
<hr>
<h2 id="六时区最容易被忽略的错位" class="headerLink">
    <a href="#%e5%85%ad%e6%97%b6%e5%8c%ba%e6%9c%80%e5%ae%b9%e6%98%93%e8%a2%ab%e5%bf%bd%e7%95%a5%e7%9a%84%e9%94%99%e4%bd%8d" class="header-mark"></a>六、时区：最容易被忽略的错位</h2><p>流量平台、Tracker、联盟三方的日报<strong>默认时区几乎一定不一样</strong>：</p>
<ul>
<li>流量平台常用 UTC</li>
<li>Tracker 常用你设置的时区（很多默认 UTC）</li>
<li>联盟常用自己的商务时区（美西、东八区都有）</li>
</ul>
<p>结果就是：你今天看&quot;昨天 ROI -40%&quot;，第二天回看同一时段变成 +5%。<strong>不是数据错了，是对比的两个窗口不是同一个窗口</strong>。</p>
<p>做法很简单：<strong>把 Tracker 的时区统一成流量平台的时区</strong>，优化时只看一个时间基准。对账时再切回联盟时区。</p>
<hr>
<h2 id="七一份可以直接照着填的检查清单" class="headerLink">
    <a href="#%e4%b8%83%e4%b8%80%e4%bb%bd%e5%8f%af%e4%bb%a5%e7%9b%b4%e6%8e%a5%e7%85%a7%e7%9d%80%e5%a1%ab%e7%9a%84%e6%a3%80%e6%9f%a5%e6%b8%85%e5%8d%95" class="header-mark"></a>七、一份可以直接照着填的检查清单</h2><table>
<thead>
<tr>
<th>#</th>
<th>检查项</th>
<th>通过标准</th>
</tr>
</thead>
<tbody>
<tr>
<td>1</td>
<td>Campaign URL 带 click_id macro</td>
<td>跳转后 URL 可见值</td>
</tr>
<tr>
<td>2</td>
<td>Offer 链接带 sub1 且已编码</td>
<td>打开 Offer 后 sub1 有值</td>
</tr>
<tr>
<td>3</td>
<td>联盟侧 Postback 已保存并测试</td>
<td>后台 Test 按钮返回成功</td>
</tr>
<tr>
<td>4</td>
<td>Tracker <code>/pb</code> 未被 WAF 拦截</td>
<td>curl 返回 200</td>
</tr>
<tr>
<td>5</td>
<td>回传带 txid 且已去重</td>
<td>重复请求只记一次</td>
</tr>
<tr>
<td>6</td>
<td>Tracker 时区 = 流量平台时区</td>
<td>日报窗口一致</td>
</tr>
<tr>
<td>7</td>
<td>流量平台侧 postback 已配</td>
<td>平台后台能看到转化回传</td>
</tr>
<tr>
<td>8</td>
<td>保留期覆盖转化周期</td>
<td>长周期 Offer 用 API 对账</td>
</tr>
</tbody>
</table>
<p>八项全过，你的数据才敢拿来当决策依据。</p>
<hr>
<h2 id="八为什么值得花半天把这件事做对" class="headerLink">
    <a href="#%e5%85%ab%e4%b8%ba%e4%bb%80%e4%b9%88%e5%80%bc%e5%be%97%e8%8a%b1%e5%8d%8a%e5%a4%a9%e6%8a%8a%e8%bf%99%e4%bb%b6%e4%ba%8b%e5%81%9a%e5%af%b9" class="header-mark"></a>八、为什么值得花半天把这件事做对</h2><p>回传链路是 Media Buy 里<strong>唯一一条&quot;做了就不会再返工&quot;的基础设施</strong>。</p>
<p>它做对了，你后面所有的优化动作——关掉亏钱的 GEO、给赚钱的 placement 加价、判断一个 Offer 到底能不能跑——才建立在真实数据上。</p>
<p>它没做对，你会用三倍预算去买一个错误的结论。我自己最早那两个月，一半的学费交在这条链路上。</p>
<p>下一篇讲预算：当你终于能看清数据了，第一笔钱该怎么分、什么时候该停。两篇连着看，基本就是新手最容易亏钱的两个环节。</p>
<blockquote>
<p>如果这篇里的配置你在 BeMob 上做，<a href="https://bemob.com/?ref=hvv5b0ct6p" target="_blank" rel="noopener noreferrer">这里可以免费开一个</a>，10 万事件/月的免费额度足够跑通整套回传链路，不用先付钱。</p>
</blockquote>
]]></description>
</item></channel>
</rss>
