Skip to content
NordBots.
Back to ServerAnalytics

ServerAnalytics configuration editor

Set everything with sliders and toggles, then export the files. This covers the whole config folder: config.json for how the plugin behaves, one file per crate for the loot, the shared pools they draw from, and the language file players read. Your progress saves in this browser as you go. See the docs for what each setting does.

Ready to edit

Templates

Save every file you have changed as one named set, then load it any time. Stored in this browser.

No templates yet.

Settings

Crates

No crate files yet.

Shared pools

No shared pools yet.

Language

No language file published.

config.json

How the plugin behaves. Settings only, never loot.

General

Language

Which language file to use from the lang folder. "en" reads lang/en.json. Make a copy like lang/de.json, translate the lines, and put "de" here. If a line is missing from your file, the built in English line is used, so nothing ever shows blank.

LangAutoFill

When true, I add any new text lines to your language file after an update. I never touch lines you already wrote, and I save the old file next to it as a .bak first. Set false if you want your language files left alone completely.

SenderName

The name shown in chat when I speak, instead of the plain (SERVER) tag. Leave "" to keep the normal server tag. Example: "The Bookkeeper". You can use {map} and {server} inside it, like "Books of {map}". This only changes chat lines. The on screen popups are not touched by it.

General

Debug

When true, I write extra detail to ArkApi.log so problems are easy to chase. Leave false for a quiet log on a healthy server. Turn on when NordBots support asks.

Server

How I learn which server my books belong to. One config.json can go out to every map in your cluster and each copy still signs its own name, because I read the name straight from the way you start the server. You will most likely never need to touch this block at all.

Name

Name: a name written here beats everything else. It is used exactly as typed. Keep it "" and I find the name on my own, which is the setup that lets one config file serve nine maps.

NameFromParams

NameFromParams: the start line switches I check, first hit wins. Most launchers already pass one of these four. Runs ArkShop too? Then -serverkey= is already on your line and I pick it up with no work from you. Add another entry if your panel writes the name behind a different switch.

UseSessionName

UseSessionName: true lets me also try the session name the game shows in the server browser, after the start line gave me nothing. Off by default, since many hosts stuff that field with rates and ads.

Id

Id: a short lowercase tag squeezed out of the name, for places that want a handle instead of a title. Leave "" and I make one from the name I found. Only set it yourself if two servers boil down to the same tag.

License

Key

Your ServerAnalytics license key from NordBots.cc. It looks like NB-XXXX-XXXX. With no key here I still load, but I record nothing until one is set. After pasting the key, run ServerAnalytics.Reload from the console and watch the log.

Cluster

ClusterName

A short name for your whole cluster, the same on every server in it. Example: "arkstar-monthly". With "" I use the word cluster. Every saved row carries this name, so one database can hold many clusters apart.

ServerName

A short name for THIS server, different on every map in the cluster. Example: "island-1". With "" I use the name the Server block above worked out from your launch line, which is usually exactly what you want. Two servers must never share this name, or their rows blend together.

Season

The name of the current wipe or season, like "wipe-2026-08". Change it when you wipe and I start a fresh season page. Old rows keep the old name. With "" I call the season open and just keep counting.

Database

Mode

Where I keep my books. "sqlite" needs zero setup and lives in my data folder. "mysql" lets every server in the cluster write into one shared database. Pick "mysql" when you run more than one map or want a website to read the data.

TablePrefix

The first part of every table name, like sa_players and sa_sessions. Leave it as "sa" unless another tool in your database already uses those names. Websites and bots read these names, so change it once at the start or never.

MakeViews

When true and you are on MySQL, I build three read only views your website or bot can read without knowing my table shapes: player totals, player combat, tribe time. Set false if your MySQL user is not allowed to create views. SQLite skips this.

MySQL

Host

The address of your MySQL server. Example: "127.0.0.1".

Port

The port of your MySQL server. Almost always 3306.

User

The MySQL user I log in as. Give it rights on the database below.

Password

That user's password.

Database

The database name my tables live in. Example: "arkstats".

Track

Sessions

Record sessions and playtime. Who joined, when they left, how long they played, and how much of that time they stood still. This is the heart of the plugin.

Tribes

Record tribe life. Joins, leaves, kicks, merges, and renames, with the time of each.

Combat

Record player deaths. Who fell, who did it, player or creature or the world, same tribe or not, and where it happened. Also totals up player damage in short windows, so a raid becomes a handful of rows instead of a million.

Dinos

Record dino life. Tames with the level, wild and boss kills by players, and tamed dinos lost, with the species and the tribe.

AdminActions

Record admin life. Every tracked admin command, creative mode going on and off, and every command that comes in over RCON. This is the audit page.

Crafting

Record who asked to craft what, and whether it was their own bag or a station. A station craft with no clear person is filed to the tribe, never guessed onto a player.

Structures

Record building and raids. Structures placed and destroyed, plus a raid timeline that opens when one tribe starts hitting another and closes after things go quiet.

ResourceGains

Record resources landing in player bags. This one is still being proven, so it ships off. Turn it on only if you are helping test it, and treat the numbers as a rough guide until we say otherwise. Nothing else is affected either way.

Inventory

Record what people are carrying and what sits in their boxes. This is the Inventory block below, and it is the heaviest thing I do, so it ships off. When you turn it on, read that block first and pick a SweepSeconds you are happy with. Everything else keeps working either way.

Keep

CombatDays

How many days of death rows to keep. 0 means keep them forever. 180 gives you half a year of history. A smaller number keeps the database lean. Every night I quietly sweep out rows older than this.

SessionsDays

How many days of finished sessions to keep. 0 means forever. Playtime totals come from these rows, so trimming them trims old totals too.

TribeEventsDays

How many days of tribe events to keep. 0 means forever. These rows are small, so forever costs almost nothing.

DamageWindowDays

How many days of damage window rows to keep. These are the busiest rows I write, so they get the shortest life. Two weeks covers most raid arguments.

DinoEventsDays

How many days of dino rows to keep. 0 means forever.

AdminDays

How many days of admin audit rows to keep. 0 means forever, and I suggest leaving it there. The audit is worth the space.

StructureDays

How many days of building and raid rows to keep. 0 means forever.

GainsWindowDays

How many days of resource gain and craft rows to keep. 0 means forever.

WatchDays

How many days of close watch rows to keep. 0 means forever. These are the most detailed rows I write, so a shorter life is kinder to your disk.

ChatDays

How many days of chat lines to keep in the <prefix>_chat table. 0 keeps them forever. Chat is the biggest table on a busy server, so 30 is a sensible floor and 90 is plenty for a moderation trail.

InventoryMovesDays

How many days of item move rows to keep in the <prefix>_stock_moves table. This is the "who took the metal" trail. 0 means forever, but on a busy server it grows fast, so 45 days is a sensible starting point.

InventoryIdleDays

How many days a quiet bag or box page stays in the books before I tidy it away. A page is quiet when I have not counted it since then, which usually means the player stopped playing or the box was torn down. 0 keeps every page forever.

Alerts

CreativeUse

When true I send a Discord alert the moment creative mode comes on for anyone.

AdminGives

When true I send a Discord alert when an admin command from my watch list runs, like giveitem or spawndino. The list itself lives under Advanced. I look past a leading "cheat" or "admincheat", so a tool that sends "admincheat GFI ..." still trips the alert for gfi.

RconCommands

RconCommands: how much RCON traffic reaches your Discord webhook. Every command is always written to the audit no matter what; this only picks the Discord posts. "watchlist" sends only commands from the watch list above. This is the default. "all" sends every RCON command as a quiet post, and watch list hits still go to the alert route. The PostsPerMinute cap in discord.json holds the flood back if a bot gets chatty. "off" sends nothing from RCON to Discord at all.

MutedHours

A quiet window when alerts stay silent, for planned maintenance. Write it as start-end in 24 hour time, like "02:00-04:00". Leave "" for no quiet time. Everything is still written to the audit, only the Discord ping is held.

Commands

MyStats

The chat command a player types to see their own record. Rename it if another plugin already uses /mystats. Set "" to turn it off.

TribeStats

The chat command for the tribe page. Set "" to turn it off.

Top

The leaderboard command. A player can add a board name after it: /top time, /top kills, or /top tames. Plain /top shows time. Set "" to turn it off.

Bag

The chat command a player types to see what they are carrying. It only answers when Track then Inventory is on. A player can add a number for more lines, like /bag 20. Set "" to turn it off.

Panel

Enabled

The stats window players can click through, drawn by the free NordBots UI mod. True means I look for the mod and open the window next to my chat replies. False means I never look for the mod at all and everything stays chat only.

RowsPerPage

How many rows fit on one page of a plain list window. Every plugin with a window shares this same block, so the setting rides along here too. My own pages are short fixed lists and the leaderboard follows TopCount below, so this one changes nothing for me today. 12 is the most the wire can carry.

TopCount

How many names one page of the Top players window shows. It has its own number so you can keep other pages short and still show a full top ten. Also capped at 12.

BuffTag

The tag I search for on the mod's buff. The buff is my road to a player's screen. Only change this if a mod update tells you the tag changed.

BuffPath

The folder the mod's buff lives in. When the tag is missing I match on this instead, so an untagged buff still works. Leave it as it ships.

SingletonPath

The mod actor I read the protocol version from before I send anything. Leave it as it ships unless the mod maker says it moved.

RequireHandshake

My choice when the mod carries no version number at all. False means I send the window anyway and trust the mod to skip anything it does not understand. That is the right call for almost every server. True means I hold every window back until I can read a version that matches mine. A version that truly disagrees with mine always stays off, no matter what this says.

ApiUtilsMod

Enabled

When true and the free ASA API Utils mod is on the server, my messages show as clean on screen panels instead of plain chat. Without the mod I just talk in chat as normal.

BackdropColor

The panel background color as red, green, blue, alpha from 0.0 to 1.0. The last number is see through. 0.55 is a soft dark glass.

ScreenPosition

Where the panel sits on screen: "Left", "Center", or "Right".

TextAlign

How the text lines up inside the panel: "Left", "Center", or "Right".

TextScale

How big the text is. 1.0 is normal. 1.5 is half again as big.

MessageSeconds

How many seconds the panel stays on screen.

AlsoShowInChat

When true the same words also land in the chat log, so nobody misses them. That means two messages per send when the mod is on.

MapName

Pretty

When true I turn map file names like TheIsland_WP into The Island everywhere I speak.

Overrides

Set your own names for maps here. The left side is the raw file name. Example: { "TheIsland_WP": "Home Island" }

Inventory

Inventory: what people are carrying and what is sitting in their boxes. How it works, in plain words. I do not hook every single item pickup, because a forge running flat out would drown the server in events. Instead I keep a page for every bag and box I know about, and I look at a few of those pages every second. When a page has not changed since the last look I write nothing at all. When it has changed I write only the lines that moved. A bag somebody is actively sorting gets looked at almost every second. A bag nobody has touched gets looked at once a sweep. A box or a mount only gets a page once a player opens it. I never go hunting for every chest on the map, so a server with fifty thousand structures costs me nothing until somebody actually opens one. The page then sticks around for ContainerHoldMinutes after the last time anyone touched it. The starting numbers here are picked for a hundred players online at once. If your server is smaller you can drop SweepSeconds and get near instant updates.

Players

Count what players are carrying, worn gear included. This is the main one. Turn it off and I only watch boxes and mounts.

Containers

Count boxes, forges, fabricators, crop plots and anything else a player opens. Turn it off if you only care about what people carry on them.

Mounts

Count what a player loads onto a dino. Same rule as boxes, I only see a mount once somebody opens its inventory. Set false to skip dinos entirely.

IncludeEquipped

Include the gear a player is wearing and holding in their count. False counts only loose items in the bag.

TrackBlueprints

Count blueprints as their own number on each item line, so you can tell "300 metal" from "300 metal plus 2 blueprints for it".

SaveContents

Save the full contents to the <prefix>_stock table so you can ask "what does this player have right now". Set false and I only write the move trail, which is much lighter on the database but cannot answer that question.

SweepSeconds

How long a full pass over every page should take, in seconds. This is the dial that matters most. 30 means every bag and box I know about gets looked at least once every 30 seconds. 5 gives you near live numbers and costs about six times as much work. Anything a player is actively using is looked at far more often than this no matter what you put here, so 30 still feels quick.

MaxScansPerTick

The hard ceiling on how many pages I read in one second, whatever SweepSeconds works out to. This is the safety belt that stops a sudden crowd from costing a frame. 12 is comfortable. Raise it only if MaxScansPerTick shows up as the thing holding you back in ServerAnalytics.Holds.

MaxRowsPerTick

The most move rows I hand to the database in one second. Extra moves wait their turn rather than piling into the write queue. Raise it if you run MySQL on the same box and it never breaks a sweat.

MoveWindowSeconds

How long I hold a change before writing it down, in seconds. Chopping a tree sends wood into a bag in dozens of small bites. With 8 seconds those become one tidy row saying the whole amount. A smaller number writes sooner and writes more.

MinMoveQuantity

The smallest move worth a row. 1 records everything. Set it to 20 and a player eating one berry is ignored while somebody hauling metal is not.

UseFrameHint

Use the game's own "this inventory changed" marker to skip pages that cannot have moved. This is nearly free and saves most of the work, so leave it true. If your numbers ever look stuck, set it false and tell NordBots support.

ForceRescanSeconds

No matter what that marker says, I count a page from scratch at least this often. This is the belt and braces for the setting above. 300 is five minutes.

HotLooks

How many extra looks a page earns after it changes. A bag that just changed is very likely about to change again, so it jumps the queue for this many looks. This is what makes a player sorting a chest feel live. 0 turns it off.

MaxItemsPerHold

The most items I read out of one bag or box in a single look. A vault stuffed past this is counted up to the cap and no further, which keeps one hoarder from costing everybody a frame. 600 covers any normal container.

MaxContainers

The most box and mount pages I keep at once. When it is full, new boxes are turned away until an old page ages out, and ServerAnalytics.Holds tells you how many I turned away. Raise it on a big busy server, lower it on a small box.

ContainerHoldMinutes

How long a box or mount page lives after the last time anyone touched it. 30 minutes keeps a raid or a build session together without holding pages for chests nobody has opened since this morning.

SweepBudgetMicros

My own speed limit for one second of counting, in millionths of a second. 3000 is three thousandths of a second. If a sweep goes over this I quietly halve how many pages I read next second and creep back up when there is room again, so a busy moment costs you a slower count and never a stutter.

BagLinesShown

How many lines /bag shows a player by default. They can ask for more by typing a number after the command, up to 25.

IgnoreItems

Items I should not count at all, matched anywhere in the item name and not fussy about capitals. Good for cutting the noise from things nobody cares about. Example: ["Berry", "Feces", "Thatch"]

OnlyItems

When this list has anything in it, I count only items that match one of these. Everything else is skipped. Great for a server that only wants the valuable things watched. Example: ["Element", "Tek", "Metal Ingot", "C4"]

AlertItems

Items worth a Discord alert when a big pile of them moves. Same matching as above. Alerts go to your alert webhook. Example: ["Element", "C4", "Tek "]

AlertQuantity

How much of a watched item has to move before I speak up. 0 turns the alerts off no matter what AlertItems says. 100 means "tell me when a hundred element moves at once", which is the kind of thing worth knowing about.

Wire

------------------------------------------------------------------ Wire: talk to Discord both ways, through the NordBots bot. This is the one that puts your in game chat in a Discord channel, and puts anything typed in that channel back into your game. You do not host anything and you do not make your own Discord bot. You invite ours. How to turn it on, start to finish: 1. Set Enabled below to true and put your NB- key under License. 2. Start the server. Look in ArkApi.log for the line that gives you your server key. 3. In your own Discord, invite the NordBots bot, then run /link and paste that server key. 4. Run /channel lane:chat channel:#wherever-you-want-chat One thing to think about before step 4. Anyone who can type in that channel can talk to your game server. Set the channel up the way you want it first. Your players' chat goes straight from this server to your own Discord. It never passes through us. Only the other direction does. ------------------------------------------------------------------

Enabled

Master switch. Off by default. Nothing reaches the internet for this until you turn it on.

Relay

Where the NordBots wire lives. Leave this alone unless we tell you to change it.

Out

Out: send your game chat to Discord. In: let lines typed in Discord show up in game. Turn either one off on its own. Off and off is the same as Enabled false.

In

Global

Which kinds of chat get sent out. Global is the normal one everybody reads, so it is on. Tribe and Alliance are private talk between players. Putting those in a Discord channel is a real betrayal of the people typing them, so both ship off. Turn them on only if your players know and agree. Local is proximity chat, which is noisy and rarely worth it.

Tribe

Alliance

Local

HideCommands

true means a line that was a plugin command, like /mystats, is not sent to Discord. Leave it true. Nobody needs to read your players' commands, and it quietly shows how your staff work.

StoreChat

Write every chat line to your database, in the <prefix>_chat table. This works even with Enabled false, and it is worth having on its own. The day you are handed a harassment report, this is the only place that remembers what was actually said. Trimmed by Keep.ChatDays.

Prefix

The little tag in front of a line that came from Discord, so players can tell it apart from someone in game. Set it to "" for no tag.

LineFormat

The line that lands in Discord. Discord markdown works here, so **bold** and `code` do what you expect. Some to try: "{message}" just the words, tidiest "{t} `{map}` **{player}**: {message}" time, map, name "**[{mode}]** {player}: {message}" handy if tribe chat is on "{R} {player} ({tribe}): {message}" shows how long ago

NameFormat

The name Discord shows as the author of the line. Leave it as {player} and each message looks like it came from that person. Set it to {map} or {server} and every line comes from the server instead, which reads better when your LineFormat already names the player. Empty means the webhook's own name is used.

InGameFormat

The line that lands in game when somebody types in Discord. Keep it short. Chat boxes are small. "{prefix} {player}: {message}" the normal one "{clock} {prefix} {player}: {message}" with a plain clock

TimeStyle

Which clock {time} uses. One letter: t T d D f F R. See the list above.

EscapeMarkdown

true stops a player breaking your Discord channel by typing markdown. Someone writing **hi** shows up as **hi** and not as bold. Turn it off only if you trust everyone on your server.

AvatarURL

A picture to show next to each line in Discord. You can use the same pieces here, so a service that serves images by EOS id would look like "https://example.com/faces/{eos}.png". Leave empty for no picture.

Colour

The colour of those lines in chat. One of: White, Green, Red, Yellow, Orange, Blue, Purple, Pink, Grey, Cyan.

MaxLength

Longest Discord line I will put in game, in characters. Anything longer is cut on a word and gets a "..." on the end. Bigger means long Discord posts fill the chat box. 220 reads well. Under 40 is ignored.

KeepLinks

false turns a web link into just its site name, so a huge tracking link reads as "example.com link". true prints the whole thing, which is ugly in game and is a way for someone to push a link at your players.

MinBackoffSeconds

If the wire goes quiet I wait, then wait longer each try, so a hiccup on our side does not turn into a flood of retries from every server at once. MinBackoffSeconds is the first wait, MaxBackoffSeconds is the longest I will ever wait. Chat going out to Discord keeps working the whole time.

MaxBackoffSeconds

MaxInboundPerMinute

Most Discord lines I will put in game in one minute. Anything past this is dropped. It stops one person spamming your Discord channel from burying your in game chat. Raise it on a quiet server, lower it on a busy one.

SeenJobs

How many recent jobs I remember so a repeat never runs twice. You should never need to change this.

Advanced

HeartbeatSeconds

How often each online player's session row is refreshed in the database, in seconds. If the server dies, a player can lose at most this many seconds of playtime. Smaller writes more often. Bigger writes less and risks a little more on a crash.

AfkAfterSeconds

How many seconds a player must stand still before I count their time as idle.

IdleMoveThreshold

How far a player must move, in game units, for me to call it moving. 50 is about half a footstep. Raise it if turrets or elevators fool it.

MaxQueuedWrites

The most database moves I hold in memory when the database is slow. Above this I shed only the cheap refresh writes and count what I shed in Status. Real events are never shed. They go to my spool file instead.

SpoolReplayMinutes

How often I check my spool file and write saved rows back once the database returns, in minutes.

MaintenanceHour

The hour of the server clock when I do my nightly sweep of old rows. 5 means 5 in the morning.

DamageWindowSeconds

How many seconds of player damage get rolled into one row. 10 keeps raid detail sharp. A bigger number writes fewer, coarser rows.

GainsWindowSeconds

How many seconds of resource pickups get rolled into one row per player per item. 60 is a good balance. Only matters when Track then ResourceGains is on.

GainsStudyRows

For testing only. Above 0, I also save that many raw resource pickup rows so we can study how the game reports them. Leave at 0 on a live server.

RaidQuietMinutes

How many quiet minutes end a raid timeline. If nobody hits the base again within this many minutes, I close the raid and write it up.

RaidMinHits

How many hits a raid needs before I post it to Discord. Small scuffles are still written to the database, they just do not ping your channel.

MaxWatched

The most players I will watch closely at one time. Each watch writes a lot of rows, so this keeps a busy night from filling your disk.

AlertCommands

The admin commands that fire a Discord alert. I match the first word only, with or without a leading slash, and case does not matter.

BossClassContains

Words that mark a creature class as a boss. I check each dino's name tag and species once per class and remember the answer, so this costs nothing in play.