Skip to main content

Premium plugin reports

If you license Matomo's premium plugins, thin read adapters save you looking up their API method names:

HelperReadsNeeds the licensed plugin
abTests()A/B test metrics overviewAbTesting
funnelFlow($idFunnel)The flow through one funnelFunnels
forms()Form Analytics overviewFormAnalytics
media()Media Analytics overviewMediaAnalytics
cohorts()Cohort retentionCohorts
usersFlow()Users FlowUsersFlow
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.