Everything you need to set up, customize, and extend your privacy-first analytics platform
npm install
Run schema.sql in Supabase
npm run dev
NEXT_PUBLIC_SUPABASE_URL=your_url
NEXT_PUBLIC_SUPABASE_ANON_KEY=your_key
SUPABASE_SERVICE_ROLE_KEY=your_service_key
sites
Your domainsvisitors
Unique userssessions
User sessionspage_views
Page visitsevents
Custom eventsRun the complete schema from database/schema.sql
Edit app/layout.js and components to replace "Fikrah Analytics"
Modify globals.css CSS variables for your brand colors
Customize app/page.js for your product positioning
Add event tracking in tracker.js and dashboard queries
Use Recharts library to add funnel, retention charts
Add CSV/PDF export functionality to dashboard
The tracking script automatically captures visitor data and sends it to your API:
// Auto-tracks on page load
analytics.track('page_view', {page: '/home'});
// Manual event tracking
analytics.track('button_click', {button: 'signup'});
// Custom conversion tracking
analytics.track('conversion', {value: 29, product: 'analytics'});
// In your React components
const handleDownload = () => {
// Your download logic
analytics.track('file_download', {
file: 'source-code.zip',
price: 29
});
};
// In app/api/analytics/collect/route.js
case 'file_download':
await handleCustomEvent(data);
break;
// Add your custom logic here
// In app/dashboard/page.jsx
const fetchConversionData = async () => {
const { data } = await supabase
.from('events')
.select('*')
.eq('event_type', 'conversion')
.gte('created_at', startDate);
return data;
};
// Auto-refresh every 30 seconds
useEffect(() => {
const interval = setInterval(fetchData, 30000);
return () => clearInterval(interval);
}, []);
fetch('/api/analytics/collect', {
method: 'POST',
body: JSON.stringify({event: 'signup'})
})
Modify tracking behavior in public/tracker.js:
const config = {
endpoint: '/api/analytics/collect',
debug: false, // Set to true for console logs
trackScrollDepth: true, // Track how far users scroll
trackTimeOnPage: true, // Track session duration
heartbeatInterval: 15000, // Ping every 15 seconds
trackUTM: true, // Capture UTM parameters
respectDoNotTrack: true // Honor DNT header
};