Not a cheaper GA4
Swapping one tag for another and expecting the same numbers is how a migration goes wrong. The two tools do not measure the same things, and one of them cannot measure the thing this project was built for. Both statements are worth understanding before you move.
Four numbers that will not match
Set the expectation before the install, not after the first Monday morning when the two dashboards disagree.
- Sessions
- GA4 restarts a session at midnight and on a campaign change, as well as after inactivity. Micaforge uses a thirty-minute inactivity gap and nothing else, so it will usually report fewer sessions.
- Users
- GA4 has a cookie. Micaforge has a hash that rotates daily, so a reader returning tomorrow is a new visitor. Daily uniques are roughly comparable. Anything longer is not, and Micaforge will read higher over a month.
- Bots
- GA4 drops known bots and spiders before you see them. Micaforge names them, keeps them, and holds them out of the human report. Your human pageviews may go down when you switch. That is the correction, not a loss.
- Answer engines
- Referrals from an answer surface become a channel of their own here rather than sitting in the referral bucket, so your referral number falls and a new one appears beside search.
What you give up by leaving
GA4 is free, and it is free because it is part of an advertising business. That is a fair trade for a great many sites, and pretending otherwise would be dishonest.
- The ecosystem
- Google Ads, Search Console, Looker Studio, audience export, conversion import. Micaforge has none of this and is not attempting it. If you buy traffic, GA4 earns its place.
- Everyone already knows it
- Every agency and every new hire can read a GA4 property. Micaforge is pre-release software with a repository and no community at all.
- BigQuery
- The raw event export is genuinely strong, and it is how serious analysis on GA4 gets done.
- Somebody else's uptime
- GA4 does not go down because your VPS ran out of disk. A self-hosted install is a machine you now operate.
What a tag cannot do
GA4 is a JavaScript tag, so it sees exactly what a browser executes. Every crawler that has ever taken one of your pages did so without executing anything, which means the entire agent half of this argument is invisible to GA4 by construction. No setting, no custom dimension and no BigQuery query changes that, because the rows were never collected.
Micaforge reads that half from the access log your web server already writes. It is the same reason the two tools disagree about bots: one is discarding a category, the other is reporting it.
Row by row
| Question | MicaforgeAGPL-3.0, pre-release, self-hosted | Google Analytics 4Hosted, free at most volumes |
|---|---|---|
| Price | Free, and AGPL-3.0You pay for the machine it runs on. Nothing is metered. | Free at most volumesAnalytics 360 is the paid tier. For most sites GA4 costs nothing, and that is a real advantage. |
| Where the data lives | Your machineYour ClickHouse, your Postgres. The build makes no outbound call at runtime, including for geolocation. | Google'sUnder Google's terms, in Google's account, subject to Google's retention controls. |
| Access to raw events | DirectQuery ClickHouse yourself, or use the stats API, the query console or CSV. | Through BigQueryThe export is genuinely good, and it is how serious GA4 work is done. It is also a second product to learn and to pay for at volume. |
| Cookies and consent | None set, none readA daily-rotating salted hash, no raw IP at rest, so there is nothing to ask consent for. | First-party cookiesWhich is why the consent banner exists, and why your totals are shaped by who accepted it. |
| How a session ends | Thirty minutes idleThat rule and nothing else. | Idle, midnight, campaignGA4 also restarts a session at midnight and on a campaign change, so it usually reports more sessions than this will. |
| Known bots | Named and keptTheir own table, excluded from the human report by default and never deleted. | Dropped, silentlyGoogle documents automatic exclusion of known bots and spiders. There is nothing to switch on and nothing to read afterwards. |
| Fetches by AI crawlers | Counted, from your logOperator, purpose, verification, robots verdict, per fetch. | Structurally invisibleGA4 is a JavaScript tag. A crawler does not run one, so no configuration of GA4 can see this. It is not a gap in the product; it is the wrong instrument for the measurement. |
| Citation Gap per URL | Yes | NoHalf the arithmetic is missing, so the ratio cannot be built even in BigQuery. |
| Sampling, thresholding and modelling | NoneEvery number is a count of stored rows. When something cannot be known, the screen says so instead of estimating. | All threeRows can be withheld for privacy, and some reported figures are modelled rather than observed. What was withheld does not come across in an export. |
| History kept | Forever, by defaultRetention is a setting, and its default is to keep everything. Deleting history because a variable was unset would be indefensible. | Capped by a settingEvent-level retention on the standard tier is measured in months. Check your property's data retention setting before assuming last year is still there. |
| Advertising and search integration | NoneNo Ads, no Search Console, no Looker Studio connector. If you buy traffic, this is a real loss. | The whole ecosystemAds, Search Console, Looker Studio, audiences, conversion import. Nothing here competes with that and nothing is trying to. |
| People who already know it | NobodyThis project is pre-release. There is no course, no consultant, no Stack Overflow answer. | EverybodyEvery agency, every contractor, every new hire. That is worth a great deal on a team. |
| Learning curve | One question per screenDepth is available through filters and the query console; it is never required to read a report. | ConsiderableExplorations and custom reports are powerful and are the reason GA4 usually needs somebody who specialises in it. |
| Next | Install Micaforge | Import your GA4 history |
How to move without breaking the reporting
Import the GA4 export, then run both for a fortnight. Do not reconcile the totals: reconcile the shapes. The same pages in the same order, the same weekday rhythm, the same campaigns. When the shapes agree, the difference in the totals is the definitions above, exactly as described.
Aggregate exports expand into events at the start of each day, so an imported period has no hour-of-day shape. The importer marks those rows, and the docs say so on the same page as the button.
Google Analytics is not open source and has no README in this repository, so every GA4 statement here is kept to behaviour Google documents and you can check inside your own property: the session definition, bot exclusion, data thresholding, the data retention control and the BigQuery export. Nothing on this page is a benchmark of either product.
Stay on GA4 if
- You buy advertising and need conversions to flow back into it.
- Your reporting is built on BigQuery already.
- Other people need to read the property without being taught.
- You have no appetite for operating a server.
- Consent banners are already part of your site and you accept the trade.
Move to Micaforge if
- You want measurement without a consent banner.
- You want exact counts rather than modelled ones.
- You want the data on a machine you control, forever.
- Your site is written content that AI systems are reading.
- You can ship a web server access log.