SDK-Dokumentation

Pixel-Installation

Installiere den Adverfly-Tracking-Pixel auf deiner Website

Der Adverfly-Pixel ist ein JavaScript-Snippet, das Nutzer-Interaktionen auf deiner Website trackt. Er erfasst Pageviews, Events und Conversions und füttert deine Analytics.

Schnellstart

Füge den folgenden Code in den <head>-Bereich deiner Website ein:

Request
<script>
  window.adverfly = window.adverfly || [];
  function advPxl() {
    var args = [false];
    for (var i = 0; i < arguments.length; i++) {
      args.push(arguments[i]);
    }
    adverfly.push(args);
  }
  advPxl("init", DEINE_WORKSPACE_ID);
  window.adverfly.store_currency = "EUR";
  window.adverfly.store_timezone = "Europe/Berlin";

  var script = document.createElement("script");
  script.type = "text/javascript";
  script.async = true;
  script.src = "https://sos-de-fra-1.exo.io/adv/advv2.01.js";
  document.getElementsByTagName("head")[0].appendChild(script);
</script>

Ersetze DEINE_WORKSPACE_ID durch deine Workspace-ID aus dem Adverfly-Dashboard.

Konfiguration

ParameterTypeRequiredDescription
workspace_idnumberRequiredDeine Adverfly-Workspace-ID
store_currencystringRequiredDie Basiswährung deines Shops (z. B. EUR, USD)
store_timezonestringRequiredDie Zeitzone deines Shops (z. B. Europe/Berlin)

Währungsumrechnung

Die store_currency-Einstellung ist wichtig für genaue Umsatz-Tracking. Wenn eine Transaktion in einer anderen Währung eingeht (z. B. zahlt ein Kunde in USD), rechnet Adverfly diese automatisch zum aktuellen Wechselkurs in deine Shop-Währung um.

Beispiel: Deine Shop-Währung ist EUR. Ein Kunde zahlt 129 USD. Adverfly rechnet das in deinen Reports auf ~119 € um.

Zeitzone

Die store_timezone stellt sicher, dass alle Events und Conversions in deiner lokalen Zeit erfasst werden — das macht deine Reports einfacher zu lesen und auszuwerten.

Events tracken

Custom-Events mit dem Adverfly-Pixel tracken

Sobald der Pixel installiert ist, kannst du Custom-Events tracken, um Nutzer-Interaktionen zu erfassen.

Grundlegendes Event-Tracking

Verwende die advPxl-Funktion, um Events zu tracken:

Request
// Add to Cart
advPxl("event", "add_to_cart");

// Initiated Checkout
advPxl("event", "initiated_checkout");

Standard-Events

CodeDescription
pageviewNutzer sieht eine Seite (wird automatisch beim Init getrackt)
add_to_cartNutzer legt ein Produkt in den Warenkorb
initiated_checkoutNutzer startet den Checkout

Autocapture

Das v3-Pixel kann Nutzer-Interaktionen automatisch erfassen — Klicks, Form-Submits, Input-Änderungen, Rage-Clicks und Copy/Cut-Aktionen — ohne manuelle advPxl-Aufrufe. Standardmäßig deaktiviert: aktiviere es pro Workspace mit window.adverfly.activate_autocapture = true vor dem init.

Request
window.adverfly = window.adverfly || [];
window.adverfly.activate_autocapture = true;
advPxl("init", 8397799);

Erfasste Events

CodeDescription
$clickWird bei Klicks ausgelöst. Das Ziel wird auf das nächstgelegene interaktive Eltern-Element aufgelöst (a, button, input, select, textarea, label, form oder role=button|link|menuitem).
$submitWird bei Form-Submits ausgelöst. Enthält Action und Methode des Formulars.
$changeWird bei <select>-Änderungen sowie Checkbox-/Radio-Toggles ausgelöst. Werte von Text-Inputs werden NIEMALS erfasst.
$rageclickWird ausgelöst, wenn dasselbe Element innerhalb 1 Sekunde 3+ mal geklickt wird.
$copyWird ausgelöst, wenn ein Nutzer Inhalt kopiert. Es werden ausschließlich Metadaten erfasst — niemals der kopierte Text selbst.
$cutWird ausgelöst, wenn ein Nutzer Inhalt ausschneidet. Nur Metadaten werden erfasst.

Privacy

Autocapture ist so designt, dass keine sensiblen Daten geleakt werden. Folgendes wird clientseitig erzwungen, bevor etwas gesendet wird:

  • Niemals erfasste Input-Typen: password, hidden, file.
  • Über Name/Autocomplete blockierte Felder: Kreditkarte (cc-*, card-num, card-no), CVC/CVV, Ablaufdatum, SSN, Sozialversicherung, Passwort, API-Keys, Auth-Tokens, Einmal-Codes.
  • Werte von Freitext-Inputs werden nie gelesen: <input type="text|email|tel|..."> und <textarea> werden nie erfasst. Nur <select>-Optionen sowie Checkbox-/Radio-Status.
  • Text-Scrubbing: Jeder Token in sichtbarem Text, der wie eine Kreditkartennummer, SSN oder eine Folge von 13+ Ziffern aussieht, wird vor dem Senden entfernt. Das Ergebnis wird auf 200 Zeichen gekürzt.
  • Opt-out-Selektoren: Elemente (und Kinder) mit Klasse adv-no-capture oder Attribut data-adv-no-capture werden komplett übersprungen.

Elemente ausschließen

Ein bestimmtes Element (und alle Kinder) ausschließen:

Request
<!-- via Klasse -->
<div class="adv-no-capture">
  <input type="text" name="internal-note" />
</div>

<!-- via Attribut -->
<section data-adv-no-capture>
  <button>Interne Aktion</button>
</section>

Konfiguration

Feinsteuerung via window.adverfly.autocapture_config (vor init setzen):

CodeDescription
url_allowlistArray aus Strings (Substring-Match) oder RegExp. Wenn gesetzt, läuft Autocapture nur auf URLs, die mindestens einem Eintrag entsprechen.
url_ignorelistArray aus Strings oder RegExp. Autocapture wird auf passenden URLs übersprungen.
element_allowlistArray kleingeschriebener Tag-Namen. Nur Elemente mit diesen Tags werden erfasst.
css_selector_allowlistArray von CSS-Selektoren. Nur passende Elemente werden erfasst.
Request
window.adverfly = window.adverfly || [];
window.adverfly.autocapture_config = {
  url_ignorelist: [/\/admin/, "/debug"],
  css_selector_allowlist: [".track-me", "[data-adv-track]"],
};
advPxl("init", 8397799);

Rate-Limiting

Eingebaute Limits schützen deine Seite und dein Event-Kontingent:

  • Global: max. 30 Autocapture-Events pro Sekunde.
  • Pro Element: mindestens 500 ms zwischen Events am selben Element.
  • Rage-Click: 1 s Cooldown pro Element nach einem $rageclick.

Google Tag Manager

Adverfly via Google Tag Manager installieren

Du kannst den Adverfly-Pixel über Google Tag Manager installieren — leichter zu pflegen.

Installations-Schritte

  1. Öffne deinen GTM-Container
  2. Erstelle ein neues Tag
  3. Wähle Custom HTML
  4. Füge folgenden Code ein:
Request
<script>
  window.adverfly = window.adverfly || [];
  function advPxl() {
    var args = [false];
    for (var i = 0; i < arguments.length; i++) {
      args.push(arguments[i]);
    }
    adverfly.push(args);
  }
  advPxl("init", DEINE_WORKSPACE_ID);
  window.adverfly.store_currency = "EUR";
  window.adverfly.store_timezone = "Europe/Berlin";

  var script = document.createElement("script");
  script.type = "text/javascript";
  script.async = true;
  script.src = "https://sos-de-fra-1.exo.io/adv/advv2.01.js";
  document.getElementsByTagName("head")[0].appendChild(script);
</script>
  1. Setze den Trigger auf All Pages
  2. Speichern und veröffentlichen

Konfiguration

CodeDescription
store_currencyBasiswährung deines Shops. Transaktionen in anderen Währungen werden automatisch umgerechnet.
store_timezoneZeitzone deines Shops für genaue Event-Zeitstempel in Reports.

Conversions via Data Layer tracken

Wenn du den Data Layer für E-Commerce-Events nutzt:

Request
<script>
  // Dieses Tag sollte auf der Bestätigungs-Seite feuern
  advPxl("conversion", "purchase", {
    transaction_id: {{DL - Transaction ID}},
    transaction_gross_revenue: {{DL - Revenue}} * 100,
    transaction_currency: {{DL - Currency}}
  });
</script>

Custom-Events tracken

Lege weitere Tags für eigene Events an:

Request
<script>
  // Add-to-Cart-Tag — Trigger auf add_to_cart-Event
  advPxl("event", "add_to_cart");
</script>
Request
<script>
  // Initiated-Checkout-Tag — Trigger auf Checkout-Start
  advPxl("event", "initiated_checkout");
</script>

Empfohlene Trigger

CodeDescription
Base PixelAll Pages
Purchase Conversionpurchase-Event / Thank-you-Page
Add to Cartadd_to_cart-Event
Initiated Checkoutinitiated_checkout-Event

Shopify-Integration

Adverfly in deinem Shopify-Store installieren

Adverfly integriert sich nativ über Shopifys Customer-Events-API für genaues Tracking. Wenn du zusätzlich Personalisierungs-Widgets (Popups, Banner, Countdowns, Toasts) auf deinem Storefront ausspielen willst, ist ein zweiter winziger Schritt nötig — siehe „Optional: Widgets aktivieren" unten auf der Seite.

Installations-Schritte

  1. Gehe zum Shopify-Admin
  2. Navigiere zu SettingsCustomer events
  3. Klicke auf Add custom pixel
  4. Nenne ihn „Adverfly“
  5. Füge folgenden Code ein:
Request
const script = document.createElement("script");
script.type = "text/javascript";
script.async = true;
script.src = "https://sos-de-fra-1.exo.io/adv/script-shopify.js";
document.getElementsByTagName("script")[0].parentNode.appendChild(script);

window.adverfly_web_pixel = true;
window.adverfly_init = init;
window.adverfly_browser = browser;
window.adverfly_settings = api.settings;

window.adverfly = window.adverfly || [];
window.advPxl = function () {
  adverfly.push([false, ...arguments]);
};

analytics.subscribe("all_events", (event) => {
  window.adverfly.push(["all_shopify_events", event]);
  advPxl("init", DEINE_WORKSPACE_ID);
  window.adverfly.store_currency = "EUR";
  window.adverfly.store_timezone = "Europe/Berlin";

  if (event.name === "page_viewed") {
    advPxl("check", "vikeys", event);
  }
});

Ersetze DEINE_WORKSPACE_ID mit deiner Workspace-ID und setze Währung sowie Zeitzone deines Shops.

Konfiguration

CodeDescription
store_currencyBasiswährung deines Shops. Transaktionen in anderen Währungen werden automatisch umgerechnet.
store_timezoneZeitzone deines Shops für genaue Event-Zeitstempel in Reports.

Getrackte Events

Die Shopify-Integration trackt automatisch alle Standard-E-Commerce-Events:

CodeDescription
page_viewed → pageviewShopify-page_viewed-Event, in Adverfly als pageview erfasst
product_added_to_cart → add_to_cartShopify-Add-to-Cart-Event, in Adverfly als add_to_cart erfasst
checkout_started → initiated_checkoutShopify-Checkout-Start, in Adverfly als initiated_checkout erfasst
checkout_completed → purchaseShopify-Purchase-Event, in Adverfly als purchase-Conversion erfasst

Optional: Widgets aktivieren

Der Shopify-Web-Pixel oben läuft in einer Sandbox und kann zwar Events tracken, aber kein UI im Storefront rendern. Um Adverfly-Personalisierungs-Widgets (Popups, Banner, Countdowns, Toasts) zu aktivieren, ergänzt du ein zweites kleines Snippet in deinem Theme — gleiches Muster wie Google Analytics oder jedes andere Tag.

  1. Gehe in deinem Shopify-Admin auf Online Store → Themes → ⋯ → Edit code
  2. Öffne layout/theme.liquid
  3. Füge das Folgende direkt vor </head> ein:
Request
<script async src="https://cdn.adverfly.com/preset-pixel-adv.js"></script>
<script>
  window.adverfly = window.adverfly || [];
  window.adverfly.activate_widgets = true;
  advPxl("init", YOUR_WORKSPACE_ID);
</script>

Der Theme-Pixel erkennt automatisch dass er auf Shopify läuft und feuert keine Pageview-/Vikey-Events — dafür ist der Web-Pixel oben zuständig. Der Theme-Pixel existiert nur, um Widgets im Storefront-DOM zu rendern. Keine doppelten Events.

Wer nur Tracking will (keine Widgets), kann diesen Abschnitt überspringen. Der Web-Pixel deckt Tracking allein ab.

Personalization SDK

Headless JS-SDK — Adverfly-Widgets mit eigenen Komponenten rendern

Das @adverfly/sdk JavaScript-Paket holt für jeden Besucher die passende Variante und du renderst sie wie du willst — eigene React/Vue/Svelte-Komponenten, server-gerenderte HTML, sogar Mobile-Apps.

Der Standard-Pixel funktioniert weiterhin als No-Code-Lösung. Das SDK ist für:

  • Pixelgenaue Brand-Kontrolle — kein iframe, keine CSS-Overrides
  • Server-Side / Edge — Cloudflare Workers, Vercel Edge, Next.js Server Components
  • Custom UI — Inline-Blocks, Mobile Screens, alles jenseits von Popup/Banner/Toast/Countdown
  • Strikte Typen — dein config-Shape wird zum TypeScript-Generic

Installation

Drei Wege, gleicher Code — wähle was zu deinem Stack passt.

Vanilla <script> (kein Build-Schritt)

Request
<script src="https://cdn.jsdelivr.net/npm/@adverfly/sdk/dist/adverfly.iife.js"></script>
<script>
  const adv = new Adverfly({ workspaceId: 188334 });
  /* `Adverfly` ist jetzt eine globale Klasse — kein Module-System nötig. */
</script>

In Production die Version pinnen: @adverfly/sdk@0.1.0/dist/adverfly.iife.js.

ES-Module im Browser

Request
<script type="module">
  import { Adverfly } from "https://cdn.jsdelivr.net/npm/@adverfly/sdk/dist/index.mjs";
  const adv = new Adverfly({ workspaceId: 188334 });
</script>

npm (Build-Pipelines, Node, SSR)

Request
npm install @adverfly/sdk
import { Adverfly } from "@adverfly/sdk";

Funktioniert in Browsern und Node 18+. Keine Peer-Dependencies. Bundle ~6 KB minified im IIFE-Build, ~12 KB als ESM-Build.

Quick Start

Request
import { Adverfly } from "@adverfly/sdk";

const adv = new Adverfly({ workspaceId: 188334 });

await adv.identify({ email: "user@example.com" });

adv.setContext({
  cart_value: 49.9,
  last_viewed_creatives: ["sku_a", "sku_b"],
});

const variant = await adv.personalize({ trigger: "exit_intent" });

if (variant) {
  zeigeMeinPopup({
    title: variant.config.title,
    copy: variant.config.copy,
    onCtaClick: () => adv.click(variant.id),
    onDismiss: () => adv.dismiss(variant.id),
  });
  await adv.trackImpression(variant.id);
}

Konstruktor

ParameterTypeRequiredDescription
workspaceIdnumberRequiredDeine Adverfly-Workspace-ID.
apiUrlstringOptionalOverride für Self-Hosted oder Staging. Default: https://b.adverfly.com.
customerIdstringOptionalVor-identifizieren ohne identify() aufzurufen.
debugbooleanOptionalDecisions + Events in console.log spiegeln, getaggt mit [adverfly].
manualIdentitybooleanOptionalAuto-Anonymous-ID deaktivieren (für SSR / wenn du Identität selbst verwaltest).

Identität

await adv.identify({
  email: "user@example.com",   // SHA-256 gehasht (lowercase) — nie roh übertragen
  transactionId: "order_123",  // optional, für Post-Purchase-Trigger
});

Identität zurücksetzen (z. B. bei Logout):

adv.reset();

Personalize

const variant = await adv.personalize<MyConfigShape>({
  trigger: "exit_intent",
  surface: "widget",  // optional, default: "widget"
  context: { device_battery_low: true },  // wird oben auf den Session-Context gemerged
});
// { id, config, reason } | null

Stark typisierter Config:

Request
interface PopupConfig {
  title: string;
  copy: string;
  cta?: string;
  cta_url?: string;
  image_url?: string;
}

const variant = await adv.personalize<PopupConfig>({ trigger: "exit_intent" });
if (variant) {
  console.log(variant.config.title); // typisiert!
}

Tracking

Alle Tracking-Events landen in ClickHouse pixel_events — gleiche Tabelle wie der Standard-Pixel, joinbar via customer_id (gehasht) für Conversion-Attribution.

CodeDescription
trackImpression(variantId)Widget wurde gerendert.
click(variantId, props?)User klickte CTA. props kann cta_url enthalten.
dismiss(variantId)User hat manuell geschlossen.
autoDismissed(variantId, reason?)Timer abgelaufen (Countdown, Toast).
success(variantId, props?)Goal erreicht. Wenn props.email gesetzt, automatisch gehasht vor Versand.

Events

Subscriben für Analytics, Debugging oder Custom-Render-Hooks.

Request
const off = adv.on("decision", ({ trigger, variant }) => {
  console.log(`[${trigger}] →`, variant?.id ?? "no match");
});

/* Returns Unsubscribe-Funktion */
off();

Verfügbare Events: decision, impression, click, dismiss, auto_dismissed, success, error.

Server-Side / Edge

Funktioniert überall wo fetch + crypto.subtle existieren (Node 18+, Bun, Cloudflare Workers, Vercel Edge).

Request
/* Cloudflare Worker — server-render einen personalisierten Hero-Block */
export default {
  async fetch(request: Request) {
    const adv = new Adverfly({
      workspaceId: 188334,
      manualIdentity: true,  // wir verwalten Identität selbst
    });
    await adv.identify({ customerId: getCookieUserId(request) });

    const variant = await adv.personalize({
      trigger: "ssr_hero",
      context: { country: request.cf?.country },
    });

    return new Response(renderHero(variant?.config), {
      headers: { "content-type": "text/html" },
    });
  },
};

Privacy

  • Emails werden clientseitig gehasht (SHA-256, lowercase + getrimmt) bevor irgendein Network-Call passiert.
  • Keine Cookies vom SDK gesetzt. Anonymous-IDs in localStorage; Opt-out via manualIdentity: true.
  • CORS-clean. POST + JSON, keine Preflight-Überraschungen.

Siehe auch