Skip to main content

When to use S2S impressions

A click link only credits users who tap your ad. Many users see an ad, don’t tap it, and install the app later from the store. Without impression data, those installs look organic. Your server reports each impression (the ad was shown) to Linkrunner. If the same device installs the app within the view-through window and there is no click to credit, Linkrunner credits the install to your impression. This is view-through attribution. It works like impression tracking in AppsFlyer and accepts the same parameter names.
View-through is off by default. The advertiser turns on S2S traffic and view-through for each partner separately, and sets your view-through window. Ask them, or Linkrunner support, before you send impressions. Until then, requests are rejected with partner_not_enabled or view_through_disabled.

How it works

Linkrunner credits an impression only when all of these hold: Postbacks work as for clicks. Your postback templates, event mapping and postback logs apply unchanged, and {touch_type} is impression for view-through installs.

Set it up

1

Start from your campaign link

Create the link in your affiliate dashboard as usual. See Create a campaign link. You get a tracking link like this:
2

Turn it into the impression URL

Keep your parameters, and send them to https://s2s.linkrunner.io/v1/impression/<app_id>. <app_id> is the app’s Android package name (com.example.app) or its App Store ID (id1234567890).Then add the device ID (gaid or idfa, required), the time of the impression, and optionally a shorter view-through window:
tid is your ID for this impression. Use a value that is unique per impression, not your click ID.
You can name the advertiser by the tracking link’s domain instead: https://s2s.linkrunner.io/v1/impression?d=app.example.com&c=.... Use d if the advertiser’s test and live apps share an app ID and the same campaign code.
3

Fire it from your server when the ad is shown

Replace your macros and call the URL with GET when the impression happens. A 200 with "status":"accepted" means the impression is recorded. See retries for the other responses.
4

Test it end to end

Send one impression with the GAID of a test device. Don’t tap any ad on that device. Install and open the app within the window. The install postback arrives with your tid and {touch_type} = impression. Check it in Postback logs.
Send each impression as it happens. An impression that arrives after the install can’t be credited, and impressions older than 24 hours are rejected.

Coming from AppsFlyer

If you already send impressions to AppsFlyer, you can reuse that template. Only the host and c change. An AppsFlyer template like this:
becomes:

Retries

Retrying is safe. The same tid for the same campaign always returns the same impression_id and is stored once.
  • Retry 429 and 503, after the Retry-After delay.
  • Don’t retry other 4xx responses. Fix the request instead. The reason tells you what’s wrong.
See the S2S Impression API reference for every parameter, response and rejection reason.

Troubleshooting

Requests return missing_device_id. Impressions need a gaid or idfa. Unlike S2S clicks, an IP address alone is not enough. An all-zero ID counts as missing. Requests return partner_not_enabled or view_through_disabled. The advertiser hasn’t turned on S2S traffic, or view-through, for your partner account on this app. Changes take up to 5 minutes to apply. Requests return impression_too_old. impression_time is more than 24 hours ago. Send impressions as they happen. Requests return invalid_viewthrough_lookback. Use whole hours (6h, 24h, or 6) or 1d. Fractions, weeks and 0 are rejected. Impressions are accepted but installs aren’t credited to them. Check that the impression carries the user’s real GAID or IDFA and arrives before the install. A click from any source, or a more recent impression, takes priority. The install must also fall inside the view-through window the advertiser set for you. Need help? Contact support@linkrunner.io