Databuddy provides powerful tools for creating custom dashboards and reports beyond the default analytics views. You can track custom events, build custom queries, and visualize data exactly how you need it.
SELECT name, count() as event_count, count(DISTINCT anonymous_id) as unique_usersFROM analytics.eventsWHERE website_id = 'your-website-id' AND created >= now() - INTERVAL 30 DAYGROUP BY nameORDER BY event_count DESCLIMIT 20
Conversion funnel:
SELECT countIf(name = 'product_viewed') as viewed, countIf(name = 'add_to_cart') as added_to_cart, countIf(name = 'checkout_started') as checkout, countIf(name = 'purchase') as purchased, round(purchased / viewed * 100, 2) as conversion_rateFROM analytics.eventsWHERE website_id = 'your-website-id' AND created >= now() - INTERVAL 7 DAY
Property breakdown:
SELECT JSONExtractString(properties, 'feature_name') as feature, count() as usage_count, count(DISTINCT anonymous_id) as unique_usersFROM analytics.eventsWHERE website_id = 'your-website-id' AND name = 'feature_activated' AND created >= now() - INTERVAL 30 DAYGROUP BY featureORDER BY usage_count DESC
Add properties that help you understand the ‘why’ and ‘where’:
track('upgrade_clicked', { current_plan: 'starter', target_plan: 'pro', source: 'limit_modal', // Where the upgrade was initiated trigger: 'api_limit', // What triggered the upgrade prompt page: '/dashboard'});
Don't track sensitive data
Never include PII or sensitive information in event properties:Never track:
Email addresses
Full names
Credit card numbers
Phone numbers
Passwords
Social security numbers
Safe to track:
User IDs (hashed or internal)
Plan types
Feature flags
Product SKUs
Anonymized behavior
Validate events in development
Test your tracking before deploying:
import { track } from '@databuddy/sdk';function validateAndTrack( name: string, properties?: Record<string, unknown>) { if (process.env.NODE_ENV === 'development') { console.log('Event:', name, properties); } track(name, properties);}// Use in your appvalidateAndTrack('feature_used', { feature: 'export' });
Databuddy automatically batches events for efficiency. You can configure batching behavior:
import { Databuddy } from '@databuddy/sdk/react';<Databuddy enableBatching={true} batchSize={10} // Send after 10 events batchTimeout={2000} // Or after 2 seconds/>
For critical events that must be sent immediately:
import { track, flush } from '@databuddy/sdk';// Track critical eventtrack('purchase_completed', { amount: 99.99 });// Force immediate sendflush();