Self-hosted analytics service for tracking user behavior across your applications. Own your data, track who came, from where, and what they did.
- Event Tracking - Track any custom event with properties
- Session Management - Automatic session tracking with timeout handling
- User Identification - Link anonymous users to identified users
- Attribution - Track referrers and UTM parameters
- Multi-Platform SDKs - Flutter and JavaScript SDKs included
- Query API - Query events, sessions, users, and aggregated metrics
- Self-Hosted - Full control over your data
# Using Docker Compose
docker-compose up -d
# Or run locally
cp .env.example .env
go mod download
go run ./cmd/serverServer runs at http://localhost:8091
curl -X POST http://localhost:8091/v1/admin/projects \
-H "Content-Type: application/json" \
-d '{"project_id": "my-app", "name": "My Application"}'Response:
{
"project_id": "my-app",
"name": "My Application",
"api_key": "ak_abc123...",
"active": true
}# pubspec.yaml
dependencies:
e2e_analytics:
path: path/to/e2e-analytics/pkg/sdk/flutterimport 'package:e2e_analytics/e2e_analytics.dart';
void main() async {
WidgetsFlutterBinding.ensureInitialized();
await E2EAnalytics.init(
endpoint: 'https://analytics.yourapp.com',
projectId: 'my-app',
debug: true,
);
runApp(MyApp());
}
// Track events
E2EAnalytics.track('button_clicked', properties: {'button': 'signup'});
// Identify users (after login)
await E2EAnalytics.identify('user-123', traits: {'plan': 'premium'});
// Track screen views
E2EAnalytics.screen('HomeScreen');
// Reset on logout
await E2EAnalytics.reset();<script src="https://your-cdn.com/analytics.js"></script>
<script>
E2EAnalytics.init({
endpoint: 'https://analytics.yourapp.com',
projectId: 'my-app',
debug: true,
trackPageViews: true, // Auto-track page views
trackClicks: false, // Auto-track button/link clicks
});
// Track events
E2EAnalytics.track('signup_started', { source: 'hero_button' });
// Identify users
E2EAnalytics.identify('user-123', { plan: 'premium' });
// Track page views manually
E2EAnalytics.page('Pricing');
// Reset on logout
E2EAnalytics.reset();
</script>POST /v1/track
{
"project_id": "my-app",
"session_id": "uuid",
"anonymous_id": "uuid",
"user_id": "user-123", // optional
"event_name": "purchase",
"properties": { // optional
"product": "Pro Plan",
"price": 29.99
},
"context": { // optional
"platform": "web",
"page_url": "https://...",
"utm_source": "google"
}
}
POST /v1/track/batch
{
"project_id": "my-app",
"events": [...]
}
POST /v1/identify
{
"project_id": "my-app",
"user_id": "user-123",
"anonymous_id": "uuid", // optional - links anonymous to user
"traits": { // optional
"email": "user@example.com",
"plan": "premium"
}
}
POST /v1/session/start
POST /v1/session/end
POST /v1/session/heartbeat
GET /v1/query/events?project_id=my-app&event_name=purchase&limit=100
GET /v1/query/sessions?project_id=my-app&user_id=user-123
GET /v1/query/metrics/events?project_id=my-app&start_time=2024-01-01T00:00:00Z
GET /v1/query/metrics/daily?project_id=my-app
GET /v1/query/metrics/referrers?project_id=my-app
GET /v1/query/metrics/utm?project_id=my-app
{
"id": "ObjectId",
"project_id": "my-app",
"session_id": "uuid",
"user_id": "user-123",
"anonymous_id": "uuid",
"event_name": "purchase",
"properties": {},
"context": {
"platform": "web",
"browser": "Chrome",
"page_url": "...",
"referrer": "...",
"utm_source": "...",
"utm_medium": "...",
"utm_campaign": "..."
},
"timestamp": "2024-01-15T10:30:00Z",
"received_at": "2024-01-15T10:30:01Z"
}{
"id": "ObjectId",
"project_id": "my-app",
"session_id": "uuid",
"user_id": "user-123",
"anonymous_id": "uuid",
"started_at": "2024-01-15T10:00:00Z",
"ended_at": "2024-01-15T10:45:00Z",
"duration": 2700,
"event_count": 15,
"first_referrer": "https://google.com",
"first_utm_source": "google",
"landing_page": "/pricing"
}{
"id": "ObjectId",
"project_id": "my-app",
"user_id": "user-123",
"anonymous_id": "uuid",
"traits": {
"email": "user@example.com",
"plan": "premium"
},
"first_seen": "2024-01-01T00:00:00Z",
"last_seen": "2024-01-15T10:30:00Z",
"total_sessions": 25,
"total_events": 342
}| Variable | Description | Default |
|---|---|---|
PORT |
Server port | 8091 |
ENV |
Environment (development/production) | development |
MONGODB_URI |
MongoDB connection string | mongodb://localhost:27017 |
MONGODB_DATABASE |
Database name | analytics |
ADMIN_API_KEY |
API key for admin endpoints | (none) |
- Connect your repository
- Add MongoDB plugin
- Set environment variables
- Deploy
docker build -t e2e-analytics .
docker run -p 8091:8091 \
-e MONGODB_URI=mongodb://host:27017 \
-e MONGODB_DATABASE=analytics \
e2e-analyticse2e-analytics/
├── cmd/server/main.go # Entry point
├── internal/
│ ├── config/ # Configuration
│ ├── handlers/ # HTTP handlers
│ ├── models/ # Data models
│ └── storage/ # MongoDB storage
├── pkg/sdk/
│ ├── flutter/ # Flutter SDK
│ └── js/ # JavaScript SDK
├── docker-compose.yml
├── Dockerfile
└── README.md
MIT