Analytics Tracking Guide
Guide to implement analytics tracking in 54VIE Super App.
Setup
Host App
import { AnalyticsProvider } from '@54vie/analytics';
function App() {
return (
<AnalyticsProvider config={{
appId: '54vie-host',
apiKey: process.env.ANALYTICS_API_KEY,
apiEndpoint: 'https://analytics.54vie.vn',
debug: __DEV__,
}}>
<MainApp />
</AnalyticsProvider>
);
}
Mini-App
Mini-apps use the SDK - events are automatically attributed to the mini-app:
import { analytics } from '@54vie/miniapp-sdk';
analytics.track('event_name', { property: 'value' });
Event Tracking
Screen Views
// Automatic (in host with navigation integration)
// Or manual:
const { screen } = useAnalytics();
useEffect(() => {
screen('ProductScreen', { product_id: productId });
}, []);
Custom Events
const { track } = useAnalytics();
// Button click
track('button_clicked', {
button_name: 'add_to_cart',
screen: 'ProductDetail',
});
// Search
track('search', {
query: 'iphone',
results_count: 25,
});
// Form submission
track('form_submitted', {
form_name: 'checkout',
fields_count: 5,
});
Standard Events
Use standard event names for consistency:
import { StandardEvents } from '@54vie/analytics';
// Auth
track(StandardEvents.LOGIN, { method: 'email' });
track(StandardEvents.SIGN_UP, { method: 'google' });
track(StandardEvents.LOGOUT);
// E-commerce
track(StandardEvents.VIEW_PRODUCT, {
product_id: '123',
product_name: 'iPhone 15',
price: 25000000,
currency: 'VND',
category: 'phones',
});
track(StandardEvents.ADD_TO_CART, {
product_id: '123',
quantity: 1,
price: 25000000,
});
track(StandardEvents.PURCHASE, {
order_id: 'order_456',
total: 25000000,
currency: 'VND',
items: [
{ product_id: '123', quantity: 1, price: 25000000 },
],
});
// Mini-app
track(StandardEvents.MINI_APP_OPEN, { app_id: 'com.54vie.shopping' });
track(StandardEvents.MINI_APP_CLOSE, { app_id: 'com.54vie.shopping', duration: 120000 });
User Identification
const { identify, reset } = useAnalytics();
// After login
identify('user_123', {
name: 'John Doe',
email: 'john@example.com',
phone: '+84901234567',
plan: 'premium',
created_at: '2024-01-15',
});
// After logout
reset();
User Properties
const { setProperty, increment } = useUserProperties();
// Set property
setProperty('favorite_category', 'electronics');
// Increment counter
increment('purchase_count');
increment('total_spent', 500000);
Revenue Tracking
import { Analytics } from '@54vie/analytics';
Analytics.trackRevenue({
amount: 500000,
currency: 'VND',
productId: 'premium_monthly',
productName: 'Premium Subscription',
orderId: 'order_789',
});
Timed Events
const { startTimer, endTimer } = useAnalytics();
// Start timing
startTimer('checkout_flow');
// ... user completes checkout ...
// End timing (auto-tracks with duration)
endTimer('checkout_flow', {
payment_method: 'card',
success: true,
});
// Tracks: checkout_flow { duration: 45000, payment_method: 'card', success: true }
Funnel Tracking
Track user journey through a funnel:
// Step 1: View product
track('funnel_product_viewed', { funnel: 'purchase', step: 1 });
// Step 2: Add to cart
track('funnel_added_to_cart', { funnel: 'purchase', step: 2 });
// Step 3: Start checkout
track('funnel_checkout_started', { funnel: 'purchase', step: 3 });
// Step 4: Payment entered
track('funnel_payment_entered', { funnel: 'purchase', step: 4 });
// Step 5: Purchase completed
track('funnel_purchase_completed', { funnel: 'purchase', step: 5 });
A/B Testing
import { useExperiment, useFeatureFlag } from '@54vie/analytics';
// Experiment
function CheckoutScreen() {
const { variant } = useExperiment('checkout_v2');
if (variant === 'new') {
return <NewCheckout />;
}
return <OldCheckout />;
}
// Feature flag
function NewFeature() {
const isEnabled = useFeatureFlag('new_feature');
if (!isEnabled) return null;
return <FeatureComponent />;
}
// Track conversion
const { trackConversion } = useExperimentConversion('checkout_v2');
const handlePurchase = () => {
trackConversion('purchase', orderTotal);
};
Best Practices
1. Use consistent naming
// ✅ Good - snake_case, action_object pattern
track('button_clicked', { button_name: 'checkout' });
track('product_viewed', { product_id: '123' });
// ❌ Bad - inconsistent
track('ButtonClick', {});
track('viewedProduct', {});
2. Include relevant context
// ✅ Good - include context
track('product_viewed', {
product_id: '123',
product_name: 'iPhone 15',
price: 25000000,
category: 'phones',
source: 'search',
position: 3,
});
// ❌ Bad - missing context
track('product_viewed', { id: '123' });
3. Track failures too
// ✅ Good - track both success and failure
track('payment_success', { order_id, amount });
track('payment_failed', { order_id, error_code, error_message });
// ❌ Bad - only tracking success
track('payment_completed', { order_id });
4. Don't over-track
// ❌ Bad - too granular
track('input_focused');
track('input_char_typed');
track('input_blurred');
// ✅ Good - meaningful events
track('form_field_completed', { field: 'email' });
Debug Mode
// Enable in development
<AnalyticsProvider config={{ debug: __DEV__ }}>
// Events logged to console:
// [Analytics] Queued: track:button_clicked
// [Analytics] Flushed 5 events
// Force flush
const { flush } = useAnalytics();
await flush();