jeffersongoncalves/filament-matomo
filament-matomo by jeffersongoncalves brings Matomo analytics into Filament. Add dashboard widgets and reports to view visits, page views, referrers, and traffic insights directly in your admin panel, keeping key metrics accessible without switching apps.
The plugin (filament-analytics integration) exposes a Filament Plugin object you register on a panel. Minimal setup:
composer require the package (and ensure filament-analytics-core is at ^3.1 — the new navigationGroup() only takes effect with that core version).php artisan vendor:publish, php artisan migrate).PanelProvider:->plugin(Plugin::make())
Without further config, the settings page lands in the package's translated default navigation group. First use case: if your panel already has a custom group (e.g. “Analytics”, “Reporting”, “Settings”), call navigationGroup() to place the page there instead of creating an orphan group.
->plugin(Plugin::make()->navigationGroup('Analytics'))
The string must exactly match the label of an existing group (including translation key output) to merge into it.->plugin(
Plugin::make()->navigationGroup(
fn () => auth()->user()?->isAdmin()
? 'Administration'
: __('Reporting')
)
)
PanelProvider. This is the clean way to show the settings page in different groups per panel (admin vs. tenant).navigationGroup() with navigationLabel(), navigationIcon(), navigationSort() etc. in the same fluent call so ordering and grouping are co-located.navigationGroup(), the translated default group is retained, which keeps existing installs rendering unchanged after upgrading to 3.4.0.navigationGroup() requires filament-analytics-core >= 3.1. On older core the method may exist but the group is ignored and you silently keep the translated default. Pin the core in composer.json if grouping is critical.getNavigationGroups().string|Closure; make sure your closure resolves to a string at render time. Returning null (e.g. from a missing translated key or a null user in a queue/console context) is undefined behaviour for the group resolution — guard with ?-> and a sensible default.php artisan optimize:clear (or filament:optimize-clear where available) before debugging “the group didn’t change”.getNavigationGroup() in a subclass, which fights the plugin config and is harder to test.Filament::getCurrentPanel()->getNavigationGroups()) to confirm the exact label your plugin is trying to merge into.How can I help you explore Laravel packages today?