The WordPress way to install GA4 is clunky
Your site has no analytics. You can't tell which blog post converted best, what device people actually use, or when traffic spiked.
The canonical WordPress paths are: install an analytics plugin (comes with admin pages, updates, subscription nags), paste the snippet into functions.php (breaks when you switch themes), or set up Google Tag Manager as middleware (overkill for one pixel).
What most people do instead
How to add GA4 to WordPress without a plugin
If you only need GA4 and nothing else, you can output the tag yourself. Drop a must-use plugin in wp-content/mu-plugins/ that prints Google's gtag.js snippet into the page head:
// wp-content/mu-plugins/ga4.php
add_action( 'wp_head', function () { ?>
<!-- Google tag (gtag.js) -->
<script async src="https://www.googletagmanager.com/gtag/js?id=G-XXXXXXXXXX"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-XXXXXXXXXX');
</script>
<?php } ); Swap G-XXXXXXXXXX for your Measurement ID and GA4 starts collecting. It works, with the usual trade-offs:
- In
functions.phpit dies the moment you switch themes. Themu-pluginsfolder avoids that. - The ID is hardcoded, so you edit the file to change it.
- It fires for everyone, including logged-in admins, so your own visits skew the data.
The command below does the same thing with no file to maintain.
A better way: one command, one ID, tracking live
Run enable ga4 with your Measurement ID. The command auto-registers as a startup command so the tracking snippet outputs on every page load. No theme edit, no plugin, no GTM middleware.
Shown in advanced mode, where commands start with tp. In easy mode you type the same command without the tp prefix.
Stored in the database, not your theme. The Measurement ID survives theme switches and updates. Change it anytime by re-running the command, and disable it from Startup Commands.
How it works
The command hooks wp_head with the Google-provided tracking snippet, then auto-registers itself in Startup Commands so the tracking stays active across requests. Re-running with a different ID updates the existing entry. Disable from Startup Commands to remove.
tp enable ga4 -mid=G-XXXXXXX| Parameter | Value |
|---|---|
-mid (required) | Measurement ID (format: G-XXXXXXX) |
| Scope | Auto-registered as startup command, runs on every frontend page load |
| Where to find the ID | Google Analytics → Admin → Data Streams |
| Can be used in |
Real example
Your marketing director wants GA4 on the site by Friday. Without this command, you'd install Site Kit (requires Google account auth dance) or MonsterInsights (premium features gated). Instead, you grab the Measurement ID from Google Analytics, run tp enable ga4 -mid=G-ABC123, done. Traffic starts hitting GA4 within minutes.
Goes further with TrueCommander
Frequently asked questions
wp_head hook, as shown above. The trade-offs are a hardcoded ID and tracking that fires for admins too. TrueCommander does the same in one command, with no file to maintain.<head>, via the wp_head hook. Google recommends loading gtag.js as high in the head as possible so it captures the full page view.