Event Catalogue
Every row in the events table has a type discriminator and a payload JSONB blob. This page lists the event types AstralAnalytics emits out of the box and the payload shape for each one.
Storage row
server_name = "proxy" and server_group = "proxy" mark events that come from the Velocity proxy. server_name = "magehic" and server_group = "magehic" mark events that come from MageHic services via the direct shortcut.
Velocity proxy events
player_join
Fired on PostLoginEvent. The richest connection-time event.
Field | Type | Notes |
|---|---|---|
| String | Player name. |
| String | Remote address. Triggers GeoIP enrichment → adds |
| String | ISO 3166-1 alpha-2 (e.g. |
| String | What the client identified itself as during handshake. |
| int | Numeric protocol version. |
| String | Human-readable version (e.g. |
| String | The hostname the client used (e.g. |
| Boolean |
|
player_quit
Fired on DisconnectEvent. Only fires when a corresponding player_join was seen (so reconnect storms don't generate orphans).
Field | Type | Notes |
|---|---|---|
| String | — |
| long | Milliseconds between join and quit. |
client_brand
Fired on PlayerClientBrandEvent.
Field | Type | Notes |
|---|---|---|
| String | — |
| String | Updated brand. |
player_mod_info
Fired on PlayerModInfoEvent (Forge clients).
Field | Type | Notes |
|---|---|---|
| String | — |
| int | — |
| Array<Object> | Each entry: |
player_settings_changed
Fired on PlayerSettingsChangedEvent.
Field | Type | Notes |
|---|---|---|
| String | IETF tag (e.g. |
| int | Chunks. |
| String | Mojang enum name. |
| String | Mojang enum name. |
| Boolean | — |
Paper events
player_join_server
Fired on PlayerJoinEvent. Tracks per-server hops, not the initial proxy join.
Field | Type | Notes |
|---|---|---|
| String | — |
player_quit_server
Fired on PlayerQuitEvent. Like player_join_server, scoped to the current server.
Field | Type | Notes |
|---|---|---|
| String | — |
| long | Milliseconds spent on this server in this session. |
command_execute
Fired on PlayerCommandPreprocessEvent — every command, before any plugin handles it.
Field | Type | Notes |
|---|---|---|
| String | The full command line without the leading |
luckperms-promote/luckperms-demote
Emitted by LuckPermsHook on UserPromoteEvent/UserDemoteEvent. Only present when LuckPerms is on the same server.
Field | Type | Notes |
|---|---|---|
| String | Previous group, or |
| String | New group, or |
Custom events
Custom events do not have a dedicated registry — anything emitted through the AnalyticsService or the track-event action becomes a row with the type you pass and the JSON payload you provide.
See Developer API for both paths.
Conventions
There is no schema enforcement, so the network relies on convention. When introducing new event types:
snake_casefortype. Dashes are allowed (LuckPerms hook uses them) butsnake_caseis the norm.Stable field names inside
payload— adding fields is safe; renaming is breaking for every dashboard that already queries them.usernamewhenever a player is involved. Theplayer_uuidcolumn already has the UUID, but dashboards benefit from a denormalised name.ipto trigger GeoIP. Set the field and the master fills incountry. Don't includeipif you don't want the lookup (and don't want to store the address).Booleans, numbers, and nested arrays welcome —
JSONBhandles them, the GIN index makes them queryable withpayload->>'…'andpayload @>operators.