# Specialbygget webshop

> Sæt sporingen op på en webshop, der er kodet til jer, fx i Laravel eller PHP – uden at kende feltnavne.

Har I en webshop, der er udviklet til jer – fx i Laravel, Symfony eller et andet framework – kræver sporingen to ting: et script på alle sider og en måde at melde salget på. Salget kan I ofte melde uden at røre kvitteringssiden, fordi jeres site allerede sender købet til Google Analytics. Ellers er det en enkelt linje HTML.

## Før du starter

- Jeres hjemmeside skal være gemt i installationstrinnet under **Program → Opsætning** – scanningen og testlinket bruger den.
- Vælg **Specialbygget webshop** under **Hvor sælger du?**.
- Jeres butiks-id. Kodestumperne i Opsætning har det sat ind; her står `DIN_BUTIK` i stedet.

## Det beløb, provisionen regnes af

Provisionen regnes af **varerne efter rabat, uden moms og fragt**. Gebyrer er heller ikke med. Det er det beløb, salget skal meldes med – uanset hvilken vej I vælger nedenfor.

## 1. Scriptet på alle sider

Indsæt scriptet i `<head>` i jeres fælles layout, så det er med på alle sider – også kvitteringen. Det husker affiliate-klikket, når kunden lander, så et senere køb kan krediteres.

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

Scriptet har `async`, så det aldrig holder siden tilbage. Hvad det gemmer, og hvornår, står i [track.js](https://www.affilyflow.com/docs/reference/track-js).

## 2. Start med "Scan jeres site"

Tryk **Scan jeres site** i salgstrinnet. Vi henter jeres forside og en produktside (højst tre sider, evt. via en kategoriside) og kigger efter to ting:

- **Google Analytics 4-e-handel** – hændelser som `view_item`, `add_to_cart` eller `begin_checkout` med varer, sendt gennem `dataLayer` eller `gtag`.
- **Google Tag Manager eller et GA4-tag** uden synlige købsdata.

Finder vi e-handelsdata, måler vi også, om beløbene i Google Analytics er med moms: vi sammenligner prisen i `view_item` med den pris, produktsiden selv viser. Kan det ikke måles, bruges jeres lands standardmoms.

Scanningen ser også efter et cookiebanner. Bruger sitet Cookiebot eller Cookie Information, sættes **Cookiebanner** til *Vent på samtykke*: scriptet får `data-consent="required"` og gemmer først klikket, når kunden har sagt ja til marketing. Indstillingen kan altid skiftes i Opsætning. Se [Samtykke og cookies](https://www.affilyflow.com/docs/butik/samtykke-og-cookies).

| Resultat | Det betyder |
|---|---|
| Fundet: jeres site sender købsdata til Google Analytics | Opsætning skifter til **Automatisk fra Google Analytics**. Se vej A. |
| Google Tag Manager fundet – men ingen købsdata at se | Ved jeres udvikler, at Tag Manager sender købet til GA4, kan I vælge vej A. Ellers vej B. |
| Ingen købsdata fra Google Analytics fundet | Brug linjen på kvitteringssiden – vej B. |
| Sitet afviste scanningen | Fx et bot-værn. Brug vej B, eller vælg vej A, hvis I ved, at sitet sender købet til GA4. |

Under **Sådan meldes salget** kan I altid skifte mellem **Automatisk fra Google Analytics** og **Linje på kvitteringssiden**.

> [!WARNING]
> Brug en vej, ikke begge. Har kvitteringssiden allerede salgslinjen, skal scriptet ikke også have `data-sale="ga4"`.

## Vej A: Automatisk fra Google Analytics

Sender jeres kvitteringsside allerede en GA4-hændelse `purchase`, kan scriptet læse købet selv. Der skal ingen kode på kvitteringssiden, og ingen behøver kende skabelonens feltnavne. Scriptet får blot `data-sale="ga4"`:

```html title="<head> · alle sider · med Google Analytics"
<script src="https://app.affilyflow.com/track.js" data-store="DIN_BUTIK" data-sale="ga4" data-sale-vat="25" async></script>
```

Kopier den præcise linje fra Opsætning – den har jeres indstillinger med:

- `data-sale-vat="25"` står der, når beløbene i Google Analytics er med 25 % moms. Momsen trækkes fra. Er beløbene uden moms, står attributten der ikke.
- `data-sale-shipping="incl"` eller `"excl"` står der, når I har valgt **Med fragt** eller **Uden fragt**. Med **Find selv** gætter scriptet: er `value` større end varelinjerne, regnes fragten med og trækkes fra.

Scriptet læser hændelsen i begge former:

```js title="Det læser scriptet på kvitteringssiden"
dataLayer.push({ event: 'purchase', ecommerce: { transaction_id: 'A-1008', value: 724.00, shipping: 49.00, currency: 'DKK', items: [ /* ... */ ] } });
// eller
gtag('event', 'purchase', { transaction_id: 'A-1008', value: 724.00, shipping: 49.00, currency: 'DKK', items: [ /* ... */ ] });
```

Ordrenummeret er `transaction_id`, og beløbet er `value` – minus fragten, når den er med – divideret med momsen. Scriptet holder øje med `dataLayer` i 60 sekunder, så en hændelse, der kommer efter siden er indlæst, kommer også med.

> [!TIP]
> Moms og fragt gemmes hos os, når I vælger dem i Opsætning, og vi regner GA4-beløbet om med jeres indstilling, når salget kommer ind. Retter I momsen eller fragten senere, gælder det fra næste salg – scriptet på sitet skal ikke ændres.

Mere om vejen i [Google Analytics](https://www.affilyflow.com/docs/reference/google-analytics).

## Vej B: Linjen på kvitteringssiden

Sender sitet ikke købet til Google Analytics, sætter I en linje HTML et sted i `<body>` på kvitteringssiden – siden kunden ser efter et gennemført køb:

```html title="Kvitteringssiden · et sted i <body>"
<div hidden data-affilyflow-order="DIN_ORDRE_ID" data-affilyflow-total="DIT_BELOEB"></div>
```

Erstat `DIN_ORDRE_ID` med jeres variabel for ordrens nummer og `DIT_BELOEB` med beløbet for varerne efter rabat, uden moms og fragt. Der er ingen JavaScript at skrive: scriptet finder linjen og melder salget.

Sådan ser det ud i de mest almindelige skabelonsprog. **Feltnavnene er eksempler** – brug dem, jeres system har på kvitteringssiden:

```blade title="Laravel (Blade)"
<div hidden data-affilyflow-order="{{ $order->id }}" data-affilyflow-total="{{ $order->subtotal }}"></div>
```

```php title="PHP"
<div hidden data-affilyflow-order="<?= $order->id ?>" data-affilyflow-total="<?= $order->subtotal ?>"></div>
```

```twig title="Twig"
<div hidden data-affilyflow-order="{{ order.id }}" data-affilyflow-total="{{ order.subtotal }}"></div>
```

```liquid title="Liquid"
<div hidden data-affilyflow-order="{{ order.id }}" data-affilyflow-total="{{ order.subtotal }}"></div>
```

```smarty title="Smarty"
<div hidden data-affilyflow-order="{$order.id}" data-affilyflow-total="{$order.subtotal}"></div>
```

> [!WARNING]
> En "subtotal" er ikke altid uden moms. Er jeres beløb med moms, så brug et beløb uden – eller tilføj `data-affilyflow-vat="25"`, så trækkes 25 % fra. Ordrenummeret skal være det rigtige nummer: uden det kan en genindlæst kvittering tælle som et nyt salg.

### Det kan linjen også

| Attribut | Virkning |
|---|---|
| `data-affilyflow-vat="25"` | Beløbet er med 25 % moms, som trækkes fra. |
| `data-affilyflow-currency="EUR"` | Valutaen, når I ikke sælger i kroner. Standard er `DKK`. |
| `data-affilyflow-order="?orderId"` | Læser ordrenummeret fra parameteren `orderId` i sidens adresse. |
| `data-affilyflow-total="#af-total"` | Læser beløbet fra teksten i elementet med id'et `af-total`. |

Beløb som `1249.50` og `1.249,50` virker begge. Tegner jeres side kvitteringen efter indlæsning (fx Livewire eller React), finder scriptet linjen alligevel: det holder øje med siden i 60 sekunder, og når linjen er der, venter det op til 20 sekunder på, at ordrenummer og beløb er udfyldt. Hver linje meldes kun en gang.

Alle detaljer står i [Salgslinjen](https://www.affilyflow.com/docs/reference/salgslinje).

## Kender I ikke feltnavnene?

Det gør jeres kode. Under **Lad jeres AI-kodeassistent sætte det op** i Opsætning ligger en færdig prompt. Kopier den ind i Claude Code, Cursor, Copilot eller ChatGPT i jeres projekt – assistenten kan se koden, finde kvitteringssiden og de rigtige felter og indsætte linjen. Prompten ser sådan ud (med jeres adresse og butiks-id):

```text title="Prompt til AI-kodeassistenten"
Sæt Affilyflow-affiliatesporing op i dette projekt (dinbutik.dk).

1. Indsæt dette script i <head> i det fælles layout, så det er med på alle sider:
<script src="https://app.affilyflow.com/track.js" data-store="DIN_BUTIK" async></script>

2. Find visningen, kunden ser efter et gennemført køb (ordrebekræftelsen/kvitteringen), og de variabler, der er tilgængelige der. Indsæt dette et sted i <body> på den side:
<div hidden data-affilyflow-order="ORDRENUMMER" data-affilyflow-total="BELØB"></div>
   - ORDRENUMMER = ordrens nummer, som kunden ser det.
   - BELØB = varernes beløb efter rabat, UDEN moms og UDEN fragt og gebyrer, med punktum som decimaltegn (fx 540.00). Findes kun et beløb med moms, så divider med 1.25 (25 % moms).
   - Brug skabelonsprogets almindelige udskrivning (med escaping). Opfind ikke feltnavne – find dem i ordremodellen, controlleren eller visningen.
   - Ændr ikke checkout eller andre filer end layoutet og kvitteringsvisningen.

3. Skriv til sidst, hvilke filer du ændrede, og hvilke variabler du brugte til ordrenummer og beløb.

Testen sker bagefter i Affilyflow: Opsætning → Åbn testlink → læg en testordre. Siden viser ordrenummer og beløb, der kom frem.
```

Ved I selv, hvad felterne hedder, så åbn **Ved I selv, hvad felterne hedder?** og skriv variablerne for ordrenummer og beløb – linjen bygges med dem. Knapperne under felterne viser skrivemåden i Blade, PHP, Twig, Liquid og Smarty.

Er det en udvikler eller et bureau, der skal gøre det, så tryk **Send til udvikler**. Vi mailer guiden med scriptet, linjen, prompten og testtrinnet.

## 3. Test

1. Tryk **Åbn testlink** under testtrinnet, og læg en testordre i den fane, der åbner – i samme browser.
2. Bliv på Opsætning. Live-testen viser testklikket og derefter købet med ordrenummer og beløb. Den følger med i op til 10 minutter.
3. Svar på spørgsmålet: **Er beløbet varernes beløb efter rabat, uden moms og fragt, på din testordre?** Svarer I nej, skriver I det rigtige beløb, og live-testen siger, hvad der er galt – fx at beløbet er med moms eller med fragt.

På vej A viser live-testen også udregningen, fx "724,00 kr. fra Google Analytics − 49,00 kr. fragt ÷ 1,25 = 540,00 kr." Er beløbet med moms eller fragt, kan I rette det med et klik (**Træk momsen fra** eller **Træk fragten fra**). Rettelsen gælder fra næste salg, uden at scriptet skal ændres – lav et nyt testkøb for at se det.

Et testkøb giver ingen provision eller gebyr og tæller ikke med i jeres tal. Annuller ordren bagefter i jeres shop.

> [!NOTE]
> Programmet bliver først synligt for affiliates, når scriptet er fundet på forsiden, og salgskoden har meldt et køb. Testkøbet tæller.

## Typiske fejl

Fejl fra linjen eller scriptet står i browserens konsol på kvitteringssiden:

| Konsollen skriver | Årsag |
|---|---|
| `data-affilyflow-order must be the order number` | Ordrenummeret er tomt eller står stadig som pladsholder. |
| `data-affilyflow-total must be the amount (goods excl. VAT and shipping)` | Beløbet er tomt eller 0. |
| `the purchase event has no amount` | GA4-hændelsen `purchase` havde intet beløb. |

Kommer der slet intet salg, så tjek, at scriptet også ligger på kvitteringssiden, og at testkøbet er lavet i samme browser som testlinket. Mere i [Test og fejlfinding](https://www.affilyflow.com/docs/butik/test-og-fejlfinding).

## Lead-programmer

Betaler programmet pr. lead i stedet for pr. køb, skal der ikke meldes et beløb. Skriv adressen på jeres tak-side under **Automatisk lead-sporing** i Opsætning, så får scriptet tak-sidens adresse med og tæller leads alene:

```html title="<head> · alle sider · lead-program"
<script src="https://app.affilyflow.com/track.js" data-store="DIN_BUTIK" data-lead-url="/tak"></script>
```

Her er scriptet uden `async`, fordi det skal nå at tælle leadet, før tak-siden eventuelt sender kunden videre. Lader I feltet stå tomt, viser Opsætning i stedet et lead-script til tak-siden.

## Andre måder at melde salget

Linjen og Google Analytics-vejen dækker de fleste systemer. Den ældre JavaScript-funktion `affilyflow.conversion()` virker stadig – se [track.js](https://www.affilyflow.com/docs/reference/track-js). Melder I salget fra jeres egen server, så brug [konverterings-API'et](https://www.affilyflow.com/docs/reference/konverterings-api).

Kilde: https://www.affilyflow.com/docs/butik/specialbygget
