Zum Hauptinhalt springen
Kostenlos15 minutesFortgeschrittene

React-Integration

Integrieren Sie Zenovay in React-Anwendungen – Tracking, Hooks und komponentenbasierte Analysen. Erfahren Sie mehr über React in dieser API-Integrationsleitfaden.

reactjavascriptintegrationspatracking
Zuletzt aktualisiert:

Integrieren Sie Zenovay-Analysen in Ihre React-Anwendung mit automatischem Seiten-Tracking, benutzerdefinierten Events und einem eigenen Hook für die globale window.zenovay-Funktion.

Installation

Fügen Sie das Zenovay-Tracking-Script zu Ihrer index.html hinzu:

<script
  defer
  data-tracking-code="YOUR_TRACKING_CODE"
  src="https://api.zenovay.com/z.js"
></script>

Es wird kein npm-Paket benötigt. Das Script erfasst automatisch Seitenaufrufe und stellt die globale window.zenovay-Funktion für benutzerdefiniertes Tracking bereit.

Grundlegende Einrichtung

Einen useZenovay-Hook erstellen

Erstellen Sie einen benutzerdefinierten Hook, der die globale window.zenovay-Funktion kapselt:

// hooks/useZenovay.js
export function useZenovay() {
  const trackEvent = (name, properties) => {
    if (window.zenovay) {
      window.zenovay('track', name, properties);
    }
  };

  const trackGoal = (name, properties) => {
    if (window.zenovay) {
      window.zenovay('goal', name, properties);
    }
  };

  const trackPageview = () => {
    if (window.zenovay) {
      window.zenovay('page');
    }
  };

  const trackRevenue = (amount, currency, meta) => {
    if (window.zenovay) {
      window.zenovay('revenue', amount, currency, meta);
    }
  };

  const identify = (userId, properties) => {
    if (window.zenovay) {
      window.zenovay('identify', userId, properties);
    }
  };

  return { trackEvent, trackGoal, trackPageview, trackRevenue, identify };
}

Automatisches Seiten-Tracking

Mit React Router

Das Zenovay-Script erfasst automatisch den ersten Seitenaufruf. Für SPA-Routenwechsel mit React Router tracken Sie Seitenaufrufe bei Routenänderungen:

import { BrowserRouter, useLocation } from 'react-router-dom';
import { useEffect } from 'react';

function PageTracker() {
  const location = useLocation();

  useEffect(() => {
    if (window.zenovay) {
      window.zenovay('page');
    }
  }, [location.pathname]);

  return null;
}

function App() {
  return (
    <BrowserRouter>
      <PageTracker />
      <Routes>
        <Route path="/" element={<Home />} />
        <Route path="/about" element={<About />} />
        <Route path="/pricing" element={<Pricing />} />
      </Routes>
    </BrowserRouter>
  );
}

Seitenaufrufe werden automatisch bei Routenwechseln erfasst.

Benutzerdefinierte Events

useZenovay-Hook

import { useZenovay } from './hooks/useZenovay';

function SignupButton() {
  const { trackEvent } = useZenovay();

  const handleSignup = () => {
    // Registrierungsklick tracken
    trackEvent('signup_click', {
      plan: 'pro',
      source: 'pricing_page'
    });

    // Mit der Registrierungslogik fortfahren
    performSignup();
  };

  return (
    <button onClick={handleSignup}>
      Kostenlos ausprobieren
    </button>
  );
}

Track-Event-Funktion

const { trackEvent } = useZenovay();

// Einfaches Event
trackEvent('button_click');

// Mit Eigenschaften
trackEvent('purchase', {
  product_id: 'SKU-001',
  value: 99.99,
  currency: 'USD'
});

// Mit Wert
trackEvent('download', { file: 'guide.pdf' });

Ziel-Tracking

Zielerreichung tracken

import { useZenovay } from './hooks/useZenovay';
import { useEffect } from 'react';

function CheckoutSuccess({ order }) {
  const { trackGoal } = useZenovay();

  useEffect(() => {
    trackGoal('purchase', {
      value: order.total,
      order_id: order.id,
      products: order.items
    });
  }, [order]);

  return <div>Vielen Dank für Ihre Bestellung!</div>;
}

Benutzeridentifikation

Benutzer identifizieren

import { useZenovay } from './hooks/useZenovay';
import { useAuth } from './auth';
import { useEffect } from 'react';

function UserIdentifier() {
  const { user, isAuthenticated } = useAuth();
  const { identify } = useZenovay();

  useEffect(() => {
    if (isAuthenticated && user) {
      identify(user.id, {
        email: user.email,
        name: user.name,
        plan: user.subscription
      });
    }
  }, [user, isAuthenticated]);

  return null;
}

Im Authentifizierungsablauf

async function handleLogin(credentials) {
  const user = await login(credentials);

  // Nach dem Login identifizieren
  if (window.zenovay) {
    window.zenovay('identify', user.id, {
      email: user.email
    });
  }

  navigate('/dashboard');
}

Umsatz-Tracking

Umsätze tracken

import { useZenovay } from './hooks/useZenovay';
import { useEffect } from 'react';

function OrderConfirmation({ order }) {
  const { trackRevenue } = useZenovay();

  useEffect(() => {
    trackRevenue(order.total, 'USD', {
      order_id: order.id,
      items: order.items.map(item => ({
        id: item.sku,
        name: item.name,
        price: item.price,
        quantity: item.quantity
      }))
    });
  }, [order]);

  return (
    <div>
      <h1>Bestellung bestätigt!</h1>
      <p>Bestellung #{order.id}</p>
    </div>
  );
}

Event-Tracking-Komponenten

Trackbarer Button

import { useZenovay } from './hooks/useZenovay';

function TrackableButton({ event, eventData, children, ...props }) {
  const { trackEvent } = useZenovay();

  const handleClick = (e) => {
    trackEvent(event, eventData);
    props.onClick?.(e);
  };

  return (
    <button {...props} onClick={handleClick}>
      {children}
    </button>
  );
}

// Verwendung
<TrackableButton
  event="cta_click"
  eventData={{ location: 'hero' }}
  onClick={handleSignup}
>
  Erste Schritte
</TrackableButton>

Beim Mounten tracken

import { useZenovay } from './hooks/useZenovay';
import { useEffect } from 'react';

function TrackOnMount({ event, eventData }) {
  const { trackEvent } = useZenovay();

  useEffect(() => {
    trackEvent(event, eventData);
  }, []);

  return null;
}

// Verwendung
<TrackOnMount
  event="pricing_viewed"
  eventData={{ referrer: document.referrer }}
/>

TypeScript-Unterstützung

Typen

// types/zenovay.d.ts
interface ZenovayFunction {
  (command: 'track', name: string, properties?: Record<string, unknown>): void;
  (command: 'identify', userId: string, traits?: Record<string, unknown>): void;
  (command: 'goal', name: string, properties?: Record<string, unknown>): void;
  (command: 'page'): void;
  (command: 'revenue', amount: number, currency: string, meta?: Record<string, unknown>): void;
}

declare global {
  interface Window {
    zenovay: ZenovayFunction;
  }
}

export {};

Typisierter Hook

// hooks/useZenovay.ts
export function useZenovay() {
  const trackEvent = (name: string, properties?: Record<string, unknown>) => {
    if (window.zenovay) {
      window.zenovay('track', name, properties);
    }
  };

  const trackGoal = (name: string, properties?: Record<string, unknown>) => {
    if (window.zenovay) {
      window.zenovay('goal', name, properties);
    }
  };

  const identify = (userId: string, properties?: Record<string, unknown>) => {
    if (window.zenovay) {
      window.zenovay('identify', userId, properties);
    }
  };

  return { trackEvent, trackGoal, identify };
}

Serverseitiges Rendering

SSR-Probleme vermeiden

Die window.zenovay-Funktion ist nur im Browser verfügbar. Prüfen Sie dies immer vor der Verwendung:

import { useEffect, useState } from 'react';

function ZenovayWrapper({ children }) {
  const [mounted, setMounted] = useState(false);

  useEffect(() => {
    setMounted(true);
  }, []);

  // Erst nach dem Mounten der Komponente tracken (clientseitig)
  if (!mounted) {
    return children;
  }

  return children;
}

Testen

Den Hook mocken

// test-utils.jsx
import { vi } from 'vitest';

export const mockZenovay = {
  trackEvent: vi.fn(),
  trackGoal: vi.fn(),
  identify: vi.fn(),
  trackPageview: vi.fn(),
  trackRevenue: vi.fn()
};

vi.mock('./hooks/useZenovay', () => ({
  useZenovay: () => mockZenovay
}));

Testbeispiel

import { render, fireEvent, screen } from '@testing-library/react';
import { mockZenovay } from './test-utils';
import SignupButton from './SignupButton';

test('trackt Registrierungsklick', () => {
  render(<SignupButton />);

  fireEvent.click(screen.getByText('Kostenlos ausprobieren'));

  expect(mockZenovay.trackEvent).toHaveBeenCalledWith('signup_click', expect.any(Object));
});

Häufige Muster

E-Commerce-Tracking

import { useZenovay } from './hooks/useZenovay';
import { useEffect } from 'react';

function ProductPage({ product }) {
  const { trackEvent } = useZenovay();

  useEffect(() => {
    trackEvent('product_viewed', {
      product_id: product.id,
      product_name: product.name,
      price: product.price,
      category: product.category
    });
  }, [product.id]);

  const handleAddToCart = () => {
    trackEvent('add_to_cart', {
      product_id: product.id,
      price: product.price,
      quantity: 1
    });
  };

  return (
    <div>
      <h1>{product.name}</h1>
      <button onClick={handleAddToCart}>In den Warenkorb</button>
    </div>
  );
}

Formular-Tracking

import { useZenovay } from './hooks/useZenovay';

function ContactForm() {
  const { trackEvent, trackGoal } = useZenovay();

  const handleSubmit = async (data) => {
    trackEvent('form_submitted', {
      form_name: 'contact',
      has_phone: !!data.phone
    });

    await submitForm(data);

    trackGoal('contact_form');
  };

  return (
    <form onSubmit={handleSubmit}>
      {/* Formularfelder */}
    </form>
  );
}

Fehlerbehebung

Events werden nicht getrackt

Überprüfen Sie:

  • Das Script-Tag ist in Ihrer index.html vorhanden
  • Der Tracking-Code ist korrekt
  • Kein Ad-Blocker blockiert das Script
  • Die Konsole auf Fehler

Fehlende Seitenaufrufe

Überprüfen Sie:

  • Die PageTracker-Komponente ist eingebunden
  • React Router ist korrekt eingerichtet
  • Routen werden innerhalb des Routers gerendert

Doppeltes Tracking

Vermeiden Sie:

  • Mehrere Script-Tags
  • Manuelles + automatisches Tracking gleichzeitig
  • StrictMode, der doppelte Effekte auslöst

Nächste Schritte

War dieser Artikel hilfreich?