me-shaon/laravel-request-analytics
Privacy-first web analytics for Laravel: track real-time page views, visitors, bounce rate, sessions, and performance in a built-in dashboard. Includes bot filtering, geo/device insights, data retention controls, IP anonymization, and a REST API—no third-party sharing.
Installation:
composer require me-shaon/laravel-request-analytics
php artisan request-analytics:install
The installer handles migrations, config, and assets automatically.
First Use Case:
/analytics (or your configured path)Where to Look First:
config/request-analytics.php (adjust paths, middleware, geolocation)app/Http/Kernel.php (ensure RequestAnalyticsMiddleware is registered)/analytics (default route)Middleware Integration:
// app/Http/Kernel.php
protected $middlewareGroups = [
'web' => [
// ...
\MeShaon\RequestAnalytics\Http\Middleware\RequestAnalyticsMiddleware::class,
],
];
Queue-Based Processing (for high-traffic sites):
// config/request-analytics.php
'queue' => [
'enabled' => true,
'on_queue' => 'analytics',
],
php artisan queue:work).Custom Metrics:
// Track custom events (e.g., form submissions)
use MeShaon\RequestAnalytics\Facades\RequestAnalytics;
RequestAnalytics::trackEvent('form_submitted', ['form_id' => 123]);
API Access:
// Fetch analytics data programmatically
$visitors = \MeShaon\RequestAnalytics\Models\RequestAnalytics::query()
->where('created_at', '>=', now()->subDays(7))
->count();
request-analytics.access middleware to restrict dashboard access:
'middleware' => [
'web' => [
'auth',
'request-analytics.access',
],
],
'geolocation' => [
'provider' => 'maxmind',
'maxmind' => [
'type' => 'database',
'database_path' => storage_path('app/GeoLite2-City.mmdb'),
],
],
'ignore-paths' => [
'admin/*',
'api/v1/*',
],
Double Tracking:
RequestAnalyticsMiddleware is not added twice (e.g., in both web and api groups if unintended).app/Http/Kernel.php for duplicate middleware entries.Queue Stuck Jobs:
queue.enabled = true, monitor the analytics queue for failed jobs:
php artisan queue:failed-table
php artisan queue:retry <job-id>
queue:work --sleep=3 --tries=3 for resilience.Geolocation Failures:
ipapi) have rate limits. Cache responses:
'cache' => [
'ttl' => 15, // Cache geolocation for 15 minutes
],
Pruning Issues:
model:prune fails, verify the model namespace in config/request-analytics.php matches MeShaon\RequestAnalytics\Models\RequestAnalytics.'debug' => [
'enabled' => true,
'log_path' => storage_path('logs/request-analytics.log'),
],
php artisan tinker
>>> \MeShaon\RequestAnalytics\Models\RequestAnalytics::first();
Custom Fields:
Extend the RequestAnalytics model to add custom attributes:
// app/Models/RequestAnalytics.php
use MeShaon\RequestAnalytics\Models\RequestAnalytics as BaseAnalytics;
class RequestAnalytics extends BaseAnalytics {
protected $casts = [
'custom_field' => 'string',
];
}
Override Views: Publish and modify dashboard templates:
php artisan vendor:publish --tag="request-analytics-views"
resources/views/vendor/request-analytics/.API Extensions:
Add custom endpoints by extending the AnalyticsController:
// app/Http/Controllers/AnalyticsController.php
use MeShaon\RequestAnalytics\Http\Controllers\AnalyticsController as BaseController;
class AnalyticsController extends BaseController {
public function customReport() {
return response()->json(['custom_data' => '...']);
}
}
\MeShaon\RequestAnalytics\Models\RequestAnalytics::insert([
['path' => '/home', 'ip' => '192.168.1.1', 'created_at' => now()],
// ... more records
]);
Schema::table('request_analytics', function (Blueprint $table) {
$table->index('path');
$table->index('created_at');
});
'privacy' => [
'anonymize_ip' => true,
],
'pruning' => [
'days' => 30, // Retain data for 30 days
],
Route::get('/analytics/delete-my-data', [AnalyticsController::class, 'deleteUserData']);
How can I help you explore Laravel packages today?