Praktisk integrationsguide

Kom igång med en länk. Bygg vidare när ni behöver.

Handlare och portaler kan visa erbjudanden genom att kopiera en placeringslänk eller en kodrad. Erbjudandepartners använder en servernyckel för att publicera erbjudanden och rapportera vad som händer efter klicket.

För handlare, medlemsportaler och publicister

1. Kopiera en länk eller kodrad

Börja med Skapa konto, verifiera er e-postadress och välj handlarens arbetsyta. Registrera verksamhetens namn och webbplats online. Efter organisationsgodkännande kan ni välja partners; en partner med manuell granskning behöver dessutom godkänna er ansökan.

Öppna handlarportalen, välj godkända erbjudanden och skapa en placering för varje kanal. Välj placeringen under Integration och kopiera länken. Placerings-ID är publikt och är ingen hemlig nyckel.

Vanlig länk: tacksida, portal, app eller mejl

Kodexempel
https://afterperk.se/offers/PLACERINGS-ID

Klistra in länken där besökaren själv kan välja att se erbjudanden. I mejl fungerar den utan script. Handlarportalen kan även kopiera ett färdigt HTML-block till ert befintliga mejlverktyg.

Inbäddad modul: webbplats som tillåter script

Kodexempel
<script async src="https://afterperk.se/embed.js" data-placement="PLACERINGS-ID"></script>

Placera kodraden efter det genomförda köpet eller på en förmånssida. Den hämtar publika erbjudanden i en isolerad iframe och läser inte order-ID, ordervärde eller kundens mejl. Om er webbplats har CSP, tillåt https://afterperk.se i script-src, connect-src och frame-src. Kontrollera att er egen sida fungerar även om erbjudandemodulen inte laddar.

Shopify tacksida

En vanlig erbjudandelänk kan användas där butiken tillåter den. En modul på Shopify Thank you-sidan kräver en separat Checkout UI extension, appinstallation, nätverksåtkomst och konfiguration i checkout-editorn. Källkod för tillägget finns i projektet; det innebär inte att en Shopify-app redan är installerad.

Valfritt för er egen presentation

2. Bygg en egen erbjudandevy

Om ni behöver visa erbjudandena i er egen webbplats eller app kan ni läsa det publika API:t. Det kräver ingen nyckel och svarar med kundfält för en aktiv placering. Visa alltid beskrivning, provperiod, fortsatt pris och villkor. Använd erbjudandets id i den spårade länken.

Kontrollera en publik placering
export AFTERPERK_BASE_URL="https://afterperk.se"
export AFTERPERK_PLACEMENT_ID="ERSÄTT_MED_PLACERINGS_ID"
curl --fail-with-body -sS -G "$AFTERPERK_BASE_URL/api/offers" \
  --data-urlencode "placementId=$AFTERPERK_PLACEMENT_ID"

Ett tillgängligt placerings-ID ger HTTP 200 med placement, offers och demoMode. En aktiv placering kan ha en tom lista. Varje erbjudande har bland annat id, name, description, trialDays, priceAfter och terms. En otillgänglig placering ger 404 med JSON-fältet error.

Svarsexempel utan tillgängliga erbjudanden
{
  "placement": {"id": "PLACERINGS-ID", "name": "PLACERINGENS_NAMN", "organizationName": "ER_ORGANISATION"},
  "offers": [],
  "demoMode": false
}
Spårad länk för ett valt erbjudande
https://afterperk.se/r/PLACERINGS-ID?offerId=ERBJUDANDE-ID

Ett vanligt webbläsarklick på /r/… skapar klickreferensen och skickar besökaren till partnerns konfigurerade destination. En sidvisning eller HEAD-förfrågan räknas inte som ett klick. Begäranden som identifieras som prefetch, prerender eller känd förhandsvisningsbot returnerar 204 utan klick; ett vanligt GET-anrop till redirecten skapar ett klick. Lägg aldrig portal- eller partnernycklar i klientkod.

För erbjudandepartners

3. En partner, ett erbjudande, en konvertering

Skapa konto med verifierad e-post och välj leverantörens arbetsyta. Registrera företaget online och invänta organisationsgodkännande. Därefter gör ni anslutningen nedan; ni kan lägga upp erbjudandet i ett formulär om ni inte behöver automatisk API-synkning.

  1. Skapa anslutning. Öppna leverantörsportalen, skapa en partneranslutning och spara en Bearer API-nyckel på er server. Välj bara de behörigheter ni behöver: offers:read, offers:write, conversions:write och/eller reports:read. Nyckeln visas en gång och är låst till er organisation och partner.
  2. Publicera erbjudande. Använd portalens erbjudandeformulär eller POST /api/v1/provider/offers med offers:write. Behåll samma externalOfferId vid uppdateringar. Destinationen måste vara HTTPS och innehålla {click_id}. Nya eller ändrade uppgifter granskas; partnern och organisationen behöver också vara aktiva. Ersättning, handlarandel och live-status sätts inte via detta API.
  3. Rapportera händelsen. Ta emot click_id i er destination, bind det till er transaktion och skicka en serverbegäran till POST /api/v1/provider/conversions med conversions:write. Skicka aldrig nyckeln från besökarens webbläsare.

Följande terminalexempel använder AFTERPERK_BASE_URL och AFTERPERK_API_KEY. Sätt nyckeln som en serverhemlighet i er miljö; klistra inte in den i kod, klienten eller ett publikt repo. Byt alla platshållare mot era verkliga, godkända uppgifter.

Miljö för serveranrop
export AFTERPERK_BASE_URL="https://afterperk.se"
: "${AFTERPERK_API_KEY:?Sätt servernyckeln i er hemlighetshanterare}"

Kontrollera servernyckeln före skrivning

Ge nyckeln offers:read om ni vill använda läskontrollen. En nyckel med enbart offers:write kan publicera men inte läsa erbjudandelistan.

Läs era egna erbjudanden
curl --fail-with-body -sS "$AFTERPERK_BASE_URL/api/v1/provider/offers" \
  -H "Authorization: Bearer $AFTERPERK_API_KEY"

HTTP 200 ger ett JSON-objekt med offers, som kan vara en tom lista: {"offers":[]}. 401 betyder att Bearer-formatet är ogiltigt; 403 kan betyda saknad offers:read, återkallad nyckel eller ogiltig partnerkoppling. Detta är leverantörens privata, partneravgränsade API; den publika placeringskontrollen ovan använder ingen nyckel.

Exempel: erbjudande för granskning

Skapa offer.json och skicka erbjudandet
cat > offer.json <<'JSON'
{
  "externalOfferId": "ERT_STABILA_ERBJUDANDE_ID",
  "name": "Erbjudandets namn",
  "category": "Kategori",
  "description": "Kundbeskrivning",
  "trialDays": 14,
  "priceAfter": "Ordinarie pris och period",
  "terms": "Fullständiga villkor",
  "destinationUrl": "https://partner.example/erbjudande?click_id={click_id}"
}
JSON
curl --fail-with-body -sS -X POST "$AFTERPERK_BASE_URL/api/v1/provider/offers" \
  -H "Authorization: Bearer $AFTERPERK_API_KEY" \
  -H "Content-Type: application/json" --data-binary @offer.json

Vid lyckad mottagning svarar API:t med HTTP 200 och data.status, vanligtvis pendingReview för ett nytt erbjudande. Erbjudandet blir synligt först efter nödvändiga godkännanden.

Exempel: konverteringshändelse

Sätt variablerna till referenser från en verklig testhändelse. AFTERPERK_ACTION_AT ska vara händelsens ISO 8601-tid med tidszon; AFTERPERK_COMMISSION_MINOR ska vara avtalad provision i hela ören. Spara JSON-filen och återanvänd exakt samma fil vid nätverksåterförsök.

Skapa conversion.json och rapportera händelsen
export AFTERPERK_EVENT_ID="ERSÄTT_MED_UNIKT_HÄNDELSE_ID"
export AFTERPERK_TRANSACTION_ID="ERSÄTT_MED_STABILT_TRANSAKTIONS_ID"
export AFTERPERK_CLICK_ID="ERSÄTT_MED_KLICK_ID_FRÅN_REDIRECT"
export AFTERPERK_COMMISSION_MINOR="ERSÄTT_MED_AVTALAD_PROVISION_I_ÖREN"
export AFTERPERK_ACTION_AT="ERSÄTT_MED_VERKLIG_ISO_8601_TID"
cat > conversion.json <<JSON
{
  "event_id": "$AFTERPERK_EVENT_ID",
  "transaction_id": "$AFTERPERK_TRANSACTION_ID",
  "click_id": "$AFTERPERK_CLICK_ID",
  "status": "pending",
  "currency": "SEK",
  "commission_minor": $AFTERPERK_COMMISSION_MINOR,
  "action_at": "$AFTERPERK_ACTION_AT"
}
JSON
curl --fail-with-body -sS -X POST "$AFTERPERK_BASE_URL/api/v1/provider/conversions" \
  -H "Authorization: Bearer $AFTERPERK_API_KEY" \
  -H "Content-Type: application/json" --data-binary @conversion.json

Ett godkänt, nytt anrop svarar med HTTP 200 och {"ok":true,"conversionId":"…","duplicate":false}. Exakt samma fil igen ger HTTP 200 med samma conversionId och duplicate:true. En ändrad payload under samma event_id ger 409.

Exemplen är platshållare, inte giltiga testhändelser eller avtalade belopp. commission_minor är partnerns provision i hela ören, inte ordervärdet. Valfritt sale_value_minor är separat ordervärde i ören. Valuta och provision måste matcha de villkor som låstes vid klicket. En ny transaktion behöver en händelsetid inom klickets konfigurerade attribueringsfönster (1–90 dagar, standard 30), efter klicket och inte i framtiden.

Separat äldre callback

POST /api/callback/PARTNER-ID använder X-Callback-Key, inte portalens Bearer-nyckel. Den nyckeln tillhandahålls separat av administratör. Normaliserad JSON stöds; ?format=direct och ?format=adtraction översätter respektive källformat. X-Callback-Test: true validerar en autentiserad callback utan att skapa en konvertering. Välj leverantörens Bearer-API ovan för en ny standardanslutning.

Status och återförsök

En väntande konvertering kan bli godkänd eller avvisad. En godkänd kan återföras eller avvisas; den kan inte bli väntande igen. Avvisad och återförd är slutstatusar, och en väntande konvertering kan inte återföras direkt. Varje statusändring använder nytt event_id för samma transaktion.

Använd pending, approved, rejected eller reversed. Samma event_id och exakt samma payload ska användas vid återförsök; ändrat innehåll för samma ID ger HTTP 409. En senare status för samma transaction_id är en ny händelse med nytt event_id. En transaktion kan inte flyttas till ett annat klick. Återförsök vid nätverksfel eller tillfälligt 5xx; rätta 4xx enligt svarets error.

Distributionsreglerna kan godkänna en handlares ansökan automatiskt eller skicka den till manuell granskning. Det är ett separat beslut från godkännande av organisation, partneranslutning och erbjudande. Kontrollera aktuellt besked i partneransökningar.

Hämta partneravgränsad statistik med GET /api/v1/provider/reports?from=YYYY-MM-DD&to=YYYY-MM-DD&dimension=offer och reports:read. Datumen avser kalenderdagar i Europe/Stockholm. Rapporten skiljer på väntande, godkända, återförda och avräknade belopp; ett klick eller en väntande händelse är ingen utbetalning.

Kontroll före kundtrafik

4. Testa hela vägen

  1. Kontrollera att organisation, partneråtkomst, erbjudande och placering är aktiva. Skapa gärna separata placeringar för tacksida, mejl och portal.
  2. Öppna länken eller modulen från er faktiska yta i mobil och dator. Kontrollera villkor och att ert köp eller mejl fungerar även om Afterperk inte svarar.
  3. Följ ett erbjudande som en besökare. Kontrollera att partnern tar emot click_id. Ett publikt API-svar ensamt bevisar inte att integrationen sitter på er sida.
  4. Skicka en verklig, avtalad testtransaktion från partnerns server. Kontrollera svar, återförsök med samma ID, statusändring, rapport och avräkningsunderlag. Använd inga påhittade klick-ID:n.

Det finns ingen separat publicerad sandbox eller testnyckel. Håll lokala och produktionsmiljöer, basadresser och hemligheter åtskilda. Skicka aldrig riktiga nycklar till en lokal utvecklingsserver eller ett offentligt kodförråd.

När något saknas

Felsökning

Inga erbjudanden visas
Kontrollera placerings-ID, kanal, publicerade erbjudanden samt godkänd och aktiv organisation, partner och distributörsåtkomst. Kontrollera CSP om modulen inte laddar.
Klick syns men ingen konvertering
Bekräfta att partnern har sparat rätt click_id och skickat en autentiserad serverhändelse. Kontrollera API-svar och händelselogg i leverantörsportalen.
401, 403 eller 409
401/403: kontrollera nyckeltyp, scope och aktiv anslutning. 409: kontrollera återanvänt event_id, låsta klickvillkor, stabilt transaktions-ID och eventuell stale expectedLiveVersion.
Belopp eller rapport ser fel ut
Skicka hela ören i commission_minor, håll ordervärde separat och välj rätt datum i Europe/Stockholm. Godkänd provision, avräkning och utbetalning är olika steg.