Next.js SDK
Tracklytic Next.js SDK für React-Anwendungen
Next.js SDK ⚡
Das Tracklytic Next.js SDK ist speziell für Next.js und React-Anwendungen optimiert und bietet eine nahtlose Integration mit React-Hooks und Server Components.
Installation
npm install tracklytic-nextGrundlegende Konfiguration
App Router (Next.js 13+)
// app/layout.tsx
import { TracklyticProvider } from 'tracklytic-next';
export default function RootLayout({
children,
}: {
children: React.ReactNode;
}) {
return (
<html lang="de">
<body>
<TracklyticProvider
apiToken="your_api_token_here"
projectId="your_project_id"
>
{children}
</TracklyticProvider>
</body>
</html>
);
}Pages Router (Next.js 12)
// pages/_app.tsx
import { TracklyticProvider } from 'tracklytic-next';
export default function App({ Component, pageProps }) {
return (
<TracklyticProvider
apiToken="your_api_token_here"
projectId="your_project_id"
>
<Component {...pageProps} />
</TracklyticProvider>
);
}Erweiterte Konfiguration
<TracklyticProvider
apiToken="your_api_token_here"
projectId="your_project_id"
batchSize={10}
flushInterval={5000}
debug={process.env.NODE_ENV === 'development'}
retryAttempts={3}
retryDelay={1000}
>
{children}
</TracklyticProvider>React Hooks
useTracklytic Hook
import { useTracklytic } from 'tracklytic-next';
function MyComponent() {
const { track, identify, insight, incrementInsight } = useTracklytic();
const handleClick = () => {
track('button_click', {
button: 'cta',
page: '/home'
});
};
return <button onClick={handleClick}>Click me</button>;
}useTracklyticEvent Hook
import { useTracklyticEvent } from 'tracklytic-next';
function ProductPage({ productId }) {
// Automatisches Event beim Mount
useTracklyticEvent('product_viewed', {
product_id: productId,
page: '/product'
});
return <div>Product Page</div>;
}useTracklyticIdentify Hook
import { useTracklyticIdentify } from 'tracklytic-next';
function UserProfile({ user }) {
// Automatische Nutzer-Identifikation
useTracklyticIdentify(user.id, {
name: user.name,
email: user.email,
plan: user.plan
});
return <div>Welcome, {user.name}!</div>;
}Server Components
Server-side Tracking
// app/api/track/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { Tracklytic } from 'tracklytic-next/server';
const tracker = new Tracklytic({
apiToken: process.env.TRACKLYTIC_API_TOKEN!,
projectId: process.env.TRACKLYTIC_PROJECT_ID!
});
export async function POST(request: NextRequest) {
const { event, properties } = await request.json();
await tracker.track(event, properties);
return NextResponse.json({ success: true });
}Middleware Integration
// middleware.ts
import { NextRequest, NextResponse } from 'next/server';
import { Tracklytic } from 'tracklytic-next/server';
const tracker = new Tracklytic({
apiToken: process.env.TRACKLYTIC_API_TOKEN!,
projectId: process.env.TRACKLYTIC_PROJECT_ID!
});
export function middleware(request: NextRequest) {
// Page View automatisch tracken
tracker.track('page_view', {
page: request.nextUrl.pathname,
referrer: request.headers.get('referer'),
user_agent: request.headers.get('user-agent')
});
return NextResponse.next();
}
export const config = {
matcher: ['/((?!api|_next/static|_next/image|favicon.ico).*)'],
};Event Tracking
Einfaches Event
import { useTracklytic } from 'tracklytic-next';
function ContactForm() {
const { track } = useTracklytic();
const handleSubmit = (formData) => {
track('form_submitted', {
form_name: 'contact',
page: '/contact'
});
};
return (
<form onSubmit={handleSubmit}>
{/* Form fields */}
</form>
);
}Event mit Channel
function EcommercePage() {
const { track } = useTracklytic();
const handlePurchase = (product) => {
track('purchase', {
product_id: product.id,
amount: product.price,
currency: 'EUR'
}, 'ecommerce');
};
return (
<button onClick={() => handlePurchase(product)}>
Buy Now
</button>
);
}Event mit erweiterten Optionen
function PremiumFeature() {
const { track } = useTracklytic();
const handleUpgrade = () => {
track('upgrade_clicked', {
feature: 'premium_analytics',
page: '/dashboard'
}, {
notify: true,
icon: '⭐',
tags: {
user_tier: 'free',
campaign: 'premium_promotion'
}
});
};
return (
<button onClick={handleUpgrade}>
Upgrade to Premium
</button>
);
}User Identification
Automatische Identifikation
import { useTracklyticIdentify } from 'tracklytic-next';
function UserDashboard({ user }) {
// Automatische Identifikation bei User-Änderung
useTracklyticIdentify(user.id, {
name: user.name,
email: user.email,
plan: user.plan,
signup_date: user.createdAt,
last_login: new Date().toISOString()
});
return <div>Dashboard für {user.name}</div>;
}Manuelle Identifikation
function UserSettings() {
const { identify } = useTracklytic();
const updateProfile = async (userData) => {
// Profil in der Datenbank aktualisieren
await updateUserProfile(userData);
// Tracklytic-Profil aktualisieren
identify(userData.id, {
name: userData.name,
email: userData.email,
preferences: userData.preferences
});
};
return (
<form onSubmit={updateProfile}>
{/* Form fields */}
</form>
);
}Insights Management
Real-time Insights
function AnalyticsDashboard() {
const { insight, incrementInsight } = useTracklytic();
useEffect(() => {
// Dashboard-Öffnung tracken
incrementInsight('dashboard_views', 1);
}, []);
const updateMetrics = (metrics) => {
Object.entries(metrics).forEach(([key, value]) => {
insight(key, value, { icon: '📊' });
});
};
return (
<div>
<h1>Analytics Dashboard</h1>
{/* Dashboard content */}
</div>
);
}Business Metrics
function RevenueTracker() {
const { insight } = useTracklytic();
const trackRevenue = (amount) => {
insight('daily_revenue', amount, {
icon: '💰'
});
insight('monthly_revenue', amount, {
icon: '📈'
});
};
return (
<div>
<button onClick={() => trackRevenue(29.99)}>
Track Revenue
</button>
</div>
);
}Performance-Optimierung
Lazy Loading
import { lazy, Suspense } from 'react';
const TracklyticProvider = lazy(() =>
import('tracklytic-next').then(module => ({
default: module.TracklyticProvider
}))
);
function App() {
return (
<Suspense fallback={<div>Loading...</div>}>
<TracklyticProvider
apiToken="your_api_token_here"
projectId="your_project_id"
>
<MyApp />
</TracklyticProvider>
</Suspense>
);
}Conditional Loading
function ConditionalTracking() {
const { track } = useTracklytic();
const [isEnabled, setIsEnabled] = useState(false);
const handleEvent = (event, properties) => {
if (isEnabled) {
track(event, properties);
}
};
return (
<div>
<label>
<input
type="checkbox"
checked={isEnabled}
onChange={(e) => setIsEnabled(e.target.checked)}
/>
Enable Tracking
</label>
<button onClick={() => handleEvent('button_click', { button: 'test' })}>
Test Event
</button>
</div>
);
}SSR/SSG Support
Static Site Generation
// pages/products/[id].tsx
import { GetStaticProps } from 'next';
import { useTracklytic } from 'tracklytic-next';
export default function ProductPage({ product }) {
const { track } = useTracklytic();
useEffect(() => {
// Client-side Event nach Hydration
track('product_viewed', {
product_id: product.id,
product_name: product.name
});
}, [product.id]);
return (
<div>
<h1>{product.name}</h1>
{/* Product content */}
</div>
);
}
export const getStaticProps: GetStaticProps = async ({ params }) => {
const product = await getProduct(params.id);
return {
props: { product },
revalidate: 60
};
};Server-side Rendering
// pages/api/track-server/route.ts
import { NextRequest, NextResponse } from 'next/server';
import { Tracklytic } from 'tracklytic-next/server';
const tracker = new Tracklytic({
apiToken: process.env.TRACKLYTIC_API_TOKEN!,
projectId: process.env.TRACKLYTIC_PROJECT_ID!
});
export async function POST(request: NextRequest) {
try {
const { event, properties, user_id } = await request.json();
// Server-side Event
await tracker.track(event, {
...properties,
server_side: true,
timestamp: new Date().toISOString()
});
// User-Identifikation falls vorhanden
if (user_id) {
await tracker.identify(user_id, {
last_activity: new Date().toISOString()
});
}
return NextResponse.json({ success: true });
} catch (error) {
return NextResponse.json(
{ error: 'Tracking failed' },
{ status: 500 }
);
}
}TypeScript Support
Typisierte Events
// types/tracking.ts
interface TrackingEvents {
page_view: {
page: string;
title?: string;
referrer?: string;
};
button_click: {
button: string;
page: string;
position?: string;
};
purchase: {
product_id: string;
amount: number;
currency: string;
payment_method?: string;
};
}
// hooks/useTypedTracklytic.ts
import { useTracklytic } from 'tracklytic-next';
export function useTypedTracklytic() {
const { track, identify, insight } = useTracklytic();
const typedTrack = <K extends keyof TrackingEvents>(
event: K,
properties: TrackingEvents[K]
) => {
track(event, properties);
};
return { track: typedTrack, identify, insight };
}Typisierte Komponenten
// components/TrackingButton.tsx
import { useTypedTracklytic } from '@/hooks/useTypedTracklytic';
interface TrackingButtonProps {
event: keyof TrackingEvents;
properties: TrackingEvents[keyof TrackingEvents];
children: React.ReactNode;
className?: string;
}
export function TrackingButton({
event,
properties,
children,
className
}: TrackingButtonProps) {
const { track } = useTypedTracklytic();
const handleClick = () => {
track(event, properties);
};
return (
<button onClick={handleClick} className={className}>
{children}
</button>
);
}Best Practices
Event-Namen
// ✅ Gut - Beschreibend und konsistent
track('user_signup_completed');
track('product_added_to_cart');
track('payment_processed');
// ❌ Schlecht - Vage und inkonsistent
track('click');
track('action');
track('event');Performance-Optimierung
// Batch-Events für bessere Performance
const { track } = useTracklytic();
const handleMultipleEvents = useCallback(() => {
// Events sammeln und in einem Batch senden
track('page_view', { page: '/checkout' });
track('button_click', { button: 'proceed' });
track('form_started', { form: 'checkout' });
}, [track]);Error Handling
function SafeTrackingComponent() {
const { track } = useTracklytic();
const safeTrack = useCallback((event, properties) => {
try {
track(event, properties);
} catch (error) {
console.error('Tracking error:', error);
// Fallback-Logik oder Retry-Mechanismus
}
}, [track]);
return (
<button onClick={() => safeTrack('button_click', { button: 'safe' })}>
Safe Tracking
</button>
);
}Nächste Schritte: Schauen Sie sich das Swift SDK an oder erkunden Sie praktische Beispiele.