Programmatic Tracking API
Übersicht
In den allermeisten Fällen ist die Verwendung der Programmatic Tracking API nicht erforderlich. Sie können Seitenaufrufe, Klicks auf Schaltflächen, Formularübermittlungen und E-Commerce-Ereignisse direkt nach der Installation tracken, indem Sie Ereignisse bestimmten URLs zuweisen oder interaktive Elemente über Klassen kennzeichnen – ganz ohne Beteiligung von Entwicklern. Diese API ist für fortgeschrittene Anwendungsfälle konzipiert, die nicht durch das Standard-Tracking abgedeckt werden können.
Wann die Programmatic API sinnvoll ist
Ziehen Sie die Verwendung der Programmatic Tracking API nur in Betracht, wenn:
Granulare Ereignissteuerung erforderlich – Sie benötigen eine präzise Kontrolle darüber, wann Ereignisse basierend auf komplexer Geschäftslogik, bedingten Workflows oder spezifischen Anwendungszuständen gesendet werden, die das automatische Tracking nicht erkennen kann.
Datenzugriff auf Anwendungsebene – Sie verfügen über Kunden- oder Produktdaten im JavaScript-Kontext Ihrer Anwendung (Benutzerobjekte, Warenkorbstatus, Sitzungsvariablen), die Sie mit Ereignissen senden möchten, ohne sie im DOM zu rendern und entsprechenden Elementen CSS-Klassen zuzuweisen.
Die Verwendung dieser API erfordert die Einbindung von Entwicklern und JavaScript-Kenntnisse. Wenn Ihre Tracking-Anforderungen durch die Standardfunktionalität von PixelFlow erfüllt werden können, empfehlen wir, stattdessen diese Methoden zu verwenden.
Was diese API bietet
Die Programmatic Tracking API von PixelFlow stellt die Funktion trackEvent global über window.pixelFlow.trackEvent() zur Verfügung, zusammen mit Hilfsfunktionen zur Daten-Normalisierung, um sicherzustellen, dass Ihre Daten den Anforderungen der Meta Conversions API entsprechen.
Erste Schritte
Warten, bis PixelFlow initialisiert ist
Bereiten Sie Ihren Payload (benutzerdefinierte Daten) und die normalisierten Benutzerdaten vor, und rufen Sie dann die Funktion trackEvent auf:
// Wait for PixelFlow to initialize, then track event
const trackPurchase = async () => {
if (
window.pixelFlow?.trackEvent &&
window.pixelFlow?.utils?.normalizeCustomerData
) {
try {
const normalizedCustomerData =
await window.pixelFlow.utils.normalizeCustomerData(customerData); // normalizes data
window.pixelFlow.trackEvent("Purchase", payload, normalizedCustomerData);
} catch (error) {
console.error("PixelFlow: Error tracking Purchase event", error);
}
} else {
console.warn("PixelFlow: API not ready, retrying...");
// Retry after 1 second if not ready
setTimeout(trackPurchase, 1000);
}
};Die trackEvent-Funktion
Funktionssignatur
trackEvent(
eventName: string,
customData: CustomData,
userData: UserData
): Promise<boolean>Diese Felder nicht senden
trackEvent nimmt genau drei Argumente entgegen: den Ereignisnamen, die benutzerdefinierten Daten (custom data) und die Benutzerdaten (user data). Es gibt kein viertes Argument und keine eventID-Option.
PixelFlow setzt die unten aufgeführten Felder selbst. Fügen Sie diese nicht in customData, userData oder an einer anderen Stelle im Aufruf ein:
event_idundeventIDevent_timeundeventTimeaction_sourceundactionSourcefbpundfbcexternal_idclient_ip_address
event_id wird bei jedem Aufruf generiert und vom Meta-Pixel sowie dem Server-Ereignis gemeinsam genutzt, damit Meta eine Duplizierung (Deduplizierung) vornehmen kann. Wenn der Client-Code eine eigene event_id in den benutzerdefinierten Daten hinzufügt, gibt die API HTTP 400 zurück und es wird nichts aufgezeichnet.
Parameter
1. eventName (String, erforderlich)
Der Name des Ereignisses, das Sie tracken möchten. Verwenden Sie die Standard-Ereignisnamen von Meta.
Es werden nur Standard-Meta-Ereignisse unterstützt (z. B. "Purchase", "Lead", "AddToCart"). Benutzerdefinierte Ereignisnamen werden derzeit nicht unterstützt.
2. customData (CustomData, erforderlich)
Objekt, das ereignisspezifische Daten wie Produktinformationen und Preise enthält. customData akzeptiert nur die unten aufgeführten Felder.
Akzeptierte Felder:
{
value?: number; // Monetary value (required for Purchase, recommended for value optimization)
currency?: string; // ISO 4217 currency code (e.g., "USD", "EUR", "GBP")
content_ids?: string[]; // Product SKUs or identifiers
content_name?: string; // Product or content name
content_type?: 'product' | 'product_group';
contents?: ContentItem[]; // Detailed product information
num_items?: number; // Quantity of items
searchStr?: string; // Search string (Search events only)
}Bei jedem contents-Element darf delivery_category nur den Wert "in_store", "curbside" oder "home_delivery" haben.
Jede andere Eigenschaft wird nicht ignoriert. Der Ereignis-Endpunkt gibt HTTP 400 zurück und das Ereignis wird nicht gespeichert. Dies gilt auch für content_category: Der Server akzeptiert es nicht, und wenn es gesendet wird, wird das gesamte Ereignis abgelehnt.
Übergeben Sie ein leeres Objekt {}, wenn keine benutzerdefinierten Daten benötigt werden, aber übergeben Sie niemals null oder undefined.
3. userData (UserData, erforderlich)
Objekt, das Kundeninformationen für ein besseres Anzeigen-Targeting und die Attribution enthält.
Häufige Eigenschaften:
{
em: string; // Email address (normalization required)
ph: string; // Phone number (normalization required)
fn: string; // First name (normalization required)
ln: string; // Last name (normalization required)
}Rückgabewert
Gibt ein Promise<boolean> zurück:
true- Ereignis erfolgreich in die Warteschlange gestellt und an Meta gesendetfalse- Senden des Ereignisses fehlgeschlagen (überprüfen Sie die Konsole auf Fehler)
Das Promise wird aufgelöst, nachdem das Ereignis in die Warteschlange gestellt wurde, nicht erst nach der Bestätigung durch die Server von Meta. Überprüfen Sie den Meta Events Manager auf den tatsächlichen Status der Ereignisübermittlung.
Verfügbare Hilfsfunktionen
PixelFlow stellt Hilfsfunktionen unter window.pixelFlow.utils für die Datenvorbereitung bereit:
Daten-Normalisierungsfunktionen
Verwenden Sie diese Funktionen, um Kundendaten vorzubereiten, bevor Sie sie an trackEvent übergeben:
// Normalize entire customer data object
const normalizedData = await window.pixelFlow.utils.normalizeCustomerData({
em: "[email protected]",
fn: " John ",
ln: "Doe",
ph: "(555) 123-4567",
});
// Returns normalized and ready-to-use object
// Email normalization (lowercase, trim)
const normalizedEmail =
window.pixelFlow.utils.normalizeEmail("[email protected]");
// Returns: '[email protected]'
// Name normalization (lowercase, trim)
const normalizedName = window.pixelFlow.utils.normalizeName(" John ");
// Returns: 'john'
// Phone normalization (digits only, add country code)
const normalizedPhone = window.pixelFlow.utils.normalizePhone(
"+1 (555) 123-4567",
"US"
);
// Returns: '15551234567'
// Generic alphanumeric lowercase (for city, state, etc.)
const normalizedCity = window.pixelFlow.utils.normalizeAlnumLower("New York");
// Returns: 'newyork'
// Postal code normalization
const normalizedZip = window.pixelFlow.utils.normalizePostal("94103-1234");
// Returns: '94103'
// Country code normalization
const normalizedCountry =
window.pixelFlow.utils.normalizeCountry("United States");
// Returns: 'us'TypeScript-Typdefinitionen:
/**
* Content item for product details
*/
export type ContentItem = {
/** Product ID or SKU */
id: string;
/** Quantity of the product */
quantity: number;
/** Price of the individual item */
item_price?: number;
/** "in_store", "curbside", or "home_delivery" */
delivery_category?: 'in_store' | 'curbside' | 'home_delivery';
};
/**
* CustomData type for Meta Conversions API
* Contains event-specific data like product information and pricing.
* Only the fields listed below are accepted. Any other property causes
* the event endpoint to return HTTP 400 and the event is not stored.
*/
export type CustomData = {
/** Monetary value associated with the event (required for Purchase) */
value?: number;
/** ISO 4217 currency code (e.g., "USD", "EUR", "GBP") */
currency?: string;
/** Product SKUs or identifiers */
content_ids?: string[];
/** Product or content name */
content_name?: string;
/** "product" or "product_group" */
content_type?: 'product' | 'product_group';
/** Array of product items with details */
contents?: ContentItem[];
/** Total number of items */
num_items?: number;
/** Search string (Search events only) */
searchStr?: string;
};
/**
* UserData type for Meta Conversions API
* Customer information for better ad targeting and attribution
* IMPORTANT: Data must be normalized before passing to trackEvent (use utils)
* Hashing is handled automatically by the script
*/
export type UserData = {
/**
* Email - must be normalized (lowercase, trimmed)
* Use window.pixelFlow.utils.normalizeCustomerData()
* @example "[email protected]" (normalized)
*/
em?: string;
/**
* Phone - must be normalized (digits only, with country code)
* Use window.pixelFlow.utils.normalizeCustomerData()
* @example "16505551212" (normalized)
*/
ph?: string;
/**
* First name - must be normalized (lowercase, trimmed)
* Use window.pixelFlow.utils.normalizeCustomerData()
* @example "john" (normalized)
*/
fn?: string;
/**
* Last name - must be normalized (lowercase, trimmed)
* Use window.pixelFlow.utils.normalizeCustomerData()
* @example "smith" (normalized)
*/
ln?: string;
/**
* Client User Agent
* Automatically captured by PixelFlow if not provided
*/
client_user_agent?: string;
};
/**
* PixelFlow global type for window.pixelFlow
*/
export type PixelFlow = {
version: string;
initialized: boolean;
trackEvent: (eventName: string, customData: CustomData, userData: UserData) => Promise<boolean>;
utils: {
/** Normalize entire customer data object (required before trackEvent, hashing automatic) */
normalizeCustomerData: (data: Partial<UserData>) => Promise<Partial<UserData>>;
/** Normalize email: lowercase, trim whitespace */
normalizeEmail: (email: string) => string;
/** Normalize name: lowercase, trim whitespace */
normalizeName: (name: string) => string;
/** Normalize phone: digits only, add country code if needed */
normalizePhone: (phone: string, countryCode?: string) => string;
/** Normalize to alphanumeric lowercase */
normalizeAlnumLower: (value: string) => string;
/** Normalize postal code: remove spaces and dashes */
normalizePostal: (postal: string) => string;
/** Normalize country: 2-letter ISO code lowercase */
normalizeCountry: (country: string) => string;
};
};
declare global {
interface Window {
pixelFlow?: PixelFlow;
}
}Praxisbeispiele
Beispiel 1: Benutzerdefiniertes Formular-Tracking
Szenario: Mehrstufiges Lead-Formular, bei dem das Tracking erst nach einer Backend-Validierung erfolgen soll.
// After form validation succeeds on server
async function onFormValidationSuccess(formData) {
// Prepare user data from form
const userData = await window.pixelFlow.utils.normalizeCustomerData({
em: formData.email,
fn: formData.firstName,
ln: formData.lastName,
ph: formData.phone,
});
// Prepare custom data
const customData = {
value: 500, // Estimated lead value
currency: "USD",
};
// Track the lead event
const success = await window.pixelFlow.trackEvent(
"Lead",
customData,
userData
);
if (success) {
console.log("Lead tracked successfully");
} else {
console.error("Failed to track lead");
}
}Beispiel 2: Stripe-Käufe
Senden Sie für Stripe Checkout keinen Purchase über trackEvent. Fügen Sie im PixelFlow-Dashboard einen Purchase-Trigger hinzu und wählen Sie Stripe Checkout. PixelFlow empfängt die Zahlung von Stripe, einschließlich E-Mail, Telefon und Name, und gleicht dann die Stripe Checkout-Sitzungs-ID auf der URL der Erfolgsseite ab. Diese Erfolgs-URL muss die Sitzungs-ID bereits enthalten.
Lösen Sie Purchase nicht zusätzlich aus Ihrem eigenen Code aus, da derselbe Auftrag sonst doppelt gesendet werden kann.
Testen auf der Events-Seite im PixelFlow-Dashboard
Überprüfen Sie immer, ob Ereignisse korrekt im PixelFlow-Ereignisprotokoll erscheinen:
Senden Sie ein Ereignis über die API
Gehen Sie zu https://dashboard.pixelflow.so/dashboard/events
Suchen Sie Ihr Ereignis, erweitern Sie die Ereigniszeile und überprüfen Sie, ob der an Meta gesendete Ereignis-Payload alle erwarteten Daten enthält
Programmatisch getrackte Ereignisse erscheinen neben Ihren automatischen Ereignissen im Dashboard, was die Überwachung und Fehlersuche Ihrer Implementierung erleichtert.
Wenn ein Seitenaufruf erscheint, aber der erwartete Lead, AddToCart oder Purchase nicht, überprüfen Sie den Netzwerk-Tab des Browsers auf den Ereignis-POST. Eine HTTP 400-Antwort bedeutet, dass der Payload ein Feld enthält, das PixelFlow nicht akzeptiert. Entfernen Sie dieses Feld. Fügen Sie keine weiteren Meta-Felder hinzu, um das Problem zu beheben.