# Stripe

> Spor salg fra Stripe Checkout og Payment Links med en webhook – engangskøb, abonnementer og refusioner.

Tager kunderne betaling i Stripe Checkout eller via Payment Links på jeres eget site, melder Stripe salget direkte til os gennem en webhook. Det dækker engangskøb, abonnementer og fornyelser. Der skal ikke et sporingsscript på siden – men klik-id'et skal med til Stripe.

> [!NOTE]
> Kører shoppen på Shopify, WooCommerce eller en af de danske platforme, så vælg den platform i Opsætning – også selvom betalingen går gennem Stripe. Vælg kun **Stripe**, når kunderne betaler i Stripe Checkout eller via Payment Links.

## Før du starter

- Adgang til jeres Stripe-dashboard.
- Adgang til koden, der opretter Checkout Sessions – eller til jeres Payment Links.
- Jeres butiks-id. Adressen under **Program → Opsætning** har det sat ind; her står `DIN_BUTIK` i stedet.

Vi beder aldrig om jeres Stripe-API-nøgle. I giver os kun webhookens signing secret, som udelukkende kan bekræfte, at en besked kommer fra jer.

## 1. Opret webhooken

I Stripe: gå til **Workbench → Webhooks → Create an event destination**.

1. Vælg **Your account** og payload-formatet **Snapshot** – ikke Thin, som Stripe foreslår. Thin sender ikke ordredataene, og så kan salget ikke registreres.
2. Vælg begivenhederne:
  - `checkout.session.completed`
  - `checkout.session.async_payment_succeeded`
  - `invoice.payment_succeeded`
  - `customer.subscription.deleted`
  - `charge.refunded`
  - `charge.dispute.created`
3. Vælg **Webhook endpoint**, og brug adressen:

```text title="Webhook-URL"
https://app.affilyflow.com/api/stripe/webhook/DIN_BUTIK
```

`invoice.payment_succeeded` og `customer.subscription.deleted` skal kun med, når I sælger abonnementer med provision på fornyelser.

> [!WARNING]
> Refusions-begivenhederne er vigtige: uden dem bliver et refunderet køb eller en indsigelse til provision, I skal betale. Og `checkout.session.async_payment_succeeded` fanger betalinger, der først gennemføres senere (fx bankoverførsel) – uden den registreres de salg aldrig.

## 2. Indsæt signing secret

Kopier endpointets **Signing secret** (starter med `whsec_`), og indsæt den under **Opsætning** i Affilyflow. Uden den afviser vi alle hændelser. Send den ikke i en mail – det er butiksejeren, der indsætter den.

## 3. Send klik-id'et med

Affiliates sender kunder til jeres site med `?afid=…` i adressen. Gem klik-id'et i en cookie på jeres topdomæne, når kunden lander, så det overlever skiftet fra www til fx et app-subdomæne:

```js title="Alle sider"
// On every page: keep the click ID from ?afid= in a cookie on your main domain (90 days)
const afid = new URLSearchParams(location.search).get('afid');
if (afid && /^c_[A-Za-z0-9_-]{4,64}$/.test(afid)) {
  const domain = location.hostname.split('.').slice(-2).join('.');
  document.cookie = 'af_click=' + afid + '; domain=.' + domain + '; path=/; max-age=7776000; SameSite=Lax; Secure';
}
// On your server, read the af_click cookie from the request when creating the Checkout Session.
```

Send det med som `client_reference_id`, når I opretter Checkout Session:

```js title="client_reference_id"
// stripe.checkout.sessions.create({ ...,
client_reference_id: req.cookies.af_click || undefined,
// })
```

- Domænet regnes som de to sidste led af adressen. Har jeres domæne flere led (fx `.co.uk`), så ret det til jeres eget.
- Opretter I sessionen på serveren, skal værdien sendes med fra browseren i forespørgslen.
- Bruger I **Payment Links**, så sæt klik-id'et på linket som `?client_reference_id=…`.

Tjek bagefter i Stripe, at `client_reference_id` på begivenheden `checkout.session.completed` er `"c_…"` og ikke `null`. Er den `null`, nåede klik-id'et ikke frem – tjek cookie-domænet.

## Hvad Stripe melder

- **Beløbet.** Provisionen regnes af betalingens beløb uden moms, direkte fra Stripe.
- **Valuta.** Salg i andre valutaer omregnes til kroner med ECB-kursen på salgstidspunktet, og kursen låses på salget.
- **Abonnementer.** Slå recurring provision til under **Program**, så giver hver fornyelse automatisk provision, så længe programmet siger. Samme faktura kan aldrig tælle to gange.
- **Refusioner.** En hel refusion eller en indsigelse afviser salget, og affiliaten får besked. En delvis refusion nedsætter provision og gebyr i samme forhold. Betaler programmet et fast beløb pr. salg, ændres det ikke af en delvis refusion.

## Test

Stripe sender ikke testbetalinger videre til os – betalinger i testtilstand registreres ikke. Vil I teste:

1. Tryk **Åbn testlink** under testtrinnet i Opsætning.
2. Køb noget billigt med et rigtigt kort i samme browser.
3. Refunder købet bagefter i Stripe.

Live-testen i Opsætning viser testklikket og købet. Ellers bekræftes sporingen af sig selv ved det første affiliate-køb, og programmet bliver synligt for affiliates, når vi har modtaget den første hændelse fra jeres webhook.

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