track.js

Komplet reference til sporingsscriptet – attributter, JavaScript-API, hvad der gemmes i browseren, samtykke og fejl.

Se som Markdown

track.js er Affilyflows sporingsscript til webshops og websites. Det gemmer klikket, når en kunde lander fra et affiliate-link, og melder salget, når kunden når kvitteringen. Hvordan det hele hænger sammen, står i Sådan virker sporingen.

Indsæt scriptet

Indsæt linjen i <head> på alle sider – også kvitteringssiden.

<head> · alle siderHTML
<script src="https://app.affilyflow.com/track.js" data-store="DIN_BUTIK" async></script>

DIN_BUTIK er butikkens id. Den rigtige linje med jeres id står under Opsætning i butikkens dashboard – kopier den derfra.

Brug async: scriptet må aldrig holde siden tilbage. Undtagelsen er den kodefri lead-trigger (data-lead-url), hvor linjen skal være uden async – se Lead uden kode.

Attributter

AttributPåkrævetBetydning
data-storeJaButikkens id. Sendes med hvert salg og skal passe til klikkets butik, ellers afvises salget som store_mismatch.
data-consent="required"NejIntet gemmes i browseren, før den besøgende har givet samtykke til marketing. Se Samtykke.
data-lead-urlNejAdressen på tak-siden for et lead-program. Når siden matcher, meldes et lead automatisk. Se Lead uden kode.
data-cookie-domainNejDomænet, cookien lægges på (fx shop.dk). Uden attributten vælger scriptet selv det bredeste domæne, browseren tillader.
data-sale="ga4"NejLæs købet fra Google Analytics 4 (dataLayer eller gtag). Se Google Analytics.
data-sale-vatNejKun med data-sale="ga4": momsen i procent, som Google Analytics-beløbene indeholder (fx 25).
data-sale-shippingNejKun med data-sale="ga4": incl hvis fragten altid er med i value, excl hvis den aldrig er. Uden attributten gætter scriptet.

Hvad scriptet gemmer

Når en kunde lander med ?afid= i adressen, gemmer scriptet klik-id'et både som cookie og i localStorage, så det overlever, at den ene af dem ryddes.

NøgleIndhold
af_clickKlik-id'et fra ?afid=
af_storeButikkens id fra data-store
af_affKun ved ældre direkte links (?aff= + ?store=)
  • Levetid: højst 90 dage fra klikket. Cookiens max-age er altid den resterende tid af de 90 dage.
  • Genbesøg forlænger aldrig vinduet. Ved hvert besøg skrives cookie og localStorage igen med den resterende tid, så en slettet cookie genskabes fra localStorage – men tidspunktet er altid klikkets.
  • localStorage gemmer værdien som { v, t } – værdien og tidspunktet for klikket. En værdi over 90 dage gammel slettes ved læsning.
  • Cookien sættes med path=/ og SameSite=Lax, og med Secure på https.
  • Domænet: cookien lægges på det bredeste domæne, browseren tillader (shop.dk frem for www.shop.dk), så klikket følger med til en kvittering på et andet subdomæne. Scriptet finder det med en kortvarig testcookie (_af_d), der slettes med det samme. På en IP-adresse eller localhost bruges den præcise host.
  • Hukommelsen: klik-id'et fra adressen ligger også i sidens hukommelse, så et salg på samme side virker, selvom lageret er blokeret (fx et privat vindue).

Kun Affilyflows klik-id'er

Kun et afid, der ligner vores (c_ efterfulgt af 4–64 tegn: bogstaver, tal, _ og -), gemmes. Bruger butikken også et andet netværk med en parameter, der hedder afid, kan den fremmede værdi derfor aldrig overskrive et Affilyflow-klik.

affilyflow.conversion()

Meld et salg fra JavaScript. Kaldet virker kun, når track.js er indlæst på siden.

KvitteringssidenJavaScript
affilyflow.conversion({ order: '1008', total: 499, currency: 'DKK' });
FeltTypeBetydning
ordertekstOrdrenummeret. Bruges til at stoppe dubletter.
totaltal eller tekstBeløbet, provisionen regnes af: varerne efter rabat, uden moms og fragt. Tekst som "1.249,00" læses, se Beløb som tekst.
currencytekstValutakode, fx DKK eller EUR. Gøres til store bogstaver. Standard er DKK.
storetekstButikkens id. Bruges kun, hvis browseren ikke allerede har det fra data-store.

Sådan opfører kaldet sig:

  • Uden et affiliateklik i browseren sendes intet – og der skrives ingen fejl. Et almindeligt køb uden affiliate er ikke en fejl.
  • Salget sendes med navigator.sendBeacon, så det kommer frem, selvom siden skifter med det samme bagefter. Uden sendBeacon bruges en usynlig billed-anmodning.
  • Med data-consent="required" venter kaldet, til samtykket er afklaret, og sendes først derefter.
  • Til et lead-program: affilyflow.conversion({ order: 'lead_' + Date.now() }) – intet beløb.
Kvitteringssiden · vent på track.jsHTML
<script>
  (function () {
    var tries = 0;
    (function send() {
      if (!window.affilyflow) { if (tries++ < 50) setTimeout(send, 200); return; }
      affilyflow.conversion({ order: '1008', total: 499, currency: 'DKK' });
    })();
  })();
</script>

Beløb som tekst

Et tal bruges, som det er. Tekst, der er et gyldigt maskintal, bruges også, som den er. Anden tekst renses: alt andet end cifre, punktum, komma og minus fjernes, og den sidste separator er decimaltegnet. Står der kun en separator med præcis tre cifre efter, er den tusindtal.

Sendt som totalLæses som
499499
"1249.5"1249,5
"249.125"249,125
"1.249,00"1249
"1.249,-"1249
"499,00 kr."499
"kr. 499"499
"1,234.56"1234,56

Pladsholdere, der afvises

Står skabelonens pladsholder stadig i order, sendes salget uden ordrenummer – en pladsholder må aldrig optage et ordrenummer, så alle senere salg blev afvist som dubletter. Disse værdier regnes som pladsholdere (store og små bogstaver er ligegyldige):

  • DIN_ORDRE_ID, DIT_ORDRE_ID, ORDRE_ID, ORDER_ID, YOUR_ORDER_ID, ORDERID
  • XX, XXX osv. (to eller flere X)
  • Alt i {{ … }}, [ … ], < … > eller % … % – en skabelonvariabel, der ikke blev udfyldt

Serveren bruger samme regel.

Dubletværn i browseren

Serveren tæller aldrig samme ordrenummer to gange i samme program. Browseren husker desuden, hvad den har sendt, så en genindlæst kvittering ikke sender igen:

  • Med ordrenummer: gemt i localStorage (af_sent) i 30 dage.
  • Uden ordrenummer: gemt i sessionStorage (af_sent_s) som side og beløb – samme kvittering med samme beløb sendes en gang pr. fane.

Butikkens egen samtykkeløsning kan styre scriptet direkte. Det er kun relevant med data-consent="required".

Efter den besøgendes valgJavaScript
affilyflow.consent(true);  // gem klikket fra adressen, og send ventende salg
affilyflow.consent(false); // slet af_click, af_store, af_aff og af_sent

Siger den besøgende ja igen på samme side, gemmes klikket fra adressen igen.

Samtykke

Med data-consent="required" gemmer scriptet intet i browseren – ingen cookie, intet localStorage eller sessionStorage, ingen testcookie – før der er givet samtykke til marketing. Indtil da ligger klikket kun i sidens hukommelse og bruges ikke. Uden attributten opfører scriptet sig som før.

<head> · alle siderHTML
<script src="https://app.affilyflow.com/track.js" data-store="DIN_BUTIK" data-consent="required" async></script>

Scriptet læser selv samtykket fra:

KildeHvad der tæller som ja
affilyflow.consent(true)Kaldet
window.affilyflowConsentVærdien true
Shoporamas bannershoporamaConsent.isAllowed('marketing')
Cookie InformationKategorien cookie_cat_marketing
CookiebotCookiebot.consent.marketing
IAB TCF v2Publisher-samtykke til formål 1 og 7 (eller GDPR gælder ikke)
  • Et ja virker, uanset om banneret svarer før eller efter scriptet. Cookie Informations, Cookiebots og Shoporamas hændelser lyttes på hele tiden. window.affilyflowConsent tjekkes ved indlæsning og de første 10 sekunder, og TCF bruges, når dens API findes inden for de 10 sekunder.
  • Et nej sletter kun ved en aktiv handling (Cookie Informations og Cookiebots hændelser, TCF's useractioncomplete eller affilyflow.consent(false)) – aldrig fordi banneret endnu ikke har læst sin egen cookie.
  • Sætter I window.affilyflowConsent senere end 10 sekunder efter indlæsning, så kald affilyflow.consent(true) i stedet.

Se Samtykke og cookies for opsætningen.

Lead uden kode

Til lead-programmer kan scriptet selv melde et lead, når kunden når tak-siden. Sæt adressen i data-lead-url, og fjern async, så leadet sendes, før tak-siden eventuelt viderestiller.

<head> · alle sider · lead-programHTML
<script src="https://app.affilyflow.com/track.js" data-store="DIN_BUTIK" data-lead-url="/tak"></script>
  • /tak rammer /tak og /tak/…, men ikke /takeaway.
  • En fuld adresse (https://shop.dk/tak) læses som stien.
  • Står der parametre (/tak?type=lead), skal de alle findes i sidens adresse.
  • Forsiden alene (/) matcher kun, når der også står parametre.
  • Leadet meldes en gang pr. session og kun med et affiliateklik i browseren.

Fejl i konsollen

track.js skriver kun i browserens konsol, når et salg ikke kunne meldes fra salgslinjen eller Google Analytics:

BeskedÅrsag
Affilyflow: data-affilyflow-order must be the order number – the sale was not recorded.Salgslinjens ordrenummer mangler eller er en pladsholder.
Affilyflow: data-affilyflow-total must be the amount (goods excl. VAT and shipping) – the sale was not recorded.Salgslinjens beløb er tomt eller 0.
Affilyflow: the purchase event has no amount – the sale was not recorded.Google Analytics-købet havde intet beløb.

Se Test og fejlfinding for at teste hele vejen med testlinket.

Safari og iPhone

Safari (ITP) sletter cookies og localStorage, der er sat fra JavaScript, efter cirka 7 dage uden besøg på siden. track.js genskriver lageret ved hvert besøg, men kan og skal ikke omgå grænserne. Kun en cookie sat af butikkens egen server – fx WooCommerce-pluginnet – lever længere. Det gælder alle netværk, ikke kun Affilyflow.

Links med ?aff= (eller ?aff_id=) og ?store= i stedet for ?afid= virker stadig. Scriptet tæller klikket og gemmer af_aff og af_store. data-store vinder altid over ?store= i adressen, så en butik, der selv bruger ?store=, ikke får sine salg afvist.

Mangler du noget?

Skriv til os – vi svarer hurtigt, og siden bliver rettet.

Kontakt support