Brazil's biggest MU Online portal — since 2003
Tutorial Advanced Web

Advanced analytics with custom events for your MU Online server's website

Set up custom events in GA4 (or PostHog) to measure the full funnel of your MU Online server's website, from first visit to client download to first donation, with ready-to-replicate code examples and funnel structure.

BR Bruno · Updated on Jul 31, 2026 · ⏱ 17 min read
Quick answer

The standard Google Analytics dashboard shows how many people visited your site and for how long, but doesn't answer the question that really matters for a MU Online server: how many of those visits turned into active players, and at which stage of the path (home → sign-up → client download → first

The standard Google Analytics dashboard shows how many people visited your site and for how long, but doesn't answer the question that really matters for a MU Online server: how many of those visits turned into active players, and at which stage of the path (home → sign-up → client download → first login → first donation) most people give up. Custom events solve exactly that gap, letting you instrument every relevant funnel action and see exactly where to optimize. This tutorial details how to plan, implement, and analyze a complete set of custom events in GA4, with ready-to-adapt code examples for your portal.

The complete funnel of a MU Online server

Before implementing any event, map out the funnel you want to measure. A typical, complete funnel for a private server portal has these stages:

StagePlayer actionSuggested event
1. DiscoveryArrives at the site (organic, ad, referral)page_view (GA4 default)
2. InterestReads the server's features/resources pageview_features_section
3. IntentClicks "download client"download_client_click
4. Account conversionCreates an account on the site/panelsign_up
5. ActivationCopies the server IP or clicks "how to connect"copy_server_ip
6. RetentionLogs into the game (via server API, if available)game_login (server-side)
7. MonetizationCompletes a donationpurchase

Without instrumenting every stage, it's impossible to know whether your server's problem is attracting visitors (stages 1-2), converting them into players (3-5), or retaining and monetizing them (6-7) — and each problem requires a completely different solution.

Setting up GA4 with Google Tag Manager

Although it's possible to fire events directly via gtag(), using Google Tag Manager (GTM) makes it easier to add and adjust events without having to change the site's code every time. Install the GTM container in the <head> of every page and configure the event tags through the GTM dashboard, using click triggers on elements with data-event attributes.

<!-- Example of a button instrumented with a data attribute -->
<a href="/download/client.zip" data-event="download_client_click" data-category="conversion">
    Download Client
</a>

In GTM, create an "All Elements Click" trigger filtered by data-event equal to download_client_click, firing a corresponding GA4 event tag.

Firing events directly via gtag (without GTM)

If your site is simpler (no GTM), fire the events directly in JavaScript:

document.querySelectorAll('[data-event]').forEach(function (el) {
    el.addEventListener('click', function () {
        const eventName = el.getAttribute('data-event');
        const category = el.getAttribute('data-category') || 'general';
        gtag('event', eventName, {
            event_category: category,
            page_location: window.location.href
        });
    });
});

This snippet can be included once in the site's global JS file and automatically instruments any element that gets the data-event attribute, without needing to duplicate tracking code on every button.

Tracking server IP copies

A simple but revealing event: how many visitors copy the server IP (usually shown on the home page) is a strong indicator of intent to play, even before account creation.

const ipButton = document.getElementById('copy-server-ip');
if (ipButton) {
    ipButton.addEventListener('click', function () {
        navigator.clipboard.writeText('play.viciadosmu.com.br');
        gtag('event', 'copy_server_ip', {
            event_category: 'activation'
        });
    });
}

Compare the number of IP copies to the number of accounts created in the same week — a low ratio (many copies, few accounts) suggests the sign-up process is being abandoned, pointing to a problem in the next funnel stage, not the interest stage.

Tracking server-side events on the backend

Actions that happen inside the game (login, character creation, first entry into Devil Square) don't go through the browser, so they can't be captured via JavaScript on the site. For these cases, send the event server-side using the GA4 Measurement Protocol:

<?php
// send_server_event.php - called by the panel/API when the player logs in
$measurement_id = "G-XXXXXXXXXX";
$api_secret = "your_ga4_api_secret";
$client_id = md5($account_id); // consistent identifier, doesn't need to be real

$payload = [
    "client_id" => $client_id,
    "events" => [[
        "name" => "game_login",
        "params" => [
            "account_id_hash" => $client_id,
            "server" => "current-season"
        ]
    ]]
];

$url = "https://www.google-analytics.com/mp/collect?measurement_id={$measurement_id}&api_secret={$api_secret}";
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($payload));
curl_exec($ch);
curl_close($ch);

This pattern lets you cross-reference site and game data in a single report, closing the full funnel from "first click" to "in-game retention," something most MU portals never manage to measure because they treat site and server as separate systems.

Consistent event naming

A common mistake as instrumentation grows is creating events with inconsistent names (downloadClient, download-client, btn_download), which prevents cross-analysis later. Adopt a single convention from the start:

RuleCorrect exampleIncorrect example
Always snake_casedownload_client_clickdownloadClientClick
Verb + objectcopy_server_ipip_copied_event
Category prefix in a parameter, not the nameevent_category: "conversion"conversion_download_client
Names reused between site and donation pagepurchase (GA4 e-commerce standard)Isolated donation_complete

Building the funnel in GA4

With the events configured, use GA4's Explore > Funnel tool to build the complete funnel: page_viewdownload_client_clicksign_upcopy_server_ipgame_loginpurchase. GA4 shows the drop-off rate between each stage, revealing exactly where to invest optimization effort — if 80% drop off between sign_up and copy_server_ip, the problem is in the post-signup flow, not the homepage.

Segmenting by traffic source

Combine events with the source/medium dimension (organic, Discord, paid ads, referral) to find out which channels bring players who actually complete the funnel through to donation, not just visits. It's common for one channel to generate a lot of page_view volume but low conversion to purchase, while a smaller channel (player referral, for example) converts proportionally much better — essential information for deciding where to invest promotion time and budget.

Common errors and fixes

SymptomLikely causeSolution
Events don't show up in GA4Tag/gtag not firing or wrong Measurement IDTest in the "Realtime" report and check the Measurement ID
Funnel shows a 100% drop-off at one stageInconsistent event name between stagesStandardize naming (snake_case, same names sitewide)
Server events (game_login) not arrivingIncorrect API secret or Measurement Protocol endpointReview credentials and test the call in isolation with curl
Duplicate data between GTM and direct gtagTwo firing methods active at the same timeChoose a single method (GTM or direct gtag) per event
Funnel report empty for daysGA4 processing latency (24-48h)Wait for processing before considering the event broken

Advanced analytics checklist

  • Complete funnel mapped, from first visit to donation.
  • Custom events named consistently (snake_case).
  • Frontend events (download, copy IP) instrumented via GTM or gtag.
  • Server-side events (login, in-game actions) sent via Measurement Protocol.
  • Funnel built in GA4's Explore tool.
  • Traffic source segmentation configured.
  • Realtime test validated before considering the instrumentation complete.

With the full analytics funnel in production, the natural next step is to use this same data to feed controlled tests on the donation page, connecting acquisition and conversion into a single optimization cycle from the tutorial on how to create a MU Online server.

Frequently asked questions

Why aren't Google Analytics' standard reports enough for a MU server?

Standard reports measure pageviews and sessions, but don't capture business-specific actions, like 'clicked download client,' 'copied the server IP,' or 'completed a donation.' Without custom events, you don't know at which funnel stage players are dropping off before creating an account or actually playing.

Is GA4 the best option or is there a better alternative for MU servers?

GA4 is free and widely documented, which makes it the market standard. PostHog is an open-source alternative with session replay and more visual native funnels, a good option if you want to run self-hosted and have more control over player data.

Is it safe to track player actions without violating privacy?

Yes, as long as you track on-site actions (clicks, downloads, conversions) without collecting sensitive or personal data beyond what's necessary, and have an accessible privacy policy disclosing the use of analytics. Avoid tracking account or password information in any event.

How long does it take for custom events to show up in GA4 reports?

Real-time events show up within seconds in the 'Realtime' report, but for standard reports (Explore, funnels) GA4 usually takes 24 to 48 hours to process and make the full data available.

Can I use the same custom events on the donation page and the rest of the site?

Yes, and it's recommended — maintain a consistent event naming convention (e.g., always snake_case, always with a category prefix) across the whole site, including the donation page, so you can cross-reference data from the entire funnel in a single GA4 exploration.

BR
Events, maps & items editor

Bruno specializes in MU Online events, maps, bosses and item economy. He documents every detail based on real gameplay.

Keep reading

Related articles