The best Matomo alternative depends on which Matomo you run. If you self-host Matomo On-Premise, Umami gives you funnels, retention, heatmaps and session replays on your own server without yearly plugin fees, and Plausible Community Edition is the lighter dashboard that can take your Matomo history in as daily totals. If you pay for Matomo Cloud, invisit, the tool we build, costs $49 a month for 1M events against Matomo’s $204 for 1M hits, sets no cookies and keeps data forever, while Piwik PRO suits regulated organisations that want a vendor contract and the same _paq tracking calls.
Here is the short answer by situation, as of November 2026.
If you self-host Matomo On-Premise or Matomo for WordPress:
- Funnels, heatmaps and replays without buying plugins, on Node.js and PostgreSQL: Umami.
- A lighter dashboard on ClickHouse, with your Matomo history imported as daily totals: Plausible.
- A small WordPress site that mostly reads pages and referrers: Koko Analytics.
If you pay for Matomo Cloud:
- Cookieless hosted analytics with heatmaps and data kept forever, at about a quarter of the 1M price: invisit.
- Consent manager, tag manager and analytics in one EU contract for a regulated organisation: Piwik PRO.
Either way:
- Google Analytics depth for free, if you already run a consent banner: Google Analytics 4.
- A/B tests, session recordings and feature flags on one event stream: PostHog.
Stay on Matomo if you need full self-hosting with Google Analytics style reports. No tool in this list combines segments, goals, ecommerce reports, custom dimensions, a tag manager and scheduled email reports under GPL v3 on servers you control. If the server is your only complaint, Matomo will import your On-Premise data into Matomo Cloud, and if the Cloud bill is the complaint, it will export your Cloud data for an On-Premise install (pricing FAQ). The last two sections cover staying and switching.
Why do people look for Matomo alternatives?
People leave Matomo for different reasons depending on how they run it. Self-hosters leave because of the upkeep and the plugin bill; Matomo Cloud customers leave because of the price per hit, the plan limits and the cookies. Every limit below comes from Matomo’s own documentation, pricing page or plugin marketplace, checked on November 3, 2026.
If you self-host Matomo On-Premise
Matomo On-Premise is free under GPL v3, but it is a PHP application on MySQL or MariaDB that you install, patch and back up. Matomo 5 needs PHP 8. Matomo 6, out as a release candidate since October 30, 2026, needs PHP 8.1 and MySQL 8.0 or MariaDB 10.6 (requirements), so an install on an older MySQL has a database upgrade ahead of it. Matomo supports the previous major version for at least 12 months after the next one ships (long term support); Matomo 4 lost support on December 19, 2024.
Reports need a cron job. Matomo builds reports from raw data in a step it calls archiving, and above a few hundred visits a day it tells you to run core:archive every hour and to stop browsers from triggering it with browser_archiving_disabled_enforce = 1 (auto-archiving). A run takes minutes on a new site, a couple dozen minutes as data grows, and hours on the largest. Matomo calls checking the cron’s error output your most important job as an administrator.
MAILTO="you@example.com"
5 * * * * www-data /usr/bin/php /var/www/matomo/console core:archive --url=https://matomo.example.com/ > /dev/nullServers grow with traffic. Matomo’s sizing guide recommends at least two servers once you track more than 1 million actions a month, and gives these minimums (requirements):
| Page views tracked a month | Matomo’s recommended setup |
|---|---|
| Up to 100,000 | One server: 2 CPUs, 2 GB RAM, 50 GB SSD |
| Up to 1 million | One server: 4 CPUs, 8 GB RAM, 250 GB SSD |
| Up to 10 million | An app server with 8 CPUs and 16 GB RAM, plus a database server with 8 CPUs, 16 GB and 400 GB |
| Up to 100 million | Three app servers with 16 CPUs each, a database server with 16 CPUs, 32 GB and 1 TB, a load balancer and a CDN |
The hardware is the cheap part. On Hetzner’s regular-performance cloud, a 4 vCPU, 8 GB server costs €35.99 a month before VAT, with 160 GB of disk (Hetzner). The hours of upgrades, backups and archiving logs cost more.
The features that set Matomo apart are premium plugins On-Premise, billed every year by number of users (marketplace). Current prices in US dollars:
| Premium plugin | 1 to 4 users, a year | Up to 20 users, a year |
|---|---|---|
| Heatmap & Session Recording | $269 | $2,089 |
| A/B Testing | $269 | $2,089 |
| Custom Reports | $269 | $2,089 |
| Funnels | $239 | $1,859 |
| Media Analytics | $219 | $1,669 |
| Form Analytics | $179 | $1,429 |
| Users Flow | $99 | $859 |
| Cohorts | $99 | $859 |
| Multi Channel Conversion Attribution | $99 | $789 |
Heatmaps with recordings, funnels, A/B testing and form analytics together cost $956 a year for four users and $7,466 for twenty. Bundles start at $330 a month for Team (up to 4 users and 5M hits, without A/B testing) and $1,740 a month for Business (up to 20 users and 30M hits) (TeamBundle, pricing, On-Premise tab).
Matomo for WordPress, with more than 100,000 active installs on WordPress.org, runs the same Matomo inside your WordPress database and archives through WP-Cron instead of a system cron.
If you pay for Matomo Cloud
Matomo Cloud takes the server work away and charges by the hit. As of November 2026, Matomo Cloud Business costs $26 a month for 50K hits, $42 for 100K, $85 for 300K, $139 for 600K, $204 for 1M, $399 for 2M and $975 for 5M on monthly billing; above that Matomo quotes, and a year costs ten months (pricing). A hit is any tracking request: page views, events, downloads, outlinks and site searches. Matomo estimates 110 to 120 hits per 100 page views, and bot traffic counts unless you filter it out (what is a hit).
The limits Cloud customers run into, all from the same pricing page and Matomo’s FAQ:
- Plan size. Business includes 30 websites, 30 team members, 100 segments and 150 goals. More takes Enterprise, which is quoted.
- Enterprise-only features. SAML and LDAP sign-in and a custom domain are not on Business.
- Heatmap and recording quotas. At 100K hits you get 3,000 heatmap page views and 300 session recordings a month; at 1M, 10,000 and 1,000.
- Raw data for 24 months. Reports are kept forever, but the visits log and visitor profiles read raw data, which Cloud deletes after two years.
- Fixed row limits. Long-tail pages beyond a report’s row limit are grouped into an Others row, and on Cloud the limit of 500 cannot be changed (row limits).
- Cookies by default. The tracker stores
_pk_idfor 13 months (cookie list). Matomo’s CNIL mode lets you skip consent for French visitors, but turns off the visits log, user IDs, heatmaps and recordings (cookie banners and the CNIL exemption). - Leaving on a deadline. When you cancel, your data disappears from the account on the termination date and is deleted 30 days later; export requests must reach Matomo within that window (terms, section 7).
What to look for in a Matomo alternative
Judge a Matomo alternative on the reasons you are leaving, plus the two things that decide how painful the move is: your history and your tracking code.
- What you have to run. PHP and MySQL (Matomo), Node.js and PostgreSQL (Umami), ClickHouse and PostgreSQL (Plausible Community Edition), your WordPress database (Koko Analytics), or nothing at all.
- Which of your paid Matomo features come included. If you bought Heatmap & Session Recording, Funnels or A/B Testing, check whether the alternative includes them, sells them or lacks them.
- Cookies by default. Matomo’s 13-month cookie recognises returning visitors across months. Cookieless tools reset daily or monthly, so a month’s unique visitors read higher (how cookieless counting works).
- How long data is kept: from 2 months (GA4 explorations) to forever in this list.
- Whether your history comes with you. No tool here has a Matomo importer. Plausible takes daily totals in its CSV format, Piwik PRO offers migration help, and Umami Cloud imports CSV exports by request; the rest start empty.
- Whether your tracking calls survive. Piwik PRO uses the same
_paqcommand queue; everywhere else, everytrackEvent,setUserIdand goal gets rewritten. - The billing unit. Matomo counts hits, Piwik PRO counts actions (tag manager and consent loads included), and the others count events or page views.
We checked every price and claim against the vendors’ own pages on November 3, 2026. Piwik PRO publishes Business prices only through a calculator, so its numbers come from that calculator with one domain.1
Matomo alternatives compared: hosting, price, cookies and history
| Tool | Self-hosting | 100K a month | 1M a month | Cookies by default | Data kept, hosted | Heatmaps and recordings | Takes Matomo history |
|---|---|---|---|---|---|---|---|
| Matomo (reference) | Yes, GPL v3: PHP and MySQL | $42 (Cloud) | $204 (Cloud) | _pk_id for 13 months |
Reports forever, raw data 24 months | Cloud quota; $269 a year On-Premise | Moves between Cloud and On-Premise |
| Umami | Yes, MIT: Node.js and PostgreSQL | Free | $20 | None, monthly hash | 6 months to 5 years | Self-hosted, or Business at $200 | CSV by request on Cloud Pro |
| Plausible | Yes, AGPLv3: ClickHouse and PostgreSQL | $19 to $39 | $69 to $139 | None, daily hash | While subscribed | No | Daily totals via CSV |
| Koko Analytics | Yes, GPL: inside WordPress | Free | Free | One cookie until midnight | Your WordPress database | No | No |
| Piwik PRO | Enterprise only | €82 | €394 | After consent; anonymous modes | 25 months on Business | Not built in | Migration help from Piwik PRO |
| Google Analytics 4 | No | Free | Free | _ga for 2 years |
Explorations 2 or 14 months | No | No |
| PostHog | Hobby deploy, unsupported | Free | Free | First-party cookie for 365 days | 1 year free, 7 years paid | Yes, 5,000 recordings free | No; capture API with timestamps |
| invisit | No | $14 | $49 | None, daily hash | Forever | Heatmaps on every plan, no recordings | No |
Prices are monthly in each vendor’s unit, so they are not one for one: Matomo counts hits, Umami counts events plus each stored property, Plausible counts page views plus events, Piwik PRO counts actions, and PostHog counts every event and sends at least two per page view, so 1M page views is about 2M events and $50. Koko Analytics does not price by traffic; Pro costs €59 a year for one site. Plausible’s range runs from Starter to Business.
1. Umami: best for self-hosters who want funnels, heatmaps and replays without plugin fees
Umami is the self-hosted replacement for Matomo’s premium plugins. It is MIT licensed, and the self-hosted edition includes funnels, journeys, retention, cohorts, goals, click and scroll heatmaps and session replays at no license cost. On Matomo On-Premise, Heatmap & Session Recording plus Funnels alone cost $508 a year for four users.
Umami 3.4.1 runs on Node.js 20.19 or newer with PostgreSQL 12.14 or newer (installation). Umami v3 dropped MySQL (migration guide), so your Matomo database server cannot be reused. There is no archiving cron: Umami’s PostgreSQL schema has no rollup tables and counts raw rows when you open a report (schema), so at high volume you watch query times instead of cron logs.
If you would rather not host it, Umami Cloud is free up to 100K events on one site with 6 months of data, and Pro costs $20 a month for 1M events with 2 years. Heatmaps, replays and unlimited sites need Business at $200 a month (pricing). Umami bills each stored event property as one more event.
Umami’s limits next to Matomo: no tag manager, A/B testing, form or media analytics, and scheduled email reports stay on Umami Cloud. Umami sets no cookies; its visitor hash uses a salt that rotates monthly, so returning visitors are not followed for 13 months as Matomo’s cookie does. The heatmap and replay recorder adds about 58 KB gzipped to the page.
Umami has no Matomo importer. Umami Cloud imports CSV exports from Pro up, handled by Umami’s team (import data); the page does not name Matomo, so ask before you count on it. _paq.push(['trackEvent', 'Videos', 'Play', 'Intro', 30]) becomes umami.track('Play', { category: 'Videos', name: 'Intro', value: 30 }), and setUserId becomes umami.identify(user.id) (tracker functions).
Choose Umami to keep self-hosting with Matomo’s paid features included. See Umami vs invisit.
2. Plausible: best for a lighter dashboard that keeps your Matomo history
Plausible is for Matomo users who mostly read traffic, sources and goals and want fewer moving parts. Plausible Community Edition is AGPLv3 and runs in Docker Compose on ClickHouse and PostgreSQL, with 2 GB of RAM recommended and a CPU that supports SSE 4.2 or NEON (Community Edition). The dashboard reads events from ClickHouse and refreshes every 30 seconds, with no archiving job for you to schedule.
Plausible’s hosted service is run from Estonia on EU-owned providers. As of November 2026, Starter costs $19 a month at 100K page views and $69 at 1M; Business, which adds funnels, custom properties, revenue goals and the Stats API, costs $39 and $139 (pricing). Hosted data has no time limit while you subscribe. There is no free hosted plan, and the trial lasts 30 days.
Plausible’s limits next to Matomo: no visits log or visitor profiles, no heatmaps, recordings, retention or cohorts, by design (when not to use Plausible), no tag manager and no user IDs. Community Edition is released about twice a year and leaves out funnels, user journeys and revenue goals.
Plausible is the one tool here that shows your Matomo history beside new data without a vendor’s help. Its CSV import accepts ten imported_* tables of daily totals, the same files Plausible documents for moving between Community Edition and its cloud (CSV import). The script in the export section below writes the visitors and pages tables from Matomo’s API. Imported data covers each day up to your first native Plausible visitor, cannot be filtered by two unrelated properties at once (page and source, for example), and leaves out ecommerce revenue.
In code, trackEvent becomes plausible('Play', { props: { category: 'Videos', name: 'Intro' } }), and on the hosted service custom properties need Business. Choose Plausible for a content site that wants clean numbers and its history in one place. See Plausible vs invisit.
3. Koko Analytics: best for WordPress sites running Matomo for WordPress
Koko Analytics is the exit for a WordPress site that installed Matomo for WordPress to count page views and referrers. It is a free GPL plugin with more than 70,000 active installs that stores its counts in your WordPress database, adds less than 1 KB to each page and records hits through an endpoint that bypasses WordPress, with no third-party service involved (WordPress.org).
The free plugin shows visitors, page views, top pages and referrers. Koko Analytics Pro adds countries, devices, UTM campaigns, custom events, email reports and traffic spike alerts for €59 a year for one site, €99 for five and €249 for 25 (pricing). Traffic does not change the price.
By default Koko sets one cookie, _koko_analytics_pages_viewed, which expires at midnight. The Cookieless method instead hashes the IP address and user agent with a secret that changes every 24 hours, and None counts page views only (tracking methods).
Koko’s limits next to Matomo: its feature list has no goals, funnels, ecommerce reports, segments or visits log, so a shop or lead-generation site will miss Matomo. Its importer reads Jetpack Stats, Plausible, Burst Statistics, Statify, WP Statistics, Independent Analytics and SlimStat, not Matomo.
Choose Koko Analytics when your WordPress site needs a counter, not an analytics department.
4. Piwik PRO: best for regulated organisations that want consent, tags and analytics in one contract
Piwik PRO suits banks, health providers and public bodies that want a vendor to run analytics, a consent manager and a tag manager under one contract, with support. Matomo was once called Piwik, and Piwik PRO’s tracker uses the same _paq command queue, so _paq.push(['trackEvent', 'Videos', 'Play', 'Intro', 30]) works unchanged (trackEvent). Piwik PRO says it can migrate much of your Matomo data and setup, usually in about four weeks (switch from Matomo).
Piwik PRO no longer has a free plan: the free Core plan was retired, and Core accounts had until February 28, 2026 to upgrade (changelog). Business starts at €36 a month for 25,000 actions on one domain, and Piwik PRO’s calculator gave €82 a month for 100,000 actions and €394 for 1M on November 3, 2026 (pricing). Business tops out at 2M actions and 20 domains, keeps data 25 months, is hosted in Sweden, and rises 4% a year on renewal (Business plan).
Enterprise starts at €366 a month billed annually, with data centres in Germany, the Netherlands, the US, Sweden, Hong Kong and the UAE, a business associate agreement for HIPAA, and on-premises installs with unlimited retention (data retention).
Piwik PRO’s limits next to Matomo: at 1M, Business costs more than twice Matomo Cloud’s €172 for 1M hits, and actions include more than page views, since tag manager container loads, consent window loads and API requests count too (counting actions). Heatmaps and recordings are not built in (the help centre shows Hotjar loaded through the tag manager), raw data on Business comes through the API only, real-time reports look back 30 minutes, and the product is closed source. For visitors who decline consent, one of Piwik PRO’s anonymous modes uses what Piwik PRO calls a fingerprint derivative.
Choose Piwik PRO when compliance paperwork and a support contract matter more than price.
5. Google Analytics 4: best free option for Matomo-level depth, if you run a consent banner
Google Analytics 4 is the free way to keep depth: funnel, path and cohort explorations, a user explorer, audiences, Google Ads conversions and Search Console data, free at any volume on a standard property. It suits Matomo users who chose Matomo for depth rather than privacy.
GA4’s limits next to Matomo: it sets _ga cookies for two years, so EU and UK visitors need consent, and there is no self-hosting and no EU storage option. gtag.js measured 155 to 179 KB gzipped, against 22 KB for matomo.js. The event-level data behind explorations is kept 2 months by default and 14 at most, while aggregated standard reports are not affected (data retention).
Nothing moves from Matomo to GA4: GA4’s event import only accepts data from the last 2 days (data import), and Matomo’s Google Analytics importer only goes the other way. trackEvent becomes gtag('event', 'video_play', { video_category: 'Videos', video_name: 'Intro', value: 30 }), and user IDs go in gtag('config', 'G-XXXXXXX', { user_id: user.id }).
Choose GA4 if you buy Google Ads and already run a consent banner. See Google Analytics vs invisit.
6. PostHog: best for teams that bought Matomo’s A/B testing, heatmaps and recordings
PostHog replaces the experimentation side of Matomo: session replay, heatmaps, experiments, feature flags, surveys and error tracking on one event stream. Each month the free tier includes 1M events, 5,000 recordings, 1M feature flag requests (experiments bill as flag requests) and 1,500 survey responses (pricing). On Matomo On-Premise, A/B Testing and Heatmap & Session Recording cost $538 a year for four users, and Matomo Cloud’s 1M plan caps recordings at 1,000 a month.
PostHog bills every event, and posthog-js sends at least two per page view, so 1M page views is about 2M events, around $50 a month on pay-as-you-go. Data is kept 1 year on the free tier and 7 years on paid plans, with an EU Cloud in Frankfurt.
PostHog’s limits next to Matomo: posthog-js sets a first-party cookie for 365 days and uses localStorage by default, and cookieless mode is opt-in. The main script measured about 119 KB gzipped. Self-hosting is an MIT hobby deploy that needs about 4 vCPUs and 16 GB of RAM, is unsupported and, in PostHog’s words, is “unlikely to scale past a couple 100ks events” (disclaimer), so it is no home for a self-hosted Matomo at scale.
PostHog has no Matomo importer. The raw visits from the export script below can be replayed as historical events through PostHog’s capture API (migrations), one event per Matomo action with its original timestamp, but you write that mapping. trackEvent becomes posthog.capture('video_play', { category: 'Videos', name: 'Intro', value: 30 }), and setUserId becomes posthog.identify(user.id).
Choose PostHog when experiments and recordings matter more than a light, cookieless dashboard. See PostHog vs invisit.
7. invisit: best for Matomo Cloud customers who want cookieless analytics for less
invisit, the tool we build, is hosted, cookieless web analytics for Matomo Cloud customers who pay by the hit for reports they mostly read at the top. It costs $14 a month for 100K events and $49 for 1M, against $42 and $204 on Matomo Cloud, and the free plan covers 20,000 events a month on 4 sites (pricing). The tracker and SDKs are MIT; the dashboard and backend are proprietary.
Next to Matomo Cloud, invisit sets no cookies and keeps all data forever, where Matomo Cloud deletes raw data after 24 months. Visitors are told apart with a hash salted per UTC day, and the salt is deleted about 25 hours after the day ends (how that works). Heatmaps that count clicks, rage clicks and dead clicks per element, with scroll depth, are on every plan, free included, and heatmap clicks are never billed. You can read any visit step by step, build funnels of 2 to 8 steps within one visit, and invite unlimited members on every plan, against Matomo Cloud Business’s 30. invisit.js measured 8,542 bytes gzipped, against 22,132 for matomo.js 5.14.2.
invisit’s limits next to Matomo: it cannot be self-hosted, which is the main reason many people picked Matomo. It has no session recordings, A/B tests, retention cohorts, scheduled email reports, Search Console integration or mobile SDKs, all of which Matomo offers. Revenue comes from Stripe, Paddle and four other providers and is charted beside traffic, but not attributed to sources or campaigns, where Matomo has ecommerce reports and multi-channel attribution. A daily hash means a month’s unique visitors read higher than Matomo’s cookie-based count. Data is stored in Falkenstein, Germany, with Cloudflare, a US company, in front.
There is no importer, so export from Matomo first and keep the archive. trackEvent becomes track('video_play', { category: 'Videos', name: 'Intro', value: 30 }), goals become conversions, and setUserId becomes identify(user.id), which stores only a hash. If you leave invisit later, Export raw events in site settings gives you a gzipped NDJSON file of the site’s raw events and funnels.
Choose invisit when you want hosted, cookieless numbers with heatmaps and permanent history, and can live without recordings and experiments. See Matomo vs invisit.
How do you get your history out of Matomo?
Export through Matomo’s Reporting API: it returns any report as CSV, TSV, JSON or XML, and Live.getLastVisitsDetails returns raw visits with every action (raw data export). Self-hosted, a database dump keeps everything. On Matomo Cloud, Matomo offers a full raw data dump on request (Matomo Cloud), and the paid Data Warehouse Connector backfills up to 24 months of raw data into a warehouse such as BigQuery (backfill).
The script below does the API part for one site. It pages through raw visits 1,000 at a time into NDJSON, and writes daily totals and pages as Plausible’s imported_visitors and imported_pages files. Create a token under Administration, Personal, Security; the script sends it in the POST body, so a token limited to secure requests works (token_auth).
// Archive one Matomo site: raw visits as NDJSON, plus daily totals and pages in Plausible's CSV
// import format. Node 22.18+ or Bun:
// MATOMO_URL=https://matomo.example.com MATOMO_TOKEN=... node export-matomo.ts 1 2024-11-01 2026-10-31
import { appendFileSync, writeFileSync } from 'node:fs'
const [site = '1', from = '2026-10-01', to = '2026-10-31'] = process.argv.slice(2)
const range = `${from.replaceAll('-', '')}_${to.replaceAll('-', '')}`
async function matomo(method: string, params: Record<string, string>) {
// The token travels in the POST body: it stays out of server logs and works with secure-only tokens.
const body = new URLSearchParams({
module: 'API',
format: 'JSON',
format_metrics: '0',
method,
idSite: site,
period: 'day',
token_auth: process.env.MATOMO_TOKEN ?? '',
...params,
})
const res = await fetch(`${process.env.MATOMO_URL}/index.php`, { method: 'POST', body })
const data = await res.json().catch(() => null)
if (!data || data.result === 'error')
throw new Error(
`${method}: ${data?.message ?? `HTTP ${res.status} without JSON, check MATOMO_URL and MATOMO_TOKEN`}`,
)
return data
}
const rows = (header: string[], data: unknown[][]) =>
[header, ...data].map((row) => row.map((v) => JSON.stringify(v ?? 0)).join(',')).join('\n') + '\n'
const visitors: unknown[][] = []
const pages: unknown[][] = []
writeFileSync(`visits_${range}.ndjson`, '')
for (
let d = new Date(`${from}T00:00:00Z`);
d <= new Date(`${to}T00:00:00Z`);
d.setUTCDate(d.getUTCDate() + 1)
) {
const date = d.toISOString().slice(0, 10)
// Raw visits with every action: empty once Matomo has deleted that day's raw data.
for (let offset = 0; ; offset += 1000) {
const batch = await matomo('Live.getLastVisitsDetails', {
date,
filter_limit: '1000',
filter_offset: `${offset}`,
})
appendFileSync(
`visits_${range}.ndjson`,
batch.map((v: unknown) => JSON.stringify(v) + '\n').join(''),
)
if (batch.length < 1000) break
}
// Archived reports: these outlive the raw data.
const t = await matomo('API.get', { date })
visitors.push([
date,
t.nb_uniq_visitors,
t.nb_pageviews,
t.bounce_count,
t.nb_visits,
t.sum_visit_length,
])
// Matomo keeps query strings in page URLs; Plausible wants one row per hostname and path.
const byPath = new Map<string, number[]>()
for (const p of await matomo('Actions.getPageUrls', { date, flat: '1', filter_limit: '-1' })) {
if (!p.url) continue // rows without a URL, such as Others in a truncated report
const { hostname, pathname } = new URL(p.url)
const sum = byPath.get(`${hostname} ${pathname}`) ?? [0, 0, 0]
byPath.set(`${hostname} ${pathname}`, [
sum[0] + p.nb_visits,
sum[1] + (p.nb_uniq_visitors ?? p.nb_visits),
sum[2] + p.nb_hits,
])
}
for (const [key, [visits, uniques, views]] of byPath)
pages.push([date, ...key.split(' '), visits, uniques, views])
}
writeFileSync(
`imported_visitors_${range}.csv`,
rows(['date', 'visitors', 'pageviews', 'bounces', 'visits', 'visit_duration'], visitors),
)
writeFileSync(
`imported_pages_${range}.csv`,
rows(['date', 'hostname', 'page', 'visits', 'visitors', 'pageviews'], pages),
)We ran it with Node 24 against Matomo’s public demo (Matomo 6.1 alpha, its library demo site) for October 29 and 30, 2026. It took 24 seconds and wrote 6,973 raw visits, exactly the two days’ visit totals, as 31.3 MB of NDJSON: about 4.5 KB per visit, or 1.9 MB gzipped. The page rows summed to the 11,266 page views in the daily totals. At that rate, a site with 100,000 visits a month produces about 450 MB of raw export a month before compression.
Run it over every day whose raw data still exists: the last 24 months on Matomo Cloud, and on a self-hosted Matomo everything since install, unless someone turned on deletion of old raw data (delete_logs_enable is off by default in global.ini.php). For Plausible, end the range on the day before its script went live, since imports stop at the first native visitor.
What do you lose when you leave Matomo?
- Report rebuilding. Matomo can only reprocess a report, to raise its row limit for example, for periods whose raw data still exists (row limits). Older periods stay as they were archived, Others row included, and the script skips that row.
- Returning visitors across months. Matomo’s
_pk_idcookie lasts 13 months; every cookieless tool here starts counting afresh each day or month, and none can import Matomo’s visitor IDs. - Visitor profiles and the visits log. They live in the raw NDJSON, which no tool here reads as it is.
- Heatmaps, session recordings and A/B test results. They are not part of this export; screenshot or note the findings you still need.
- Your configuration. Goals, segments and annotations come out with
Goals.getGoals,SegmentEditor.getAllandAnnotations.getAll, as JSON to rebuild by hand.
When should you stay on Matomo?
Stay on Matomo when one of its strengths is the reason you chose it, or when your complaint has a fix inside Matomo.
- You must self-host and need depth. The free On-Premise edition has segments, goals, ecommerce, custom dimensions, a tag manager, scheduled email reports and custom alerts on servers you control.
- The server is the problem. Matomo imports On-Premise data into Matomo Cloud, so you keep your history and your
_paqcalls, and only the tracker address in the snippet changes (pricing FAQ). - The Cloud bill is the problem. The same FAQ covers the reverse move, and On-Premise tracks unlimited hits for free.
- You measure French visitors without consent. Matomo’s CNIL mode is built for the French exemption, and we say so in our cookie banner guide.
- You need official iOS and Android SDKs, SAML or LDAP sign-in, or your Google Analytics history imported into the same place.
- Upgrades worry you. Matomo 5 keeps receiving critical fixes for at least 12 months after Matomo 6.0 ships, so there is time to plan.
How do you switch from Matomo without losing your history?
Export first, import where the new tool can, and run both trackers side by side for two to four weeks before you remove the Matomo snippet.
- Export. Run the script over every day with raw data, gzip the NDJSON, and save goals, segments and annotations. Self-hosted, also take a
mysqldumpof the Matomo database withconfig/config.ini.php. - Freeze, do not delete. On a self-hosted Matomo, set
record_statistics = 0under[Tracker]inconfig/config.ini.phponce you stop tracking, and keep the instance read-only until nobody opens it. On Matomo Cloud, request the full raw data dump before you cancel. - Install the new tracker next to Matomo’s. Every tool here can run on the same pages as the
_paqsnippet. - Rewrite your tracking calls with the table below, and rebuild goals as the new tool’s goals, conversions or funnels.
- Compare for two to four weeks. Expect unique visitors to read higher on a cookieless tool, and page views to differ by the bots and ad blockers each tool sees.
- Remove the Matomo snippet, and cancel Matomo Cloud only after the export opens cleanly.
| Tool | _paq.push(['trackEvent', 'Videos', 'Play', 'Intro', 30]) |
_paq.push(['setUserId', id]) |
|---|---|---|
| Umami | umami.track('Play', { category: 'Videos', name: 'Intro', value: 30 }) |
umami.identify(id) |
| Plausible | plausible('Play', { props: { category: 'Videos', name: 'Intro' } }) |
No equivalent: Plausible keeps no user IDs |
| Piwik PRO | Unchanged | Unchanged |
| GA4 | gtag('event', 'video_play', { video_category: 'Videos', video_name: 'Intro', value: 30 }) |
gtag('config', 'G-XXXXXXX', { user_id: id }) |
| PostHog | posthog.capture('video_play', { category: 'Videos', name: 'Intro', value: 30 }) |
posthog.identify(id) |
| invisit | track('video_play', { category: 'Videos', name: 'Intro', value: 30 }) |
identify(id) |
Koko Analytics tracks custom events on Pro only, configured in the plugin rather than through _paq-style calls.
Before you turn Matomo off
- Raw visits are exported for every day Matomo still has raw data, gzipped and stored off the server.
- Daily totals and page reports are exported, and imported into Plausible if that is where you are going.
- Goals, segments and annotations are saved as JSON.
- Self-hosted: a
mysqldumpandconfig.ini.phpare kept, and tracking is frozen rather than deleted. - Matomo for WordPress:
MATOMO_REMOVE_ALL_DATAis set tofalse, or the export is done, before you uninstall. - Matomo Cloud: the full dump is requested before cancelling, because data is deleted 30 days after termination.
- Both trackers ran side by side for two to four weeks, and you know why the numbers differ.
Footnotes
-
Piwik PRO’s Business calculator on its pricing page, set to one consent domain, on November 3, 2026: €36 at 25,000 actions, €57 at 50,000, €82 at 100,000 and €394 at 1,000,000 a month. More domains raise the price. ↩
