Skip to content
Docs

Tracking guide

Attribution

How a conversion is matched to a click, the attribution windows and timing guards, and the model options.

Attribution answers "which click earned this conversion". Metrixed is deterministic first: it only falls back to fuzzy methods when you allow them, and it always records which method matched.

The matching ladder for web and S2S conversions

Ingest walks these rungs in order and uses the first that resolves (packages/go-shared/attribution):

#RungMatches by
1click_idThe id in the postback, pixel or event (click_id, clickid, transaction_id, ...).
2Session cookieThe _dtk cookie the web SDK or /px call carries.
3txn_id reuseA conversion with the same transaction id already exists: it is a duplicate or a status update, not a new conversion.
4CouponA coupon code assigned to a partner.
5Device idHashed device ids for installs and app events.
6ProbabilisticIP plus user agent within 24 hours, confidence 0.6. The rung exists in the library but the web and S2S endpoints do not turn it on today; mobile installs have their own opt-in probabilistic rung.
7Impression (view-through)An impression within view_through_lifespan_minutes when the offer enables view-through.
8UnmatchedStored, visible and assignable.

The rung that matched is stored with the conversion (attribution.touch: click, impression, coupon, probabilistic, none).

Attribution priority per offer

Offer ▸ Tracking ▸ Attribution priority (offers.attribution_priority) reorders the click-finding rungs and can add two more. Pick any of click_id, cookie, fingerprint, email, coupon in the order to try; empty keeps the default ladder above (click id, cookie, coupon).

  • fingerprint: the last click on the offer with the same IP and user agent (sha256) within 24 hours. The edge stores the fingerprint only for offers that list it.
  • email: the last click that carried the same email (email= or em= on the tracking link, hashed at the edge and never stored in clear) within the offer's attribution window; the postback sends email or email_hash.

The method that found the click is stored on the conversion as attribution_match and is a report dimension (Attribution match), so you can see how many conversions each method attributed.

Windows and timing guards

Per offer, applied to the matched click:

SettingEffectRejection reason
session_duration_hoursMaximum time from click to conversion (the attribution window).expired_session
ctit_min_secondsMinimum click-to-conversion time.ctit_too_short
ctit_max_hoursMaximum click-to-conversion time.ctit_too_long
goal kpi_window_daysWindow for a goal that must happen within N days of the click.kpi_window_exceeded
view_through_lifespan_minutes, view_through_min_secondsImpression window and minimum dwell for view-through.

Conversions may be backdated with ts (up to roughly 400 days in the past and 5 minutes into the future), but they still have to fit the windows above relative to the click. A click flagged invalid at click time is not credited: the conversion is rejected with invalid_click unless it is a test.

Models

The offer's attribution_method (last_touch by default, also first_touch, linear, position_based, time_decay) is stored on every conversion as its attribution model and is available in reports and postbacks (attribution_method macro). The conversion itself is credited to the single click that the ladder matched, and payout goes to exactly that click's partner; multi-touch apportioning is not performed.

Mobile installs

Installs have their own ladder with confidence scores, because the identifiers differ. See install attribution: install referrer, device id, click id and deep link, self-attributing network claims, preload, probabilistic (opt-in), organic, plus reinstall and re-attribution classification and the click-injection guard.

What is stored

Each conversion keeps its click id and click timestamp, the click-to-install time (ctit_seconds), the entities resolved from the click (offer, partner, landing page, creative, SmartLink, advertiser), the attribution touch, and the method family (postback, pixel, iframe, js, sdk, s2s, manual, import). The full schema is conversion_created.