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.
Coupons
Section titled “Coupons”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.
Making a coupon
Section titled “Making a coupon”Under Tracking, Coupons, make a coupon with:
| Field | |
|---|---|
| Code | 1 to 64 of A-Z, a-z, 0-9, ., _ and -, compared without case (stored upper case). Fixed once made. |
| Match | exact, 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. |
| Campaign | Required: 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. |
| Offer | Optional: the offer its conversions are, of a network that may post codes. Without one, a conversion is the network’s only active offer’s. |
| Precedence | Click (the default) or code |
| Status, end | Active, paused or archived; and an optional end after which it places nothing |
| Note | up 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.
What the postback must say
Section titled “What the postback must say”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).
Click or code?
Section titled “Click or code?”- 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.
Organic traffic and your own site
Section titled “Organic traffic and your own site”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.
Paid or organic
Section titled “Paid or organic”The script’s tag can name a default campaign (data-key): your site’s organic campaign, on the Any other source template. Then:
-
A visit that names its campaign is that campaign’s: the page’s
keyparameter, 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. -
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:
Channel When Paid an ad platform’s click id ( gclid,gbraid,wbraid,msclkid,ttclid), or a paidutm_medium: an ad you did not tag, which shows here so you tag itEmail utm_mediumofemailornewsletter, or a webmail referrerSocial utm_mediumofsocial, or a social network’s referrerSearch utm_mediumoforganic, or a search engine’s referrerReferral any other site’s referrer Direct none of these fbclidalone 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.
A store as the offer
Section titled “A store as the offer”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-idattribute, a page event and the_ckcookie), and posts it back through the network’s postback ascid: 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_dataandad_personalization. Elsewhere it is written unless the browser sends Global Privacy Control or the consent denies either. A denial deletes it.
What is never kept
Section titled “What is never kept”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.
App installs and events
Section titled “App installs and events”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.
| MMP | The click id parameter in its link |
|---|---|
| AppsFlyer | clickid |
| Adjust | label |
| Branch | ~click_id |
| Kochava | click_id |
| Singular | cl |
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
installconversions, 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.