Affilyflow

Tracking & attribution

Sådan følges et salg fra klik til provision.

Et affiliate-salg spores ikke af magi. Det spores af et klik-id, en cookie og en server, der husker præcis, hvad der var aftalt i det sekund, der blev klikket. Her er hele kæden – også de steder, hvor den ikke holder. Dem finder du selv, første gang et salg ikke lander.

Kæden

Syv trin fra klik til godkendt salg.

Et tracking link er ikke bare et link med et navn på. Det er et redirect gennem netværkets server, og det er der, hele aftalen bliver skrevet ned. Kør forløbet igennem herunder – hvert trin viser både hvad der sker, og hvad systemet gemmer i det øjeblik.

programmets sats i dag

12,00 %

uændret indtil videre

satsen på dit klik

ikke låst endnu

cookie-vindue

starter ved klikket

provision

intet salg endnu

trin 01 / 07

Trin 01 · deles

Affiliaten deler sit link

app.affilyflow.com/go/k7m2qa

Linket peger på vores server, ikke direkte på butikken. Indtil nogen klikker, findes der ingen række nogen steder. Et link er bare et link.

Hvad systemet gemmer · ingenting endnu

rækker skrevet
0

Der er intet at tælle, før nogen har klikket.

Eksempel. Klik-id, ordre, datoer og satser er opdigtede for at vise mekanikken – det er et regnestykke, ikke et løfte om indtjening. Cookie-vinduet er forskelligt fra program til program; her er brugt 30 dage.

Hele attributionsforløbet i tekst

  1. deles: Affiliaten deler sit link. Linket peger på vores server, ikke direkte på butikken. Indtil nogen klikker, findes der ingen række nogen steder. Et link er bare et link. Gemt i ingenting endnu: rækker skrevet = 0. Der er intet at tælle, før nogen har klikket.
  2. t + 0 ms: Klikket registreres på serveren – og satsen låses. Besøgeren rammer /go før butikken. Er det en kendt crawler, sker der ingenting: ingen klik-række, ingen attribution. Ellers slås linket op, og der skrives en klik-række. Fire felter kopieres fra programmet ned på rækken. Fra dette millisekund tilhører de klikket – ikke programmet. Gemt i clicks: click_id = c_9fK2xQ1bR7dLm; affiliate_id = a_4820; program_id = p_117; commission_rate = 12,00 %; commission_type = percent; cookie_days = 30; recurring_months = 0; created_at = 2026-03-04T09:12:41Z. De fire mærkede felter er rate-lock’en. Vinduet måles fra denne række – på vores server, så klienten ikke kan lyve om klikkets alder.
  3. t + 40 ms: Besøgeren lander i butikken med ?afid=. Et 302-redirect sender besøgeren videre med klik-id’et i URL’en. Butikkens script lægger id’et i en førstepartscookie på butikkens eget domæne og i localStorage. Begge fornys ved genbesøg, så et ryddet lager kan genoprette sig selv fra det andet. Gemt i browseren: cookie af_click = c_9fK2xQ1bR7dLm; cookie-levetid = 90 dage; localStorage = samme klik-id; domæne = butikkens eget (førstepart). Klientlageret er en kopi. Originalen – og vinduet – ligger på klik-rækken.
  4. dag 12: Butikken sænker satsen – og det rammer ikke dit klik. Tolv dage inde i vinduet ændrer butikken programmets sats fra 12,00 % til 8,00 %. Klik-rækken er uændret. Nye klik fra i morgen får den nye sats; klikket fra dag 0 beholder sin. Konverteringen regner på klikkets kopi, ikke på programmet som det ser ud i dag. Gemt i programs → clicks: programs.commission_rate = 12,00 % → 8,00 %; clicks.commission_rate = 12,00 % · uændret; clicks.cookie_days = 30 · uændret; dage tilbage af vinduet = 18. Det er her hele forskellen ligger: satsen bor på klikket, ikke på programmet.
  5. dag 21: Købet sker – ordren meldes ind. Ni dage senere køber besøgeren for 1.495,00 kr. Kvitteringssidens script eller platformens webhook melder ordren ind med klik-id’et. På Shopify melder begge veje – med vilje, så et salg ikke går tabt, hvis den ene fejler. Samme ordre kan ikke tælle to gange. Gemt i indkommende hændelse: click_id = c_9fK2xQ1bR7dLm; external_order_id = #10442; order_value = 1.495,00; currency = DKK. Hændelsen logges, uanset hvad den ender med at blive til. Også de meldinger, der ikke bliver til et salg.
  6. dag 21: record_conversion matcher klikket og regner på den låste sats. Serveren slår klik-id’et op, måler klikkets alder mod vinduet på klikket (21 ≤ 30), tjekker at ordre-id’et ikke er set før på programmet, og ganger ordreværdien med satsen fra klik-rækken. Salget oprettes som afventende – en konvertering krediterer aldrig automatisk en saldo. Gemt i conversions: click_id = c_9fK2xQ1bR7dLm; alder vs. vindue = 21 / 30 dage; sats brugt = 12,00 % · fra klikket; order_value = 1.495,00; commission = 179,40; status = pending. Med butikkens nye sats havde beløbet været 119,60 kr. Forskellen på 59,80 kr er rate-lock’en, gjort op i kroner.
  7. dag 51: Butikken har 30 dage til at afvise – ellers godkendes salget. Butikken kan afvise inden for 30 dage, og en afvisning kræver en årsag. Sker der ingenting, sætter et cron-job status til godkendt. Godkendt er ikke det samme som udbetalt: udbetaling er et selvstændigt skridt, og beløbet bestemmes af serveren ud fra godkendte salg. Gemt i conversions: status = pending → approved; afgjort af = cron/auto-approve; dage butikken havde = 30; commission = 179,40. En afvisning uden årsag er ikke mulig – feltet er påkrævet hele vejen ned i databasen.

Læg mærke til dag 12: butikken sænker satsen, og de to linjer deler sig. Klikket, der allerede er drevet, bliver liggende på sin egen sats. Hvilke fire felter der låses, står i rate-lock-afsnittet.

Klientsiden

Cookies i 2026 – hvad der reelt overlever.

Attributionen her hviler aldrig på en tredjepartscookie. Klik-id’et kommer først i URL’en, og bliver derefter til en førstepartscookie på butikkens eget domæne. Der er ingen tredjepart at blokere.

Safaris sporingsværn capper cookies sat fra JavaScript til omkring 7 dage. Derfor skriver scriptet klik-id’et til både cookie og localStorage og fornyer begge ved hvert genbesøg. Bliver cookien slettet, genoprettes den fra localStorage.

Fornyelsen forlænger ikke attributionen. Den holder kun id’et i live længe nok til, at serveren kan træffe afgørelsen. Selve vinduet måles fra klikkets eget tidsstempel, som browseren aldrig får lov at røre.

Hvad der ligger hvor

URL-parameter
?afid=<klik-id> · sættes af redirectet
Førstepartscookie
af_click · butikkens eget domæne
localStorage
af_click · overlever cookie-rydning
Serveren
klik-tidspunkt, vindue, sats – kilden til sandhed

Ryddes browseren helt, eller skiftes der enhed, er attributionen væk. Der er ingen skjult vej udenom.

Klikregistrering

Klikket ligger i vejen, ikke ved siden af.

En sporingspixel er en frivillig anmodning fra browseren. Den kan blokeres af en udvidelse, droppes af sporingsværn eller nå slet ikke at blive sendt, fordi brugeren navigerer videre først. Hvert tabt pixel-kald er et tabt klik i statistikken – og et klik, der aldrig kan bære et salg.

Vores klik er ikke en anmodning ved siden af. Det er selve vejen. Browseren skal forbi vores server for at nå butikken, og klik-rækken skrives før viderestillingen. Der er ikke et ekstra kald at blokere: en blokering, der stopper redirectet, stopper også besøgeren i at nå frem – og så er der ikke noget salg at spore.

Det gælder også de klik, vi ikke vil have. Kendte crawlere og link-previews – Facebook, Slack, curl, uptime-tjenester – bliver stadig sendt videre, så et delt link aldrig ser dødt ud. Men de får ingen klik-registrering og intet klik-id. Bots tælles ikke, og de kan derfor hverken forurene EPC, konverteringsrate eller optage en attribution. Er en affiliate suspenderet, sker det samme: besøgeren lander hos butikken, men klikket registreres ikke.

Attributionsvinduet

Vinduet afgøres på serveren.

Butikken vælger 14, 30, 45, 60 eller 90 dage. Standardvinduet er 45. Tallet kopieres over på klik-rækken i klikøjeblikket.

Ved konverteringen slår serveren klikket op på sit id, henter klikkets eget tidsstempel og sammenligner mod vinduet, der ligger på klikket – ikke mod programmet, som det ser ud i dag. Er klikket for gammelt, returneres expired og der gives ingen kredit.

Pointen er, hvem der bestemmer. Browseren sender et id, ikke et tidspunkt. Klienten kan altså ikke lyve om klikkets alder – hverken for at forlænge et udløbet vindue eller for at snige en konvertering ind. Det er også det, der gør cookie stuffing uinteressant: en cookie uden et registreret klik bag sig er ingenting.

Ærligt forbehold: der findes en ældre fallback-vej, hvor en konvertering meldes ind med affiliatens tracking-id og butikkens slug i stedet for et klik-id. Den vej kender ikke klikkets alder og kan derfor ikke håndhæve vinduet. Den er bevidst mere tilgivende – og den er grunden til, at vi ikke påstår at fange hvert eneste salg.

Modellen

Et klik-id. En model.

Der er præcis en attributionsmodel: sidste-klik, afgjort af det klik-id, konverteringen bærer. Ingen deling mellem flere affiliates, ingen multi-touch-vægtning, ingen view-through-kredit for visninger uden klik.

En model er lettere at efterprøve end fem. Begge parter kan pege på det samme klik og blive enige om, hvad der skete.

Rate-lock

Provisionen låses i det øjeblik, der klikkes.

Cookie-vinduet er ikke det eneste, der fryses. Fire felter kopieres fra programmet over på klik-rækken, og det er dem, konverteringen regner på:

  • commission_rate

    Satsen. Sænker butikken den i morgen, rammer det ikke trafik, du allerede har sendt.

  • commission_type

    Procent eller fast beløb. Kan ikke skiftes under fødderne på et drevet klik.

  • cookie_days

    Vinduet, målt fra dette klik. Uafhængigt af senere programændringer.

  • recurring_months

    Antal måneder på abonnementer. En igangværende aftale kan ikke skæres ned bagefter.

Der er en beslægtet ting værd at kende, når man læser en provisionssats hos os: affiliaten får den fulde sats, butikken sætter. Netværksgebyret lægges oven i butikkens omkostning – det trækkes ikke fra affiliatens provision. Satsen på programsiden er altså den sats, der udbetales. Se satserne i programkataloget.

Ved checkout

Hvad der sker på hver platform.

Alle veje ender samme sted: en funktion på databasen, der slår klikket op, håndhæver vinduet, tjekker dubletter og opretter salget som afventende. Det er vejen derhen, der er forskellig.

Shopify

To veje ind, et salg ud.

En Web Pixel læser klik-id’et fra ordren, og en HMAC-verificeret webhook melder ordren igen fra Shopifys server. Begge sender samme ordre-id, så dedup lader den tælle en gang. Refunderes eller annulleres ordren, afvises provisionen automatisk.

Stripe

Signeret webhook, ingen API-nøgle.

Vi beder aldrig om din Stripe-API-nøgle – kun en webhook signing-secret, som udelukkende kan verificere afsenderen. Provision beregnes ekskl. moms. Ved abonnementer krediteres også fornyelser, i det antal cyklusser, der lå låst på klikket.

Eget website

Et script, en linje på kvitteringen.

Scriptet ligger site-wide og gemmer klik-id’et. Kvitteringssiden kalder en funktion med ordrenummer og beløb. Indmeldingen sendes med sendBeacon, så den overlever, at siden navigerer videre umiddelbart efter – fx til en tak-side.

Webhook-vejene er server-til-server tracking i ordets egentlige forstand: butikkens server taler med vores, uden at gå gennem en browser. Det er derfor, de ligger uden for en ad-blockers rækkevidde – og derfor, de er den vej, vi bygger først, hvor platformen tillader det. To ærlige forbehold: automatisk afvisning ved refundering findes indtil videre kun på Shopify – Stripe-refusioner og site-script-salg skal afvises manuelt af butikken. Og WooCommerce har sit forbindelses-endpoint klar, men plugin'en lever i sit eget repo og er ikke en færdig integration, vi påstår noget om her.

Filtrene

Hvad der ikke tælles.

Hver indmeldt hændelse får en resultat-status. Det er de faktiske navne fra loggen – dem, butikken selv kan se, når et salg ikke landede som forventet.

  • duplicate

    Samme ordre kom ind to gange

    Dedup sker på ordre-id pr. program. Shopify melder samme ordre både fra web-pixel og fra webhook – med vilje, så et salg ikke går tabt, hvis den ene vej fejler. Ordren tælles en gang.

  • expired

    Klikket var for gammelt

    Konverteringen kom efter det vindue, der lå på klikket. Ingen kredit. Vinduet læses fra klikket, ikke fra programmet, som det ser ud i dag.

  • blocked

    Butikken har blokeret affiliaten

    Spærret af en trigger på databasen, ikke af en if-sætning i en API-rute. Alle indsætningsveje er lukket – også dem, der bygges i morgen.

  • store_mismatch

    Webhooken pegede på en anden butiks program

    En butiks webhook kan kun kreditere sin egen butiks program. Forsøget logges og afvises.

  • not_recurring

    Fornyelse på et program uden løbende provision

    Abonnementet fornys, men programmet betaler kun for det første salg. Hændelsen logges, så butikken kan se, hvorfor der ikke kom provision.

  • no_affiliate

    Der var intet klik-id på hændelsen

    Et helt almindeligt salg uden affiliate bag. Det logges også – ellers kan man ikke se forskel på "ingen affiliate" og "tracking gik i stykker".

Detaljen, der koster mest, hvis den mangler

Står ordre-id’et stadig som pladsholderen fra installationsguiden – DIN_ORDRE_ID, {{order_id}} og lignende – behandler vi det som intet id i stedet for som et rigtigt. Ellers ville det første salg lægge beslag på id’et, og hvert eneste salg derefter blive afvist som dublet. For altid, og helt lydløst. Det er bedre at risikere en dobbelttælling, butikken kan afvise, end et stille tab af alle salg.

Placeringer

Sporing pr. side – uden at spore besøgende.

Browsere sender i dag kun domænet som referrer, aldrig stien. For en affiliate betyder det, at spørgsmålet »hvilken af mine sider skabte det salg?« ikke kan besvares af trafikdata alene.

Løsningen er et script på affiliatens eget site. Det tilføjer den aktuelle sides URL til alle Affilyflow-links på siden – også links, der indsættes senere ved uendelig scroll, SPA-navigation eller popups. URL’en normaliseres til domæne plus sti, så query og hash ikke splitter en side op i mange rækker. Klikket bærer derefter sin placering med sig hele vejen til konverteringen.

Scriptet sætter ingen cookies, sporer ingen besøgende og kalder ikke hjem. Det skriver et parameter på et link, og det er alt. Kombineret med sub-ID tracking og deeplinks giver det indtjening pr. URL frem for pr. konto.

Dashboardet viser, hvor stor en andel af klikkene der har en kendt side, og fremhæver det, når dækningen falder under 80 %. Et tal, man ikke kan stole på, er værre end intet tal – så vi viser, hvor meget af billedet der mangler.

Overvågning

Vi logger også det der aldrig blev til et salg.

Hver eneste tracking-hændelse skrives til en hændelseslog: kilde, ordre-id, klik-id, beløb, moms, rabat – og vores resultat-status. Også hændelser, der ikke blev til en konvertering.

De to ting holdes bevidst adskilt: konverteringstabellen indeholder kun penge-sandheden, hændelsesloggen er det rå diagnostiske spor. Uden loggen kan man ikke se forskel på »der kom ingen salg« og »salgene kom, men blev afvist af en grund, ingen opdagede«. Butikken kan læse sine egne hændelser.

Heartbeat · hver 6. time

Vi overvåger selv, om dit tracking-script er nede, og siger til. Hver 6. time henter vi forsiden på hver aktiv butik og tjekker, om scriptet stadig ligger der.

Går status fra live til nede, sender vi en mail. En – ikke en hver sjette time. Og svarer siden slet ikke, noterer vi kun, at vi har kigget: en netværksfejl skal ikke kaldes et nedbrud.

Grænserne

Hvad vi ikke gør.

Det følgende er ikke mangler, vi er på vej til at lukke. Det er valg. Og det er den del af siden, vi helst vil citeres for.

Ingen fingerprinting

Vi bygger ingen enhedsprofil af skærmstørrelse, skrifttyper og tidszone for at genkende en browser, der ikke vil genkendes. Hvad fingerprinting er.

Ingen cross-device

Klikker nogen på mobilen og køber på laptoppen, bliver salget ikke tilskrevet. Der er ingen identity graph, der binder de to sammen.

Ingen cookieløs attribution

Attributionen hviler på et klik-id i URL’en plus et klientlager. Sælger nogen dig cookieløs sporing i 2026, så spørg, hvad der er under motorhjelmen. Hvad cookieløs sporing er.

Ingen påstand om 100 %

Fallback-vejen kender ikke klikkets alder og kan ikke håndhæve vinduet. Klientlagre bliver ryddet. Nogle salg lander ikke – og et netværk, der påstår andet, har ikke læst sin egen kode.

Spørgsmål

Det, folk faktisk spørger om.

  • Hvor længe holder attributionen efter et klik?

    Butikken vælger 14, 30, 45, 60 eller 90 dage. Tallet kopieres over på selve klikket i det øjeblik, der klikkes, og serveren måler konverteringen mod det tal. Ændrer butikken vinduet i morgen, rører det ikke de klik, du allerede har sendt.

  • Hvad sker der, hvis kunden rydder sine cookies?

    Klik-id’et ligger både i en førstepartscookie og i localStorage, og begge fornys ved genbesøg – så en slettet cookie kan genoprettes fra det andet lager. Er begge væk, er attributionen væk. Vi har ingen fingerprint-fallback, der gætter på, hvem personen var.

  • Virker tracking med ad-blockers slået til?

    Klikket gør, altid: det er et redirect gennem vores server, som browseren skal forbi for at nå butikken. Konverteringen afhænger af vejen. Shopify- og Stripe-salg meldes også ind server-til-server via signerede webhooks, som aldrig rører browseren. Site-scriptet kører derimod i browseren og kan blokeres – derfor bygger vi webhook-vejen først, hvor platformen tillader det.

  • Kan butikken sænke min provision, efter jeg har sendt trafikken?

    Nej. Sats, provisionstype, cookie-dage og antal recurring-måneder gemmes på klik-rækken og bruges ved konverteringen. En igangværende recurring-aftale kan heller ikke skæres ned bagefter. Og affiliaten får den fulde sats, butikken sætter – vores gebyr lægges oven i, det trækkes ikke fra provisionen.

  • Tæller samme ordre to gange, når Shopify melder den både fra pixel og webhook?

    Nej. Dedup sker på ordre-id pr. program, og Shopifys to formater (gid://shopify/Order/123 og 123) normaliseres til samme id. Den dobbelte indmelding er med vilje – den er redundans, ikke dobbelttælling. Den ekstra hændelse logges som duplicate, så det kan ses, at begge veje virker.

  • Sporer I på tværs af enheder?

    Nej. Klikker nogen på mobilen og køber på laptoppen, bliver salget ikke tilskrevet. Vi kunne gætte med fingerprinting eller en identity graph – vi gør det ikke. Det betyder også, at vi ikke kan love at fange hvert eneste salg, og det siger vi hellere højt end at love det modsatte.

Kom i gang

Tracking du kan efterprøve.

Butikker installerer et script eller forbinder deres platform. Affiliates får et link, der virker fra første klik. Begge sider kan se præcis, hvad der blev registreret.