artisanpack-ui/analytics
Laravel package adding an admin UI for analytics: configure tracking, view key metrics and reports, and manage dashboards from your application. Designed to integrate quickly with common Laravel stacks and provide a clean, configurable analytics panel.
Installation
composer require artisanpack-ui/analytics artisanpack-ui/ai
php artisan vendor:publish --provider="ArtisanPack\Analytics\AnalyticsServiceProvider" --tag="analytics-config"
php artisan vendor:publish --provider="ArtisanPack\AI\AIServiceProvider" --tag="ai-config"
php artisan migrate
analytics and analytics_digest_preferences tables exist in your database.Configuration
config/analytics.php and set:
default_driver (e.g., database or google_analytics).consent_required (boolean for GDPR compliance).config/ai.php:
'features' => [
'analytics.insight_summary' => env('FEATURE_ANALYTICS_INSIGHTS', true),
'analytics.explain_anomaly' => env('FEATURE_ANALYTICS_ANOMALIES', true),
'analytics.segment_insight' => env('FEATURE_ANALYTICS_SEGMENTS', true),
'analytics.digest_email' => env('FEATURE_ANALYTICS_DIGESTS', true),
],
First Use Case: Track a Page View
use ArtisanPack\Analytics\Facades\Analytics;
Analytics::track('page_view', [
'path' => request()->path(),
'user_id' => auth()->id(),
]);
analytics table or dashboard for the event.First AI Use Case: Insight Summary
use ArtisanPack\AI\Facades\AI;
$summary = AI::agent('analytics.insight_summary')->run([
'start_date' => '2024-01-01',
'end_date' => '2024-01-31',
]);
{
"summary": "Traffic increased by 15% MoM, driven by organic search.",
"highlights": ["New blog series boosted sessions by 20%"],
"concerns": ["Bounce rate rose on product pages"]
}
Event Tracking (Unchanged)
Analytics::track('product_view', [
'product_id' => $product->id,
'price' => $product->price,
]);
Middleware for Auto-Tracking
Add to app/Http/Kernel.php:
\ArtisanPack\Analytics\Http\Middleware\TrackPageViews::class,
Consent Management (Unchanged)
if (Analytics::consentGranted()) {
Analytics::track('consented_event');
}
Multi-Tenant Support (Unchanged)
Analytics::setTenantId($tenant->id);
AI-Powered Insights
// Insight summary for a date range
$insights = AI::agent('analytics.insight_summary')->run(['start_date' => '2024-01-01']);
// Explain an anomaly (e.g., traffic spike)
$explanation = AI::agent('analytics.explain_anomaly')->run([
'event' => 'page_view',
'date' => '2024-01-15',
'value' => 5000, // unexpected spike
]);
<livewire:artisanpack-analytics::ai.insight-summary
start-date="2024-01-01"
end-date="2024-01-31" />
// React example
const { data: insights } = useAiAgent('analytics.insight_summary', {
start_date: '2024-01-01',
end_date: '2024-01-31'
});
Digest Emails
use ArtisanPack\Analytics\Models\AnalyticsDigestPreference;
$user->preference()->updateOrCreate([
'cadence' => 'weekly', // 'off', 'weekly', or 'monthly'
]);
php artisan analytics:digests:dispatch
resources/views/vendor/artisanpack-analytics/emails/digest.blade.php.Analytics::track('event')->dispatch();
Route::post('/api/track', [AnalyticsController::class, 'track']);
/api/analytics/ai/* routes:
Route::get('/api/analytics/ai/insights', [AnalyticsAIController::class, 'getInsights']);
analytics.ai.use ability (override in AuthServiceProvider).Database Bloat (Unchanged)
config/analytics.php:
'retention_days' => 365,
php artisan analytics:prune manually or via cron.Consent Logic Errors (Unchanged)
Analytics::shouldTrack() before tracking.AI Feature Gating
null or disabled states.config/ai.php and check the FeatureRegistry:
if (AI::featureEnabled('analytics.insight_summary')) {
$insights = AI::agent('analytics.insight_summary')->run(...);
}
Digest Email Misconfiguration
analytics.digest_email is enabled in config/ai.php.php artisan vendor:publish --provider="ArtisanPack\Analytics\AnalyticsServiceProvider" --tag="analytics-views"
SendDigestEmailJob is queued by checking jobs table after running analytics:digests:dispatch.Laravel 13 Support
composer.json constraints if needed:
"require": {
"illuminate/support": "^11.0|^12.0|^13.0"
}
Analytics::track('debug_event', [], true); // $forceLog = true
config/ai.php:
'debug' => env('AI_DEBUG', false),
storage/logs/laravel.log for agent prompts/responses.analytics_digest_preferences table has records:
SELECT * FROM analytics_digest_preferences WHERE cadence != 'off';
php artisan analytics:digests:dispatch --user=1
analytics.ai.use ability is granted to users:
// In AuthServiceProvider
Gate::define('analytics.ai.use', function ($user) {
return $user->isAdmin(); // Customize as needed
});
Custom Drivers (Unchanged)
Extend \ArtisanPack\Analytics\Contracts\AnalyticsDriver.
Event Modifiers (Unchanged)
Listen to analytics.tracking event.
Dashboard Widgets (Unchanged)
Extend \ArtisanPack\Analytics\Widgets\Widget.
AI Agent Customization
\ArtisanPack\AI\Contracts\Agent:
class CustomAnalyticsAgent implements Agent {
public function run(array $payload): array { ... }
}
Register in `How can I help you explore Laravel packages today?