Premium plugin reports
If you license Matomo's premium plugins, thin read adapters save you looking up their API method names:
| Helper | Reads | Needs the licensed plugin |
|---|---|---|
abTests() | A/B test metrics overview | AbTesting |
funnelFlow($idFunnel) | The flow through one funnel | Funnels |
forms() | Form Analytics overview | FormAnalytics |
media() | Media Analytics overview | MediaAnalytics |
cohorts() | Cohort retention | Cohorts |
usersFlow() | Users Flow | UsersFlow |
use MatomoAnalytics\Facades\MatomoReports;
$funnel = MatomoReports::funnelFlow(3, ['period' => 'month', 'date' => '2026-01']);
Each takes the same optional $params array as every other helper, so period, date and
segment work the same way.
They degrade, they do not break
If the plugin is not installed on your Matomo, the call returns null and the reason is
available through lastError() — exactly like any other failed report:
$abTests = MatomoReports::abTests();
if ($abTests === null) {
// The plugin is not licensed on this instance, or the call failed.
// MatomoReports::lastError() says which.
}
That is what makes these safe to call from a widget that renders on every instance, including one where the plugin was never bought: the widget hides itself instead of erroring.
Why they are thin
These adapters are deliberately nothing more than the method name and its required parameters. The plugins are licensed Matomo products with their own release cadence, so modeling their response shapes here would mean tracking someone else's schema and getting it wrong between releases.
If you need a premium report that has no helper, call it directly — it is the same client, the same cache and the same error convention:
MatomoReports::get('Funnels.getMetrics', ['idFunnel' => 3]);
See the reporting overview for get(), bulk() and caching.