---
name: tracker-ops
description: "Counting ops for Facebook/Meta affiliate traffic, tracker or no tracker: Keitaro + Binom APIs (keys, reports, cost push), postback/S2S, no-tracker lane (PWA builder log + affiliate network API/postbacks + own sheet, Scaleo recipe), metric discipline (payout event vs all-conversions, timezones, CPL math), Meta-vs-tracker reconciliation, status→CAPI event mapping, daily spend sync. Principles port to other trackers and networks."
---

# Tracker Ops

Count money correctly and automate tracker work for Meta traffic. Keitaro and Binom
specifics below; the metric rules and daily sync port to any tracker.

## Pick the lane first

| Lane | Chain | Count truth | Cost lives in | Money metric |
|---|---|---|---|---|
| Tracker (Keitaro; Binom the same, `02`) | ad → tracker → offer, campaign-name contract (`03`) | tracker payout status (rules 1-2) | tracker, daily cost push | CPL/CPA + ROI on `sale_revenue` |
| No-tracker (solo) | ad → PWA builder (click/install log, fires pixel/CAPI) → affiliate network | network report + postbacks per goal (`05`) | own sheet: FB insights spend | cost per dep only, no revenue/ROI |

Rules 3-5 hold in both lanes (no-tracker: read "tracker" as "affiliate network
report", and for rule 5 as the PWA builder's click log). Rules 1-2 are tracker
semantics; rule 6 has a line per lane.

## Metric rules (NEVER violate)

1. "Conversions" (Keitaro) can exceed your payout-lead count, but the ratio is
   integration-specific, not a law: the same subid+status OVERWRITES; extra records
   come only from distinct `tid`s or a real multi-step funnel. Never do CPL math on
   "conversions": the payout metric is ONE event/status, get it from the TL in
   writing.
2. Metric names aren't portable. Keitaro `leads` = conversions STILL in status lead
   (lead→sale flips in place): regs = leads + sales, deps = sales; `leads` alone
   overstates reg→dep (field: 11 vs 17). Binom "leads" ≈ all conversions. Verify per
   tracker per setup.
3. Cross-check: Meta lead count ≈ tracker lead count. A big gap = wrong metric or
   broken tracking: reconcile before reporting. The tolerance (e.g. ±20%) is an
   account-specific baseline from one reconciled day, not a constant. Meta counts
   view-through the tracker never sees: compare Meta click-only (`03`).
4. Daily CPL in the AD ACCOUNT timezone for spend and leads. The account timezone is
   effectively permanent (changing it means a new account; operating contract #5 in
   `../senior-buyer-ops/SKILL.md`): reconcile in the tracker, never by eye. No-tracker:
   convert the network's conversion timestamp to the account tz first (`05`).
5. Rows with unsubstituted `{{...}}` macros: exclude from performance analysis, then
   classify the cause: bots/crawlers, but also a broken URL template, a
   misspelled/unsupported macro, or manual/direct traffic. Fix your own template before
   blaming traffic.
6. Money = `sale_revenue`, never `revenue` (it includes lead_revenue; payout on lead
   postbacks fakes ROI: field case $9,820 vs $1,650 real). Check lead_revenue = 0.
   No-tracker: no revenue column; deps (CPA goal, distinct click) from the network
   report, cost per dep = FB spend ÷ deps (`05`, `03` routine).

## Route references

| Need | Reference |
|---|---|
| Keitaro: key, report/build, measures, update_costs, postback/S2S, postback drill, gotchas | `references/01-keitaro.md` |
| Binom: legacy URL-param + v2 REST, reports, cost, postback/S2S | `references/02-binom.md` |
| CPL math, Meta↔tracker reconciliation, anti-fraud metrics, cohort nowcasting, status→CAPI event contract, Telegram bot CAPI without pixel, multi-tracker sync + conversion ledger, ATT, mapping, daily routine | `references/03-metrics-and-math.md` |
| No-tracker lane: affiliate network API (Scaleo), per-goal/per-status postbacks, reconciliation, dedupe, dep-alert worker, PWA click id as join key | `references/05-affiliate-network-postbacks.md` |

## Non-negotiables

- Work only on YOUR campaign IDs; every call carries a campaign filter. Other buyers'
  campaigns are read-never-touch.
- Tracker lane: no cost push = no CPL/ROI (report cost is 0, or fake: a CPA/CPS cost
  model with auto ON adds fixed cost per conversion, `01`). Push daily, keyed on ids,
  in the ad account's tz and currency:
  `metaops keitaro push` (`../meta-grey-ops/references/16-metaops-agent-cli.md`
  § Keitaro; dry run first, then `--confirm PUSH`). Overwriting a period is idempotent,
  but cost lands only on clicks matching range+filters: reconcile source spend vs
  tracker cost after each push.
- No-tracker lane: nothing to push. Cost = FB spend per campaign/state/day (insights,
  account tz) in your sheet; deps = network report (CPA goal, player state from the
  report, not ad geo), cross-checked against postback alerts; cost per dep on full days
  only (`05`, `03` routine).
- API keys are write-once; keep them in a gitignored secrets file, never in chat,
  commits or shared docs.
