To track player-to-player payments on a Minecraft server, you need something listening to your economy plugin's events and writing them down. Vault, EssentialsX and CMI move the money, but none of them keeps a searchable history of who paid whom. The good news is that EssentialsX and CMI both fire an event for every payment that names the payer, the payee and the amount. The catch is that a naive logger counts each /pay twice.
This guide covers what each plugin exposes, the double-count trap, how to log payments with free tools, and how the ServerStats payments log handles it.
What each plugin gives you
Vault is not an economy. It is the API that shops, jobs and auction plugins call to move money, with an economy plugin (EssentialsX, CMI and others) behind it. Vault has no events: it can tell you a player's balance, but not that a payment happened. So Vault on its own is good for totals (the money supply and how evenly it is spread), not for a payments log.
EssentialsX fires TransactionEvent for each /pay, with the payer (getRequester()), the payee (getTarget()) and the amount. It also fires UserBalanceUpdateEvent for every balance change, with a cause such as COMMAND_PAY, COMMAND_ECO (an admin /eco give), COMMAND_SELL or API (another plugin through Vault).
CMI fires CMIUserBalanceChangeEvent with the balance before and after, an action type and, for payments, the paying player as the source. That is enough to tell a payment from a deposit.
PlayerPoints and TokenManager run their own currencies (points and tokens) and fire their own send events.
The double-count trap
One EssentialsX /pay Alex 100 fires, in order:
PreTransactionEvent;UserBalanceUpdateEventfor the payer, minus 100, causeCOMMAND_PAY;UserBalanceUpdateEventfor Alex, plus 100, causeCOMMAND_PAY;TransactionEvent: payer, Alex, 100.
A logger that counts balance updates records two transactions for one payment, and adds 100 to "money in" and 100 to "money out". Your transaction count doubles, and if you chart money created against money removed, /pay looks like both. Payments between players do not create or remove money, so they should net to zero.
The clean approach is to take the payment row from the transaction event, and to keep the two balance legs only as flow tagged pay, which cancels out. That is what the ServerStats agent does. On EssentialsX versions without the v2 TransactionEvent, it pairs the two legs instead. For CMI, the receiving leg that names another player as its source is the one payment row; both legs stay as net-zero flow.
Tracking payments with free tools
The quickest free option is EssentialsX's own economy log: set economy-log-enabled: true in its config.yml and it appends transactions to trade.csv. It is a flat file with no search, and it only covers EssentialsX. If you want more, log payments yourself:
- Write a small listener. A plugin listening to EssentialsX
TransactionEventatMONITORpriority can append payer UUID, payee UUID, amount and timestamp to a file or a database. Listen atMONITORso you record what actually happened after other plugins had their say. - Store UUIDs, not names. Names change; UUIDs don't.
- Never store the
/paymessage or any free text. It is chat in disguise and can hold personal data. - Snapshot balances with Vault once in a while (every 15 minutes is plenty) to see the money supply trend. Don't poll every tick:
getBalanceon some economies hits the database.
This works, but you end up building search, filters and retention yourself, and it only covers the one plugin you wrote it for.
How ServerStats logs Minecraft payments
The ServerStats agent for Paper, Purpur and Folia detects the economy plugins you run and hooks the ones it supports. Each payment becomes one row in the payments log: the time, the payer, the payee, the amount in your currency, and the plugin it came from.
| Plugin | What is logged | Status |
|---|---|---|
| EssentialsX | /pay as one payment; /eco give as an admin action; sign shops; all balance changes as flow | Verified |
| CMI | Payments between players; other balance changes as flow | Beta (paid; built on the public API) |
| PlayerPoints | Point transfers; admin give and set | Verified |
| TokenManager | Token transfers; token shop purchases | Verified |
| CoinsEngine / ExcellentEconomy | Balance changes as flow per currency | Verified |
| Vault | Balance polling every 15 minutes: money supply, spread, top balances | Verified |
| Vault observer | A fallback when no supported economy is installed: balance differences every 60 s as flow, never payments | Verified |
Beta means the adapter is built against the plugin's public API but has not been run against the real plugin, because it is paid. It is labelled that way in the dashboard too.
Pick which plugin we listen to
Many servers run two plugins that could report the same payment, such as CMI next to EssentialsX, or PlayerPoints through two bridges. For each server and each data area (payments, shops, punishments and so on), the Data sources page shows what the agent detected and lets you choose:
- Auto (the default): a built-in priority list picks one source per ledger, so nothing is counted twice.
- One source: only the plugin you pick; the others are counted as "seen" but not recorded.
- Off: nothing is read for that area.
Two sources that report the same ledger can't both be switched on; the picker refuses it rather than double counting.
Searching the log
The log explorer filters by player (as payer, payee or either), counterparty, amount range, currency, plugin and time. Click a row to see both players' recent payments to each other. Big payments, and several new accounts paying one player, are raised as abuse flags.
| Plan | Log history | Export |
|---|---|---|
| Free | 24 hours | — |
| Operator | 90 days | CSV, up to 100,000 rows |
| Network | 2 years, across all servers | CSV up to 1,000,000 rows, JSON Lines, log API |
Note: Players show as pseudonymous handles (#a91f3c) unless the agent sends names and you turn names on for your account. Members with the staff role always see handles only. The /pay message, if any, is never read.
Reading your economy, not just the log
A payments log answers "who paid whom". The economy charts answer "is something wrong":
- Money supply rising faster than your player count means inflation. Look for a source that is too generous, usually a sell shop or a job.
- Top counterparties for one account show whether a player is being fed by others. Several young accounts all paying one player is the classic alt funnel.
- Admin gives (
/eco give) are logged separately from payments, with the staff member who ran them, so they don't hide inside normal trade.
For the same thing on FiveM, see FiveM money logs. For what the agent collects on Minecraft overall, see the Minecraft page.
Minecraft