spatie/laravel-analytics
Fetch Google Analytics data in Laravel via a simple facade. Query visitors, pageviews, most visited pages and more for a given period, returning Collections. Easy install, configurable credentials, and ready-to-use methods for common reports.
Pros:
Analytics::), reducing boilerplate for common queries.Period class for time-based filtering, simplifying date-range logic in applications.get() method for custom queries, allowing flexibility beyond predefined methods.Cons:
google/apiclient (handled automatically via Composer).file, redis, database) for API response caching.composer require spatie/laravel-analytics
php artisan vendor:publish --tag="analytics-config"
ANALYTICS_PROPERTY_ID in .env.storage_path('app/analytics/service-account-credentials.json').cache_lifetime_in_minutes in config/analytics.php (e.g., reduce for fresher data).Analytics::fake() in tests to mock responses.Analytics::fetchTotalVisitorsAndPageViews(Period::days(1)).get() method if needed.laravel-permission).google/apiclient).Analytics::fetchVisitorsAndPageViews()).Analytics::fake().cache_lifetime_in_minutes for stale data risks.google/apiclient or Laravel version incompatibilities.php artisan cache:clear) or adjust cache_lifetime_in_minutes.Period to query recent data.config/analytics.php:
'debug' => env('ANALYTICS_DEBUG', false),
get() method with pagination (offset, maxResults).| Failure Scenario | Impact | Mitigation |
|---|---|---|
| Google API downtime | Analytics data unavailable | Implement retry logic; cache fallback data locally. |
| Credential expiration/revocation | No access to GA4 data | Monitor credential validity; automate rotation. |
| Quota exceeded | Partial/missing data | Request quota increase; implement exponential backoff. |
| Caching misconfiguration | Stale or inconsistent data | Validate cache settings; use shorter lifetimes for critical data. |
| GA4 API schema changes | Broken queries | Test against staging GA4 properties; update queries proactively. |
| Laravel caching failure | Increased API load | Use redundant cache stores (e.g., redis + file). |
get() method with filters).How can I help you explore Laravel packages today?