isometrik-web-tracker
Version:
Production-grade user tracking library with multiple tracking methods
686 lines (529 loc) • 15.6 kB
Markdown
# Isometrik Web Tracker 🎯
A comprehensive, production-grade user tracking library for web applications. Track user behavior, element visibility, engagement metrics, and more with zero performance impact.
[](https://badge.fury.io/js/isometrik-web-tracker)
[](https://opensource.org/licenses/MIT)
[](https://www.typescriptlang.org/)
## ✨ Features
- 🎯 **Element Visibility Tracking** - Track when elements enter/exit viewport
- 🖱️ **Mouse Activity** - Clicks, movements, hovers, drags
- ⌨️ **Keyboard Interactions** - Keystrokes, key combinations
- 📜 **Scroll Behavior** - Depth, velocity, direction tracking
- 👆 **Touch Gestures** - Tap, swipe, pinch, long press
- 👁️ **Focus & Visibility** - Window focus, page visibility
- 🌐 **Network Status** - Online/offline monitoring
- ⏱️ **Time Tracking** - Active time, idle time, engagement rates
- 🔒 **Privacy-First** - GDPR compliant, secure data handling
- 🚀 **Performance Optimized** - Zero impact on page performance
- 📱 **Mobile Ready** - Touch and gesture support
- 🔧 **TypeScript** - Full type safety and IntelliSense
## 📦 Installation
```bash
npm install isometrik-web-tracker
```
## 🚀 Quick Start
### Basic Usage
```typescript
import PageTimeTracker from 'isometrik-web-tracker';
// Initialize the tracker
const tracker = new PageTimeTracker({
enableConsoleLog: true, // Enable for development
onTimeUpdate: data => {
console.log('Time update:', data);
},
onElementVisible: (elementKey, data) => {
console.log('Element visible:', elementKey, data);
},
});
// Track specific elements
tracker.trackElement('#hero-section', 'hero', {
trackVisibility: true,
trackInteractions: true,
threshold: 0.5, // 50% visible
});
tracker.trackElement('#signup-form', 'signup', {
trackVisibility: true,
trackInteractions: true,
threshold: 0.3, // 30% visible
});
// Get tracking data
const data = tracker.getTrackingData();
console.log('Tracking data:', data);
```
### Advanced Usage
```typescript
import PageTimeTracker from 'isometrik-web-tracker';
const tracker = new PageTimeTracker({
idleThreshold: 30000, // 30 seconds
trackingInterval: 1000, // 1 second updates
enableConsoleLog: false, // Disable in production
secureModeEnabled: true, // Encrypt data
trackingKey: 'my-app-v1',
// Callbacks
onActivityChange: (isActive, activityType) => {
console.log('Activity changed:', isActive, activityType);
},
onTimeUpdate: data => {
// Send to analytics service
analytics.track('page_time', {
sessionId: data.sessionId,
totalTime: data.totalTimeSpent,
activeTime: data.activeTimeSpent,
engagementRate: (data.activeTimeSpent / data.totalTimeSpent) * 100,
});
},
onElementVisible: (elementKey, data) => {
analytics.track('element_visible', {
elementKey,
visibleTime: data.totalVisibleTime,
visibilityCount: data.visibilityCount,
});
},
onTrackingEvent: event => {
// Send encrypted data to your server
fetch('/api/tracking', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ event: btoa(JSON.stringify(event)) }),
});
},
});
```
## 📚 API Reference
### PageTimeTracker
The main class that orchestrates all tracking functionality.
#### Constructor Options
```typescript
interface TrackerOptions {
idleThreshold?: number; // milliseconds (default: 30000)
trackingInterval?: number; // milliseconds (default: 1000)
enableConsoleLog?: boolean; // default: false
secureModeEnabled?: boolean; // default: false
trackingKey?: string; // auto-generated if not provided
// Callbacks
onActivityChange?: (isActive: boolean, activityType?: ActivityType) => void;
onTimeUpdate?: (data: TimeTrackingData) => void;
onElementVisible?: (elementKey: string, data: ElementTrackingData) => void;
onElementHidden?: (elementKey: string, data: ElementTrackingData) => void;
onTrackingEvent?: (event: TrackingEvent) => void;
}
```
#### Methods
##### `trackElement(element, trackingKey, options?)`
Track an element for visibility and interactions.
```typescript
tracker.trackElement('#hero-section', 'hero', {
trackVisibility: true,
trackInteractions: true,
threshold: 0.5, // 50% visible
});
```
##### `untrackElement(trackingKey)`
Stop tracking an element.
```typescript
tracker.untrackElement('hero');
```
##### `getTrackingData()`
Get complete tracking data.
```typescript
const data = tracker.getTrackingData();
// Returns TimeTrackingData object
```
##### `getFormattedData()`
Get human-readable formatted data.
```typescript
const formatted = tracker.getFormattedData();
// Returns: { totalTime: "2m 30s", activeTime: "1m 45s", ... }
```
##### `getActivityStats()`
Get activity statistics.
```typescript
const stats = tracker.getActivityStats();
// Returns: { mouseEvents: 45, keyboardEvents: 12, ... }
```
##### `getElementTrackingData(trackingKey)`
Get data for a specific element.
```typescript
const elementData = tracker.getElementTrackingData('hero');
```
##### `pause()`
Pause all tracking.
```typescript
tracker.pause();
```
##### `resume()`
Resume tracking.
```typescript
tracker.resume();
```
##### `reset()`
Reset all tracking data.
```typescript
tracker.reset();
```
##### `exportData()`
Export data as JSON string (encrypted if secure mode enabled).
```typescript
const exported = tracker.exportData();
```
##### `destroy()`
Clean up and destroy the tracker.
```typescript
tracker.destroy();
```
## 🎯 Individual Tracking Modules
### ActivityDetector
Detect general user activity across all interaction types.
```typescript
import { ActivityDetector } from 'isometrik-web-tracker';
const detector = new ActivityDetector({
enableConsoleLog: true,
onActivity: activityType => {
console.log('Activity detected:', activityType);
},
});
```
### ElementVisibilityTracker
Track element visibility using IntersectionObserver.
```typescript
import { ElementVisibilityTracker } from 'isometrik-web-tracker';
const visibilityTracker = new ElementVisibilityTracker({
enableConsoleLog: true,
onVisible: (elementKey, element, data) => {
console.log('Element became visible:', elementKey, data);
},
onHidden: (elementKey, element, data) => {
console.log('Element became hidden:', elementKey, data);
},
});
// Track an element
visibilityTracker.trackElement(document.querySelector('#hero'), 'hero', {
threshold: 0.5, // 50% visible
});
```
### MouseTracker
Track mouse interactions.
```typescript
import { MouseTracker } from 'isometrik-web-tracker';
const mouseTracker = new MouseTracker({
enableConsoleLog: true,
trackClicks: true,
trackMovement: true,
trackHovers: true,
onMouseActivity: data => {
console.log('Mouse activity:', data);
},
});
```
### ScrollTracker
Track scrolling behavior.
```typescript
import { ScrollTracker } from 'isometrik-web-tracker';
const scrollTracker = new ScrollTracker({
enableConsoleLog: true,
trackDepth: true,
trackVelocity: true,
onScrollActivity: data => {
console.log('Scroll activity:', data);
},
});
// Get current scroll depth
const depth = scrollTracker.getCurrentScrollDepth(); // 0-100%
```
### KeyboardTracker
Track keyboard interactions.
```typescript
import { KeyboardTracker } from 'isometrik-web-tracker';
const keyboardTracker = new KeyboardTracker({
enableConsoleLog: true,
trackKeystrokes: true,
trackCombinations: true,
onKeyboardActivity: data => {
console.log('Keyboard activity:', data);
},
});
```
### TouchTracker
Track touch gestures on mobile devices.
```typescript
import { TouchTracker } from 'isometrik-web-tracker';
const touchTracker = new TouchTracker({
enableConsoleLog: true,
trackGestures: true,
trackPressure: true,
onTouchActivity: data => {
console.log('Touch activity:', data);
},
});
```
### FocusTracker
Track window focus and page visibility.
```typescript
import { FocusTracker } from 'isometrik-web-tracker';
const focusTracker = new FocusTracker({
enableConsoleLog: true,
onFocusChange: hasFocus => {
console.log('Focus changed:', hasFocus);
},
});
```
### NetworkTracker
Track network connectivity.
```typescript
import { NetworkTracker } from 'isometrik-web-tracker';
const networkTracker = new NetworkTracker({
enableConsoleLog: true,
onNetworkChange: isOnline => {
console.log('Network status:', isOnline);
},
});
```
## 📊 Data Types
### TimeTrackingData
```typescript
interface TimeTrackingData {
sessionId: string;
trackingKey: string;
totalTimeSpent: number;
activeTimeSpent: number;
idleTimeSpent: number;
pageVisits: number;
lastActivity: Date;
sessionStart: Date;
url: string;
title: string;
referrer: string;
userAgent: string;
elementTrackingData: Record<string, ElementTrackingData>;
activityHistory: TrackingEvent[];
}
```
### ElementTrackingData
```typescript
interface ElementTrackingData {
elementKey: string;
totalVisibleTime: number;
visibilityCount: number;
firstSeen: Date;
lastSeen: Date;
isCurrentlyVisible: boolean;
viewportPercentage: number;
interactions: ElementInteraction[];
}
```
### ActivityStats
```typescript
interface ActivityStats {
mouseEvents: number;
keyboardEvents: number;
scrollEvents: number;
touchEvents: number;
totalEvents: number;
}
```
## 🔧 Advanced Examples
### E-commerce Analytics
```typescript
const tracker = new PageTimeTracker({
onElementVisible: (elementKey, data) => {
if (elementKey === 'product-card') {
analytics.track('product_view', {
productId: data.elementKey,
viewTime: data.totalVisibleTime,
interactions: data.interactions.length,
});
}
},
onTrackingEvent: event => {
if (event.type === 'element_interaction' && event.data.type === 'click') {
analytics.track('product_click', {
productId: event.data.elementKey,
position: event.data.position,
});
}
},
});
// Track product cards
document.querySelectorAll('.product-card').forEach((card, index) => {
tracker.trackElement(card, `product-${index}`, {
trackVisibility: true,
trackInteractions: true,
threshold: 0.3,
});
});
```
### Form Analytics
```typescript
const tracker = new PageTimeTracker({
onElementVisible: (elementKey, data) => {
if (elementKey.startsWith('form-field-')) {
analytics.track('form_field_view', {
fieldName: elementKey,
viewTime: data.totalVisibleTime,
});
}
},
});
// Track form fields
document.querySelectorAll('input, textarea, select').forEach(field => {
const fieldName = field.name || field.id || 'unknown';
tracker.trackElement(field, `form-field-${fieldName}`, {
trackVisibility: true,
trackInteractions: true,
});
});
```
### Content Engagement
```typescript
const tracker = new PageTimeTracker({
onTimeUpdate: data => {
const engagementRate = (data.activeTimeSpent / data.totalTimeSpent) * 100;
if (engagementRate > 70) {
analytics.track('high_engagement', {
sessionId: data.sessionId,
engagementRate,
totalTime: data.totalTimeSpent,
});
}
},
});
// Track content sections
document.querySelectorAll('section, article').forEach((section, index) => {
tracker.trackElement(section, `content-${index}`, {
trackVisibility: true,
trackInteractions: true,
threshold: 0.5,
});
});
```
### Performance Monitoring
```typescript
const tracker = new PageTimeTracker({
onTrackingEvent: event => {
// Monitor for performance issues
if (event.type === 'scroll' && event.data.velocity > 1000) {
console.warn('High scroll velocity detected');
}
if (event.type === 'mouse' && event.data.movement) {
const distance = Math.sqrt(
event.data.movement.x ** 2 + event.data.movement.y ** 2
);
if (distance > 100) {
console.warn('Large mouse movement detected');
}
}
},
});
```
## 🔒 Privacy & Security
### GDPR Compliance
The library is designed with privacy in mind:
- **No Personal Data**: Only tracks interaction patterns, not personal information
- **User Consent**: Respects user privacy preferences
- **Data Minimization**: Only collects necessary data
- **Transparency**: Clear data collection practices
### Secure Mode
Enable secure mode to encrypt all tracking data:
```typescript
const tracker = new PageTimeTracker({
secureModeEnabled: true, // Encrypt all data
enableConsoleLog: false, // Disable console logs
onTrackingEvent: event => {
// Send encrypted data to your server
fetch('/api/tracking', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ event: btoa(JSON.stringify(event)) }),
});
},
});
```
### Privacy Controls
```typescript
// Pause tracking when user opts out
function pauseTracking() {
tracker.pause();
localStorage.setItem('tracking-consent', 'false');
}
// Resume tracking when user consents
function resumeTracking() {
tracker.resume();
localStorage.setItem('tracking-consent', 'true');
}
// Check user consent
if (localStorage.getItem('tracking-consent') === 'false') {
tracker.pause();
}
```
## 🚀 Performance Optimization
### Best Practices
1. **Disable Console Logs in Production**
```typescript
const tracker = new PageTimeTracker({
enableConsoleLog: process.env.NODE_ENV === 'development',
});
```
2. **Use Appropriate Thresholds**
```typescript
// For important elements (CTAs, forms)
tracker.trackElement('#cta-button', 'cta', { threshold: 0.1 });
// For content sections
tracker.trackElement('#content', 'content', { threshold: 0.5 });
```
3. **Clean Up on Page Unload**
```typescript
window.addEventListener('beforeunload', () => {
const finalData = tracker.getTrackingData();
// Send final data to server
navigator.sendBeacon('/api/tracking/end', JSON.stringify(finalData));
tracker.destroy();
});
```
4. **Batch Data Sending**
```typescript
let eventBuffer = [];
const tracker = new PageTimeTracker({
onTrackingEvent: event => {
eventBuffer.push(event);
if (eventBuffer.length >= 10) {
// Send batch of events
fetch('/api/tracking/batch', {
method: 'POST',
body: JSON.stringify(eventBuffer),
});
eventBuffer = [];
}
},
});
```
## 🌐 Browser Support
- **Chrome**: 60+
- **Firefox**: 55+
- **Safari**: 12+
- **Edge**: 79+
- **Mobile Safari**: 12+
- **Chrome Mobile**: 60+
## 📦 Bundle Size
- **Minified**: ~45KB
- **Gzipped**: ~15KB
- **Tree-shakeable**: Import only what you need
## 🤝 Contributing
1. Fork the repository
2. Create a feature branch
3. Make your changes
4. Add tests
5. Submit a pull request
## 📄 License
MIT License - see [LICENSE](LICENSE) file for details.
## 🆘 Support
- **Documentation**: [GitHub Wiki](https://github.com/yourusername/isometrik-web-tracker/wiki)
- **Issues**: [GitHub Issues](https://github.com/yourusername/isometrik-web-tracker/issues)
- **Discussions**: [GitHub Discussions](https://github.com/yourusername/isometrik-web-tracker/discussions)
## 🔄 Changelog
### v1.0.0
- Initial release
- Complete tracking functionality
- TypeScript support
- Performance optimizations
- Privacy features
---
**Made with ❤️ by the Isometrik team**