How to generate automated economy reports for your MU Online server
Build an automated reporting pipeline that monitors Zen in circulation, item inflation, jewel drops, and the overall health of your MU Online server's economy, with ready-to-use SQL queries and configurable alerts.
Every MU Online server economy tends toward inflation if no one is watching the numbers — Zen piles up, jewels pile up, and the item that was rare at launch becomes a commodity within a few months. The difference between a server that keeps its economy healthy for years and one that "dies" from infl
Every MU Online server economy tends toward inflation if no one is watching the numbers — Zen piles up, jewels pile up, and the item that was rare at launch becomes a commodity within a few months. The difference between a server that keeps its economy healthy for years and one that "dies" from inflation in a few months usually isn't the initially configured drop rate, but the ability to detect the imbalance early and act. Automated economy reports are exactly that capability: a set of queries and alerts that run on their own and warn the administrator before the problem becomes visible to every player. This tutorial builds that pipeline from scratch.
Why automate economy reports
Eyeballing the economy — via player feedback on Discord or the administrator's personal impression — always arrives too late. By the time players start complaining that "everything got more expensive," inflation is already at an advanced stage, and the fix (reducing drops, adding a Zen sink) causes more friction than if it had been done early. Automated reports, running daily or weekly, give continuous visibility and allow for small, gradual adjustments instead of abrupt, unpopular corrections.
Essential metrics of a healthy MU economy
| Metric | What it measures | Warning sign |
|---|---|---|
| Total Zen in circulation | Sum of Zen across all accounts + characters | Growth far above the number of active players |
| Average Zen per active account | Total Zen / active accounts | Steady rise indicates too little Zen "sink" in the game |
| Jewels in circulation (by type) | Sum of Bless, Soul, Life, Chaos, etc. | Growth disproportionate to the number of players |
| Average price of a key market item | Observed sale price (player shop/marketplace) | Steady rise = inflation; sharp drop = saturation |
| Wealth distribution (top 1% vs. the rest) | Zen/items concentrated in the richest accounts | Extreme concentration pushes new players away from the market |
| Zen sink rate | Zen spent on NPCs, repairs, fees / Zen generated by drops | Sink far below generation guarantees inflation |
Data sources: where the numbers live
Most MU emulators (IGCN, MuEMU, X-Team) store this information in fairly predictable tables, though names vary:
| Data | Typical table | Relevant column |
|---|---|---|
| Character's Zen | Character | Money |
| Zen stored in the warehouse/bank | Warehouse or AccountWarehouse | Money |
| Item inventory | Character_Inventory / Warehouse_Items | ItemIndex, ItemLevel |
| Drop log | MonsterDropLog (if it exists) | ItemId, Timestamp |
| Market transaction log | MarketLog / PersonalShopLog | Price, ItemId |
If your emulator doesn't keep a drop or transaction log by default, it's worth enabling it via configuration (most have the option, even if disabled by default) before you actually need it — without history, you can only analyze the current state, not the trend.
Step 1 — Query for total Zen in circulation
SELECT
(SELECT COALESCE(SUM(Money), 0) FROM Character) +
(SELECT COALESCE(SUM(Money), 0) FROM Warehouse) AS total_zen_circulation,
(SELECT COUNT(DISTINCT AccountID) FROM Character WHERE LastLogin > NOW() - INTERVAL 7 DAY) AS active_accounts_7d;
Run this query daily and store the result in your own historical table (not the game's tables), so you can compare the trend over time:
CREATE TABLE eco_report_daily (
report_date DATE PRIMARY KEY,
zen_total BIGINT,
active_accounts INT,
zen_avg_per_account DECIMAL(20,2)
);
Step 2 — Query for jewels in circulation by type
SELECT
ItemIndex,
CASE ItemIndex
WHEN 14 THEN 'Jewel of Bless'
WHEN 15 THEN 'Jewel of Soul'
WHEN 22 THEN 'Jewel of Life'
WHEN 31 THEN 'Jewel of Chaos'
ELSE 'Other'
END AS jewel_name,
COUNT(*) AS total_quantity
FROM Character_Inventory
WHERE ItemIndex IN (14, 15, 22, 31)
GROUP BY ItemIndex
ORDER BY total_quantity DESC;
Adjust the ItemIndex values to match your emulator's item table — the values above are illustrative and vary by season/client.
Step 3 — Detecting wealth concentration
SELECT AccountID, SUM(Money) AS account_zen
FROM Character
GROUP BY AccountID
ORDER BY account_zen DESC
LIMIT 20;
Compare the sum of these 20 accounts against the total_zen_circulation calculated in Step 1. If the 20 richest accounts hold, say, more than 40% of the total Zen, that's already a sign of imbalance worth investigating — it could be legitimate farming by very dedicated players, or it could signal an exploit/bot operating at scale.
Step 4 — Calculating the Zen sink rate
The "sink" is Zen that leaves circulation (spent on NPCs, item repair, market fees). If your emulator doesn't log this directly, one approximation is comparing total Zen at two points in time against an estimate of generation (average drop × active players):
-- Simple comparison between two daily reports
SELECT
d2.report_date,
d2.zen_total - d1.zen_total AS zen_change,
d2.active_accounts
FROM eco_report_daily d1
JOIN eco_report_daily d2 ON d2.report_date = d1.report_date + INTERVAL 1 DAY
ORDER BY d2.report_date DESC
LIMIT 30;
A constant, growing positive change, with no corresponding growth in new players, is the most direct sign of inflation in progress.
Step 5 — Automating execution (cron/scheduler)
On Linux, schedule the queries via cron, calling a script (PHP, Python, or even a .sql file via mysql -e) that runs the queries and stores the result in the history table:
# crontab -e
0 6 * * * /usr/bin/php /var/www/scripts/eco_report_daily.php >> /var/log/mu_eco_report.log 2>&1
The script (eco_report_daily.php) should: connect to the database, run the queries from Steps 1 through 4, store the result in eco_report_daily, and optionally send a summary to an admin Discord webhook.
Step 6 — Automatic threshold-based alerts
Configure the script to fire an alert (Discord webhook, email) whenever an indicator crosses a defined threshold:
| Indicator | Suggested alert threshold |
|---|---|
| Total Zen change | +15% in 7 days with no growth in active players |
| Concentration in the top 20 accounts | Above 40% of total Zen |
| A specific jewel in circulation | +25% growth in 7 days |
| Active accounts dropping | 20%+ drop in a week |
if ($zen_percent_change > 0.15 && $player_growth < 0.05) {
sendDiscordAlert("Inflation alert: Zen grew {$zen_percent_change}% with no proportional player growth.");
}
Step 7 — Turning data into decisions
A report only has value if it leads to action. Establish standard responses for each signal:
| Signal detected | Recommended action |
|---|---|
| Steady Zen inflation | Add a sink (NPC fees, higher reset/reforge cost) |
| A specific jewel in excess | Reduce that jewel's drop rate by 10-20% |
| Extreme wealth concentration | Investigate top accounts (legitimate farming vs. exploit) |
| Drop in active players | Review the cause before touching the economy (it may not be economic) |
Step 8 — Consolidated weekly report for the team
Beyond the daily automated alerts, put together a weekly summary (even if manual, copying numbers from the history) with a simple chart of total Zen, jewels in circulation, and active accounts over time. Sharing this summary with the whole admin team — not just whoever handles the economy — helps related decisions (events, new item drops) factor in the economy's current state.
Common errors and fixes
| Symptom | Likely cause | Fix |
|---|---|---|
| Report doesn't run automatically | Misconfigured cron or file permissions | Test the script manually and review the crontab |
| Numbers don't match players' perception | Market/drop logging disabled, missing data | Enable the relevant logs in the emulator's configuration |
| Alerts fire too often (false positives) | Thresholds set too low | Calibrate thresholds after observing 2-4 weeks of history |
| Inflation identified but no action taken | No defined response process | Document a standard action for each alert type |
| Incomplete history after a server outage | Report table with no failure handling | Add error logging and manual re-run for the missed day |
Reporting pipeline implementation checklist
- Historical reports table (
eco_report_dailyor equivalent) created. - Queries for total Zen, jewels in circulation, and wealth concentration validated.
- Drop/market logs enabled in the emulator, if they weren't already.
- Automation script scheduled via cron (or the Windows equivalent).
- Alerts configured with thresholds calibrated after an observation period.
- Response process documented for each alert type.
- Weekly summary shared with the admin team.
With automated reports monitoring the economy's health, the next step is to use that data to directly calibrate the server's drop rates and item systems, closing the loop between monitoring and configuration — a good starting point is reviewing the general rates in the MU Online server creation tutorial.
Frequently asked questions
How often should I generate economy reports?
A daily summary report (total Zen in circulation, jewels dropped, top farmers) and a more complete weekly report (inflation comparison, wealth distribution) cover most servers well. During launch periods or major events, it's worth tracking daily for at least two weeks.
Do I need an expensive BI tool for this?
No. Most of the value comes from well-designed SQL queries running periodically, with results exported to a spreadsheet or a simple dashboard (Grafana with a MySQL connector, for example, which is free). Paid BI tools only pay off on very large servers with a dedicated data team.
What counts as 'inflation' in an MU Online context?
It's an increase in the amount of Zen and valuable items (jewels, excellent/ancient items) in circulation without a proportional increase in demand, resulting in a drop in the purchasing power of each unit. If the average price of a Jewel of Bless in Zen consistently rises month over month, that's a sign of inflation.
Do economy reports help identify bots and item duplication?
Yes, indirectly. Abnormal spikes in Zen or items on a specific account, or circulation growth far above the number of active players, are usually the first visible signs of large-scale bot farming or an active duplication exploit.
Is it worth sharing these reports with the community?
A summarized version without sensitive data (e.g., 'we adjusted jewel drop rates because inflation passed X%') builds transparency and trust. Don't share individual account data or numbers that expose vulnerabilities exploitable by malicious players.