Google Analytics 4 → Matomo
Import GA4 reports into a new Matomo site, then track there. The import cannot be merged into a site you already created, and it is aggregated history, not the raw visits.
Should you make this move?
Both platforms have a case. Compare what you gain with what you give up before scheduling the cutover.
Google Analytics 4
- Event-based measurement connects web, app, audiences, and Google advertising
- Established reporting patterns make recurring measurement easier
- Its data model and reporting interface are difficult for many teams to govern
- Tracking quality still depends on disciplined implementation and governance
Matomo
- Data ownership, self-hosting, and privacy controls support compliance-sensitive teams
- Established reporting patterns make recurring measurement easier
- Operating it well requires infrastructure, upgrades, and analytics expertise
- Tracking quality still depends on disciplined implementation and governance
Matomo: Data ownership, self-hosting, and privacy controls support compliance-sensitive teams. This removes a major source-side concern: Its data model and reporting interface are difficult for many teams to govern.
What you lose: Event-based measurement connects web, app, audiences, and Google advertising. What you inherit: Operating it well requires infrastructure, upgrades, and analytics expertise.
Jump to a section
Know the shape of the move.
This timeline assumes
- The property is GA4. Universal Analytics is a different route, Google Analytics → Matomo. GA4 → Plausible is also separate.
- You can authorize the Google Analytics Importer. Matomo Cloud has it installed. A self-hosted site needs the plugin.
- You want history in the same Matomo site that will collect new hits, so the import starts before that tracking code.
- Google's API quotas are part of the plan. Matomo says the import pauses and continues across days.
- GA4 stays available until you have compared a day of native Matomo data with GA4.
What survives the move.
“Partial” and “manual” are not footnotes. They are work that must be scheduled and verified.
| Item | Outcome | Impact | What happens | Mitigation |
|---|---|---|---|---|
| A new Matomo site | partial | critical | Starting an import creates a new Matomo website. Matomo says the import cannot go into an existing website and cannot be merged later. If you already tracked into a test site, that data stays separate. | Import first. Use the tracking code of the site the importer created. |
| GA4 property id | manual | critical | The on-premise GA4 command is php ./console googleanalyticsimporter:import-ga4-reports --property="properties/PROPERTY_ID" --dates=START,END. Resume with --idsite set to the site id from the import status table. | Copy the property id from the GA4 property selector before you start. |
| Cloud authorization | partial | high | Matomo Cloud's Quick Connect path is the one they recommend for small and medium sites. High-traffic or multi-site imports use the advanced OAuth client for higher API limits. Google may say the app is unverified. Matomo tells you to continue through Advanced to matomo.cloud. | Pick Quick Connect or the OAuth client before the first click on Import properties. |
| API quota | partial | high | Google's limit in Matomo's run guide is at most 50,000 requests a day for the account and at most 10,000 for a site. Matomo says that is about 4 months of days that contain data, and that slice can finish in a couple of hours. The rest waits until the next day. The job resumes. | Leave the import scheduled. A pause is the quota, not a failed job. |
| End date versus live tracking | manual | critical | Matomo's simple switch sets the import end date to the day before tracking starts. Their example is tracking on 12 November and an end date of 11 November. You can add the tracking code during the import. Overlap double-counts. A rolling import with no end date keeps copying GA4 until you cancel it, and days between cancel and going live are empty. | Write the end date and the first tracked day next to each other. |
| Raw visits | lost | critical | The importer brings aggregated reports, not raw visit and action rows. Visitor Log, Ecommerce Log, custom reports, and segmentation do not work on the imported period. Unique visitors for weeks and months are unavailable. The importer walks backward from yesterday, then imports forward. | Treat imported months as reports. Use log-level questions only on days Matomo tracked itself. |
| Metrics that use different definitions | partial | high | Matomo says Google's ecommerce conversion rate is transactions per session, while Matomo's is the percent of visits with at least one order, so that metric is not imported. Entrance and exit rates also differ, and can show over 100 percent because of how GA counts sessions. GA4 goals import without goal name, revenue, or conversion rate. Item-scoped custom dimensions are ignored. | Rebuild goals in Matomo. Do not compare those rates to GA4 as if they were the same formula. |
| Reports Matomo will not fill | lost | medium | Search keywords with no results, and the Contents report, are Matomo reports Google does not supply. Funnels are an example of a Google report the importer does not bring. Site-search URLs can land in page URL reports because Google strips the search parameter. | List the reports people actually open, and mark which ones stay blank. |
| GeoIP | partial | medium | Matomo says the importer assumes GeoIp2. Without it, regions show as Unknown even though the import itself worked. | Install GeoIp2 before you judge a map. |
| Page-level totals | partial | high | On 17 February 2026, forum user CJ406 reported a GA4 property of about 3 million pageviews a year. The import finished in about 4 hours and monthly totals looked right, while some URLs were far below GA4. Examples they gave for 90 days included 465 versus 35, 167 versus 51, and 253 versus 43. Other URLs matched, including 24,064 versus 24,064. They said the GA4 API was not thresholding, and the missing rows were not in Matomo's log tables. That is one site, not a documented limit. | Compare a sample of URLs, not only the month total, before you turn GA4 off. |
| Authorization after the import | clean | low | Matomo says you can remove the Google authorization when the import is done. It is only needed while data is copying. | Remove it after the end date has passed and the checks are done. |
| The GA4 property itself | lost | medium | Audiences, explorations, and the GA4 interface stay in Google. The importer does not move them. | Export any exploration you still need as a reference before the property is closed. |
Where each thing goes.
| Source | Destination | Method | Notes |
|---|---|---|---|
| GA4 property | New Matomo site | automatic | Created when the import starts. Not an existing site. |
| Property id | --property=properties/ID | transform | On-premise CLI. Cloud uses Import properties after connect. |
| Date range | Import start and end | manual | End the day before native tracking if you want one continuous site. |
| Aggregated reports | Matomo reports | automatic | Not raw visits. |
| Visitor log and segments | No destination | unsupported | Unavailable on imported reports. |
| Ecommerce conversion rate | No destination | unsupported | Definitions differ, so Matomo does not import it. |
| GA4 goal | Goal without name, revenue, or rate | transform | Rebuild the goal in Matomo. |
| Item-scoped custom dimension | No destination | unsupported | Ignored. Visit and action scopes are the ones Matomo keeps. |
| Tracking code | Code for the imported site id | manual | Add it only with an end date that does not overlap. |
| Google OAuth grant | Removed after import | manual | Matomo says it is unused once copying stops. |
Make the move recoverable.
Create the source-of-truth backup
Keep GA4 available until a day of native Matomo data has been compared.
- Write down the GA4 property id and timezone.
- Export the explorations you still cite.
- Note any Matomo site you already created, so you do not expect a merge.
- Leave the GA4 tag in place until the end date is set.
- Save the Matomo site id the importer creates.
Proof to capture: A property id, a list of reports you must rebuild, and the new Matomo site id.
History import
Fill a new Matomo site with GA4 reports up to a chosen day.
- On Cloud, use Quick Connect or the advanced OAuth client, then Import properties.
- On premise, run import-ga4-reports with the property id and a date range.
- Let the job cross days when it hits the 10,000 request site limit.
- Resume with --idsite if you start the CLI again.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
Tracking switch
Collect new hits in Matomo without overlapping the import.
- Set the import end date to the day before the first tracked day.
- Add that site's tracking code.
- Compare URL samples, not only the monthly total.
- Remove the Google authorization after the import status is finished.
Proof to capture: Save the input, output, command or tool settings, warnings, and final item counts.
The things most likely to hurt.
These are operating limits. Treat every “Stop if” condition as a blocked migration, not a suggestion.
The import lands in the wrong site
You already have a Matomo site from a test tag, and you expect the import to join it.
- Consequence
- Matomo creates another site. The two cannot be merged.
- Mitigation
- Start the import on an empty Matomo, then use the new site id.
Stop if: Someone has already published the tracking code for a different site id.
The end date overlaps live tracking
The tag is live on a day the importer also copies.
- Consequence
- That day is counted twice, or a gap opens if you cancel a rolling import too early.
- Mitigation
- Use Matomo's example: end date the day before tracking starts.
Stop if: You cannot name those two dates.
Month totals hide missing URLs
The month looks close to GA4 and a quiet URL does not.
- Consequence
- CJ406 saw that pattern after a completed import. You would turn GA4 off on a bad page report.
- Mitigation
- Compare high and low URLs before you remove the GA4 tag.
Stop if: The only check is the monthly total.
Do the work in this order.
- Days 1 to 2 · inventory
Property and reports
3 to 6 hours active1 to 2 days elapsedAccess to GA4 and Matomo waiting- Copy the property id.
- List reports that will not import.
Depends on: GA4 admin
Stop / go checkpointAuthorize the importer?
Go when: You know this is a new Matomo site.
Stop when: A test site must be merged and cannot be.
- Day 2 · backup
Keep GA4
1 to 2 hours active1 day elapsedNone waiting- Export explorations you still need.
- Leave the GA4 tag up.
Depends on: Property id
Stop / go checkpointStart the import?
Go when: GA4 still answers for the date range you will copy.
Stop when: The property is already closed.
- Days 2 to 10 · pilot
Import history
2 to 6 hours activeSeveral days of quota elapsedGoogle API daily limits waiting- Start Quick Connect or the CLI.
- Record the new site id.
- Let the job resume after the quota.
Depends on: Authorization
Stop / go checkpointSet an end date?
Go when: Reports are appearing on the new site.
Stop when: The job stopped and was not resumed with --idsite.
- Days 10 to 12 · cutover
Track on the new site
2 to 4 hours active1 to 2 days elapsedThe first full day of hits waiting- Set the end date to the day before go-live.
- Add the tracking code for that site id.
- Compare URL samples.
Depends on: Import in progress or finished
Stop / go checkpointRemove the GA4 tag?
Go when: A full day of native data looks plausible next to GA4, and imported URLs were sampled.
Stop when: Only the month total was checked.
- Days 12 to 20 · observe
Parallel read
2 to 4 hours activeAbout a week elapsedMore than one day of traffic waiting- Keep GA4 readable.
- Rebuild goals.
- Remove the Google grant when the import is done.
Depends on: Native tracking
Stop / go checkpointStop opening GA4 for this site?
Go when: The reports you listed are either rebuilt or accepted as gone.
Stop when: A decision still depends on Visitor Log for an imported month.
Cut over with a way back.
Cutover
Start Matomo tracking on the imported site without a double-counted day.
- Confirm the import's site id.
- Set the end date to the day before tracking.
- Publish that site's tracking code.
- Leave the GA4 tag until the URL sample looks acceptable.
- Remove the Google authorization only after the import status is finished.
Proof to capture: One Matomo site contains imported days up to the end date and native days after it.
Rollback
Keep GA4 as the system of record.
- Leave or restore the GA4 tag.
- Remove the Matomo tag if the overlap bothers you.
- Keep the imported Matomo site. You cannot merge it later, and you also do not have to delete it.
- Note which URLs disagreed.
- Try again only with a new end date that does not overlap.
Proof to capture: GA4 is still collecting, and you know which Matomo site id was the attempt.
- The import created a second unwanted site and tracking used the wrong id
- The end date overlaps the tag
- URL samples are far from GA4 while the month total looks fine
- The quota pause was mistaken for a finished import
- A required report is one Matomo says it cannot import
Prove the migration worked.
Every blocking check must pass. Capture the evidence before cleanup begins.
| Pass | ID | Check | Method | Expected result | Evidence |
|---|---|---|---|---|---|
V-01Blocking | New site id | Read the import status table. | The id is the one whose tracking code you will paste. | Site id note. | |
V-02Blocking | End date | Compare the import end date with the first day of the tag. | The tag starts the next day. Matomo's example is the 11th and the 12th. | Date note. | |
V-03Blocking | Job still scheduled | Read import status after a day that hit the site limit. | It resumes rather than sitting failed. | Status table. | |
V-04Blocking | Not the visitor log | Open Visitor Log on an imported day. | You do not treat it as complete. Matomo says raw visits are not imported. | Report note. | |
V-05 | Goals rebuilt | Open a GA4 goal you still use. | A Matomo goal exists, because the import omits name, revenue, and rate. | Goal list. | |
V-06Blocking | URL sample | Compare at least three busy and three quiet URLs with GA4. | Gaps are understood before the GA4 tag comes off. | URL sheet. | |
V-07Blocking | Real-time | Load the site and find the visit on the new site id. | The hit is on that id, not on an older test site. | Real-time check. | |
V-08Blocking | GA4 still open | Open the property. | You can keep it as the record until the sample passes. | GA4 screenshot. |
Remove the scaffolding safely.
Safe after: Native Matomo data covers the days you will use for decisions, and the import end date is in the past.
- Remove the Google authorization.
- Rebuild goals and the reports that imported blank.
- Keep the GA4 property until those reports are accepted.
- Write down the site id so nobody imports a second copy.
- Do not try to merge the test site.
When the plan met reality.
First-hand accounts are preferred. Vendor case studies are labeled, and every note below is an editorial paraphrase—follow the link for the full context.
On 17 February 2026, forum user CJ406 reported a GA4-only property of about 3 million pageviews a year imported into a self-hosted Matomo with MariaDB. The Google Analytics Importer finished in about 4 hours. Monthly and yearly totals looked close, and some busy URLs matched exactly, including 24,064 pageviews on both sides. Other URLs over 90 days were far lower, including 465 versus 35, 167 versus 51, and 253 versus 43. They said the GA4 API was not thresholding and that the missing URLs were absent from Matomo's log tables. The post asks for a cause and does not report a fix.
- Compare individual URLs with GA4 after the importer reports success. A close month total did not mean every page matched.
- Check whether the missing URLs are absent from the log tables before you treat the gap as a report-only problem.
- A completed GA4 import can match headline totals and still undercount some pages.
- This report does not name a repair. It is a reason to sample pages before the GA4 tag comes off.
Verify against the primary material.
Platform behavior changes. Check these sources and the review dates above before executing a production migration.
- Matomo: import Google Analytics dataAccessed 2026-11-02
- Matomo: run the Google Analytics importAccessed 2026-11-02
- Matomo: import limitationsAccessed 2026-11-02
- Matomo: import with or without an end dateAccessed 2026-11-02
- Matomo forum: GA4 import gaps on a high-traffic siteAccessed 2026-11-02