Skip to content

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.

Claims about GA4 are kept to documented, checkable behaviourMicaforge rows describe the build in this repositoryOut of date? That is a bug. Open an issue.

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

GA4 cells describe documented behaviour you can verify in your own property. Where a figure depends on your settings, the cell says to go and look.
QuestionMicaforgeAGPL-3.0, pre-release, self-hostedGoogle Analytics 4Hosted, free at most volumes
PriceFree, 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 livesYour 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 eventsDirectQuery 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 consentNone 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 endsThirty 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 botsNamed 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 crawlersCounted, 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 URLYesNoHalf the arithmetic is missing, so the ratio cannot be built even in BigQuery.
Sampling, thresholding and modellingNoneEvery 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 keptForever, 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 integrationNoneNo 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 itNobodyThis 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 curveOne 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.
NextInstall MicaforgeImport 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.

About these claims

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.