Skip to content

Coupons, organic traffic and app tracking

Three kinds of conversion do not follow the usual path of an ad, a click and a postback naming that click. Tallyray handles each one.

A coupon is a promo code that stands for a click. A shop’s postback that carries a code and names no click is a conversion of the coupon’s campaign.

Under Tracking, Coupons, make a coupon with:

Field
Code1 to 64 of A-Z, a-z, 0-9, ., _ and -, compared without case (stored upper case). Fixed once made.
Matchexact, or prefix: at least 3 characters, matching every code that starts with it (ANNA takes ANNA10 and ANNA-XMAS), for a partner whose shop makes a code per customer. An exact code wins over a prefix, and a longer prefix over a shorter one.
CampaignRequired: the campaign whose reports count its conversions, and through it the traffic source. An influencer paid per sale is a campaign on Any other source, priced CPA.
OfferOptional: the offer its conversions are, of a network that may post codes. Without one, a conversion is the network’s only active offer’s.
PrecedenceClick (the default) or code
Status, endActive, paused or archived; and an optional end after which it places nothing
Noteup to 500 characters

A workspace can hold 200,000 codes. To make many at once, import a CSV (columns code, match, campaign, offer, precedence, status, ends_at, note; campaign and offer by id; up to 50,000 rows and 5 MiB). Each row is made or refused on its own, and you can check the file first without making anything.

The network’s template must let a code stand for a click. The generic Any network (postback URL) template does: its postback takes coupon, campaign, placement, source_campaign and creative beside the usual fields. A postback naming a code and no click must also carry a txid, since a code is shared by everyone who types it and only the transaction id tells two sales apart; otherwise it is refused (txid_required).

  • A click and a code: by default the click wins. The conversion is the click’s, and the code is kept on it. Codes travel to coupon sites and browser extensions that fill them in at checkout; a click is the visitor’s own.
  • An exclusive code: marked precedence code, active, with a txid, it wins over a click of another campaign. A click and a code of the same campaign is the click’s either way.
  • A click past the click window leaves the conversion to an active code, with a txid.
  • A paused or archived coupon places nothing. A postback only it matches is unprocessable, kept, and can be replayed once the coupon is active again.
  • Leaks show in reports. Group by coupon and campaign: a code whose sales come more and more with other campaigns’ clicks, or alone where its partner stopped posting, is being passed around. Pause it, end it, or give the partner a new one.

A conversion placed by a code is never sent to a traffic source. Reports by coupon or attribution basis show conversions only: visits, clicks and measures over them are blank.

If you have a site of your own, Tallyray can record its visits without a redirect, by putting the lander script on its pages. It counts in your plan’s visits as any visit does.

The script’s tag can name a default campaign (data-key): your site’s organic campaign, on the Any other source template. Then:

  1. A visit that names its campaign is that campaign’s: the page’s key parameter, the campaign’s own key in a paid ad’s URL, or a visit token or click id a redirect brought. Its channel is campaign.

  2. Any other visit is the default campaign’s, with a channel Tallyray reads from the page’s query and the referrer’s host, in this order:

    ChannelWhen
    Paidan ad platform’s click id (gclid, gbraid, wbraid, msclkid, ttclid), or a paid utm_medium: an ad you did not tag, which shows here so you tag it
    Emailutm_medium of email or newsletter, or a webmail referrer
    Socialutm_medium of social, or a social network’s referrer
    Searchutm_medium of organic, or a search engine’s referrer
    Referralany other site’s referrer
    Directnone of these

    fbclid alone is not paid: Facebook adds it to links shared without an ad too. Every report groups and filters by channel.

The Any other source template reads the UTM parameters: utm_source as the site, utm_medium, utm_campaign as the source campaign, utm_content as the creative, utm_term as the keyword. Its cost models are none, CPC, CPM, CPA and revshare, with spend entered by hand; it sends no conversions and calls nothing.

One arrival is one visit: browsing from page to page of your own site makes no new visit, and a reload keeps its visit.

When the sale happens on your site, make the site an offer and mark it direct. A campaign leads to it as to any offer, by direct linking or from a lander’s call to action. The script on its pages makes the visit and the click at once. A direct offer has no daily cap or fallback offer, and its origin cannot also be a direct lander’s.

  • The click is kept in a first-party cookie on your site, _ck, as the consent allows. A visitor who came from a push ad and returns from Google days later buys on the push campaign: the cookie holds the last click that named its campaign. An organic arrival replaces only another organic one, or a click past the window.
  • Your site’s backend gets the click id from the script (the tag’s data-click-id attribute, a page event and the _ck cookie), and posts it back through the network’s postback as cid: the generic template from your server, or its pixel on the thank-you page.
  • Consent: where consent is required (the EEA, the UK and Switzerland), the cookie is written only when the page’s consent grants both ad_user_data and ad_personalization. Elsewhere it is written unless the browser sends Global Privacy Control or the consent denies either. A denial deletes it.

A visit keeps its page’s origin alone: never the page’s path, query or fragment, and never the referrer’s path or query. A site’s links often hold reset tokens and emails. Parameters the template does not name are dropped. A visit has no IP or user agent stored for the Any other source template. A content site that wants a page reported apart makes it a direct lander.

You track an app through its mobile measurement partner (MMP). Tallyray has no SDK of its own: the MMP’s SDK is in the app already.

An MMP is a network to Tallyray. The offer’s URL is the MMP’s attribution link, carrying the Tallyray click id; the store installs the app; the MMP attributes the install and its later events to that click and posts them back as a network posts conversions. Add the MMP under Tracking, Networks on its template: AppsFlyer, Adjust, Branch, Kochava or Singular.

MMPThe click id parameter in its link
AppsFlyerclickid
Adjustlabel
Branch~click_id
Kochavaclick_id
Singularcl

In the offer form, paste the app’s attribution link from your MMP: the portal sets the click id parameter to {click_id} and adds the other parameters the template lists (the campaign, source campaign, placement and creative, for the MMPs that return them).

Setting up the postbacks:

  • Adjust needs no partner. The app’s owner sets Adjust’s raw data callbacks (installs, events, reattributions and rejected installs) to the network’s postback URL.
  • The others list Tallyray as a partner. The app’s owner turns the partner on at the MMP and fills in two fields: your tracking domain and the network’s postback token (shown once, when it is made). The MMP then posts each install, re-engagement and in-app event to Tallyray, which keeps none of the device ids it may add. Until the MMP lists Tallyray as a partner, its postbacks cannot come, so check with your MMP before you rely on one.

What comes back:

  • Installs are install conversions, once per click.
  • Re-engagements and re-attributions are reengagement, once per click.
  • In-app events are your event types by the MMP’s names; a purchase is a sale with its revenue and currency. A repeatable event is told apart by the MMP’s event id, or by a hash of the click id and the event’s times.
  • Rejected installs (the MMP’s fraud blocks) are declined.
  • Revenue is what the MMP reports, else the offer’s payout.

Every MMP template maps install and reengagement as built-in event types; an install or in-app event on a click goes to your traffic source like any conversion, but no source template maps an install by default: map it in the connection’s override to what the source counts.

On iOS, without a user’s consent to tracking, AppsFlyer’s Advanced Privacy sends only an aggregated postback with no click id, which names the campaign and what your link carried (source campaign, placement, creative). Tallyray counts it as that campaign’s conversion, with its placement and creative, so installs still count by zone. It is never deduplicated and never sent to a source. SKAdNetwork postbacks go to the ad network that signed the ad, and Tallyray signs none, so none reach it.

Device ids are never read. No postback field holds an IDFA, IDFV, GAID, OAID, IMEI, an IP or the MMP’s own device id, and the network keeps only the parameters its template names.

Apps on Meta, Google, TikTok, Apple Search Ads or Snap are claimed by those platforms with the MMP themselves and are not tracked through a Tallyray link.