Integrations

React

Integrate privacy-first analytics in your React application

React Integration

Add Databuddy's privacy-first analytics to your React application with TypeScript support and modern best practices.

Installation

Install the Databuddy SDK:

npm install @databuddy/sdk

or with yarn:

yarn add @databuddy/sdk

Basic Setup

1. Add the Script Component

Add the <Databuddy /> component to inject the tracking script:

// App.tsx
import { Databuddy } from '@databuddy/sdk';

function App() {
  return (
    <>
      <Databuddy 
        clientId="YOUR_SITE_ID"
        trackScreenViews={true}
        trackAttributes={true}
      />
      <YourAppContent />
    </>
  );
}

export default App;

2. Track Page Views

For React Router integration:

// App.tsx
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
import { track } from '@databuddy/sdk';

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

  useEffect(() => {
    track('screen_view', {
      screen_name: location.pathname,
      screen_class: 'React'
    });
  }, [location]);

  return <YourAppContent />;
}

Event Tracking

Basic Event Tracking

Track events using the track function:

import { track } from '@databuddy/sdk';

function MyComponent() {
  const handleButtonClick = () => {
    track('button_click', {
      button_text: 'Get Started',
      location: 'header'
    });
  };

  return (
    <button onClick={handleButtonClick}>
      Get Started
    </button>
  );
}

Custom Hook for Events

Create a custom hook for cleaner tracking:

import { useCallback } from 'react';
import { track } from '@databuddy/sdk';

function useTracking() {
  const trackButtonClick = useCallback((buttonText: string, location: string) => {
    track('button_click', {
      button_text: buttonText,
      location
    });
  }, []);

  const trackPageView = useCallback((pageName: string) => {
    track('screen_view', {
      screen_name: pageName,
      screen_class: 'React'
    });
  }, []);

  return { trackButtonClick, trackPageView };
}

// Usage in component
function MyComponent() {
  const { trackButtonClick } = useTracking();

  return (
    <button onClick={() => trackButtonClick('Get Started', 'header')}>
      Get Started
    </button>
  );
}

Product Tracking Example

import { useEffect } from 'react';
import { track } from '@databuddy/sdk';

function ProductCard({ product }) {
  useEffect(() => {
    track('product_view', {
      product_id: product.id,
      product_name: product.name,
      product_category: product.category,
      product_price: product.price
    });
  }, [product]);

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

  return (
    <div>
      <h3>{product.name}</h3>
      <button onClick={handleAddToCart}>Add to Cart</button>
    </div>
  );
}

Configuration Options

Advanced Provider Setup

import { DatabuddyProvider } from '@databuddy/react';

function App() {
  return (
    <DatabuddyProvider
      siteId="YOUR_SITE_ID"
      config={{
        trackScreenViews: true,
        trackHashChanges: true,
        trackAttributes: true,
        trackOutgoingLinks: true,
        trackPerformance: true,
        trackWebVitals: true,
        enableBatching: true,
        batchSize: 10,
        batchTimeout: 2000
      }}
      debug={process.env.NODE_ENV === 'development'}
    >
      <YourAppContent />
    </DatabuddyProvider>
  );
}

Component-Level Tracking

Automatic Click Tracking

Use data attributes for automatic tracking:

function CallToAction() {
  return (
    <button
      data-track="cta_click"
      data-cta-type="primary"
      data-location="hero"
      className="bg-blue-500 text-white px-6 py-3 rounded"
    >
      Get Started Free
    </button>
  );
}

Form Tracking

Track form interactions and submissions:

import { useDatabuddy } from '@databuddy/react';

function ContactForm() {
  const { track } = useDatabuddy();

  const handleSubmit = (e) => {
    e.preventDefault();
    track('form_submit', {
      form_name: 'contact',
      form_location: 'footer'
    });
  };

  const handleFieldFocus = (fieldName: string) => {
    track('form_field_focus', {
      field_name: fieldName,
      form_name: 'contact'
    });
  };

  return (
    <form onSubmit={handleSubmit}>
      <input
        type="email"
        onFocus={() => handleFieldFocus('email')}
        placeholder="Your email"
      />
      <button type="submit">Submit</button>
    </form>
  );
}

E-commerce Tracking

Purchase Events

import { useDatabuddy } from '@databuddy/react';

function CheckoutSuccess({ order }) {
  const { track } = useDatabuddy();

  useEffect(() => {
    track('purchase', {
      transaction_id: order.id,
      value: order.total,
      currency: 'USD',
      items: order.items.map(item => ({
        item_id: item.id,
        item_name: item.name,
        item_category: item.category,
        quantity: item.quantity,
        price: item.price
      }))
    });
  }, [order, track]);

  return <div>Thank you for your purchase!</div>;
}

Cart Events

function AddToCartButton({ product }) {
  const { track } = useDatabuddy();

  const handleAddToCart = () => {
    track('add_to_cart', {
      currency: 'USD',
      value: product.price,
      items: [{
        item_id: product.id,
        item_name: product.name,
        item_category: product.category,
        quantity: 1,
        price: product.price
      }]
    });
  };

  return (
    <button onClick={handleAddToCart}>
      Add to Cart
    </button>
  );
}

Error Tracking

Error Boundaries

import { useDatabuddy } from '@databuddy/react';

function ErrorBoundary({ children }) {
  const { track } = useDatabuddy();

  const handleError = (error: Error, errorInfo: any) => {
    track('exception', {
      description: error.message,
      fatal: false,
      error_stack: error.stack,
      component_stack: errorInfo.componentStack
    });
  };

  return (
    <ErrorBoundary
      onError={handleError}
      fallback={<div>Something went wrong</div>}
    >
      {children}
    </ErrorBoundary>
  );
}

Performance Monitoring

Custom Performance Metrics

import { useDatabuddy } from '@databuddy/react';

function DataDashboard() {
  const { track } = useDatabuddy();

  useEffect(() => {
    const startTime = performance.now();
    
    // Simulate data loading
    fetchDashboardData().then(() => {
      const loadTime = performance.now() - startTime;
      
      track('dashboard_load_time', {
        load_time: Math.round(loadTime),
        data_size: 'large'
      });
    });
  }, [track]);

  return <div>Dashboard content</div>;
}

TypeScript Support

Type-Safe Event Tracking

import { useDatabuddy } from '@databuddy/react';

interface CustomEvents {
  button_click: {
    button_text: string;
    location: string;
  };
  form_submit: {
    form_name: string;
    form_location: string;
  };
}

function TypedComponent() {
  const { track } = useDatabuddy<CustomEvents>();

  const handleClick = () => {
    // TypeScript will ensure correct event properties
    track('button_click', {
      button_text: 'Subscribe',
      location: 'header'
    });
  };

  return <button onClick={handleClick}>Subscribe</button>;
}

Best Practices

1. Environment-Based Configuration

const config = {
  siteId: process.env.REACT_APP_DATABUDDY_SITE_ID,
  debug: process.env.NODE_ENV === 'development',
  disabled: process.env.NODE_ENV === 'test'
};

2. Lazy Loading

import { lazy, Suspense } from 'react';

const DatabuddyProvider = lazy(() => import('@databuddy/react'));

function App() {
  return (
    <Suspense fallback={<div>Loading...</div>}>
      <DatabuddyProvider siteId="YOUR_SITE_ID">
        <YourAppContent />
      </DatabuddyProvider>
    </Suspense>
  );
}

3. Custom Hook for Analytics

import { useDatabuddy } from '@databuddy/react';

export function useAnalytics() {
  const { track } = useDatabuddy();

  return {
    trackButtonClick: (buttonText: string, location: string) =>
      track('button_click', { button_text: buttonText, location }),
    
    trackPageView: (pageName: string, category?: string) =>
      track('screen_view', { screen_name: pageName, screen_class: category }),
    
    trackError: (error: Error, context?: string) =>
      track('exception', { description: error.message, context })
  };
}

Need help with React integration? Contact us at help@databuddy.cc.