Skip to content

Event types

An event automation fires on exactly one event type, chosen in the automation builder. The event type determines which condition fields and template variables ({player.name}, {message}, …) are available on it.

Eleven event types are available:

Broadcast, Capture, Chat, Death, Deployed, Join, Leave, Map, Marker, Round, Teamkill

Almost every field listed below is read straight off the event line, so a condition on it is checked the moment the event is seen. Two kinds of field are not: player.team is filled in from the live roster, and the two server fields come from the live server snapshot — neither is part of the log line itself.

A field with no value on a given event — an empty source column, a roster or snapshot that has not been read — is treated as not resolved rather than as an empty string: a condition naming it does not fire the automation on that event.


These events have a subject player, so the automation’s ban/note actions have someone to act on.

Field Description
message Text of the chat message
channel Chat channel the message was sent to (ChatAll, ChatTeam, ChatSquad, ChatAdmin)
player.name Sender’s in-game name
player.eosID Sender’s EOS ID
player.steamID Sender’s Steam ID; absent for a player without Steam
Field Description
player.name Joining player’s name
player.eosID EOS ID
player.steamID Steam ID; absent for a player without Steam
player.ip Masked address token
player.country Country of the player’s address (ISO code, e.g. RU); absent if not resolved
Field Description
player.name Leaving player’s name
player.eosID EOS ID
player.ip Masked address token
player.country Country of the player’s address (ISO code, e.g. RU); absent if not resolved

Fires on a death that is not a teamkill, at the death itself and not at the wound: a player who is wounded and then revived does not produce a Death. Wounds, damage and revives are recorded and shown, but cannot be automation events. A death whose attacker and victim are different players with known, non-zero and equal teams goes to Teamkill instead, and a Death automation does not see it. The subject for a ban/note action is the attacker — on a suicide or bleed-out death there’s no attacker, so those actions are skipped.

Field Description
attacker.name Attacking player’s name; absent on a suicide or bleed-out
victim.name Player who died
weapon Attacker’s soldier class as the death line names it

A death where the attacker and victim were on the same team. It fires at the death, not at the wound: a teammate who is wounded and then revived by a medic is not a Teamkill. The subject for a ban/note action is the attacker.

Field Description
attacker.name Teamkiller’s name
victim.name Player who was teamkilled
weapon Attacker’s soldier class as the death line names it
player.team Team number of the attacker; absent until the live roster knows them

A player placed a map marker. Squad 10.6 and later.

Field Description
player.name Name of the player who placed the marker
player.eosID EOS ID
player.steamID Steam ID
marker Marker type as the log prints it (e.g. BP_MapMarker_POI, BP_MapMarker_GridHeader_Spotted_Infantry)
team Team number the marker was placed for

These events have no player subject — an automation on one of these can’t use the ban/note actions (there’s no one to apply them to).

Field Description
message Broadcast text
admin.name Name of the broadcasting admin

A capture zone was captured or neutralized. Squad 10.6 and later.

Field Description
zone Name of the capture zone (e.g. Old Factory)
outcome captured or neutralized
team Team number that took the action

A deployable appeared on the map. The two main-base radios present from the start of a round are reported too — tell them apart by the deployable class. Squad 10.6 and later.

Field Description
deployable Deployable class (e.g. AmmoCrate_AFU)
team Team number the deployable belongs to
Field Description
layer New layer classname (e.g. Yehorivka_RAAS_v1)
Field Description
winner.faction Winning faction
winner.team Winning team number
winner.tickets Winner’s remaining tickets
loser.faction Losing faction
loser.tickets Loser’s remaining tickets (often 0)

Server fields come from the live server snapshot and can be used in the automation’s top-level conditions:

Field Description
server.name Server name
server.players Current online player count
server.layer Current map layer
server.capacity Player slots on the server
server.queue Players in the public queue
server.reserveQueue Players in the reserve queue
server.nextLayer Layer the server rotates to next
server.team1.players Player count of team 1
server.team2.players Player count of team 2
server.team1.faction Faction code of team 1, as the game reports it (e.g. USA)
server.team2.faction Faction code of team 2, as the game reports it (e.g. RUS)
server.seeding true while the seeding window is open and the server hasn’t gone live yet in it; false otherwise or when seeding is off

If the live snapshot can’t be read, server.name, server.players and the eight fields below server.layer are treated as not resolved, and a condition naming any of them does not fire the automation. The same holds when the game doesn’t declare a field or the server didn’t send it: a missing value is never replaced by 0 or an empty string. Factions are the raw codes, not display names.

server.seeding doesn’t come from the live snapshot: it is read from the server’s seeding settings and session data, and is treated as not resolved only when seeding is on and those can’t be read.

server.layer is resolved separately from the live snapshot, so it stays available when the snapshot can’t be read. If the server’s current layer isn’t known yet, server.layer is treated as not resolved, and a condition naming it does not fire the automation.


A handful of fields aren’t part of the raw event — heliana looks them up when an action runs. Because of that, you can only use them in a per-action condition (the condition attached to one action), not in the automation’s top-level conditions:

Field Description
player.accessLists Comma-separated names of the access lists that grant the player access on the server the action runs on — lists scoped to other servers and expired entries are left out; use $has / $lacks
player.bans.count Number of active bans on record for the player in this organization
player.firstSeen Date/time the player was first seen
player.game.timePlayed Total recorded play time
player.alts.banned Number of alts of the player (accounts sharing an address) with an active ban in this organization
player.account true or false: whether a user is linked to the player through a Game ID verified in the organization
player.alts.count Number of other players sharing an address with the player, banned or not
player.country Country code of the address of the player’s latest session; absent if there is no session or the address has no country. On Join and Leave events it is a field of the event itself and also works in top-level conditions
player.discord true or false: whether the user whose verified Game ID links them to the player has signed in with Discord
player.discord.roles Comma-separated names of the guild roles the access lists grant the player (the roles the bot assigns, not the roles the member holds in Discord); absent without a Discord login or a connected guild
player.exception true or false: whether the player has an active exception on any server of this organization
player.lastSeen Date/time (ISO 8601, UTC) the player’s latest session started; absent if there are no sessions. Sessions are recorded about once a minute, so right after a join this is still the previous session
player.notes.count Number of notes on the player in this organization
player.patron.paidUntil Date/time (ISO 8601, UTC) of the patron’s next Patreon charge; absent without a patron match or a charge date
player.patron.status active, excluded or former; absent without a patron match
player.patron.tiers Comma-separated Patreon tier names, exact and case-sensitive — use $has / $lacks; absent without a patron match
player.seed.days Days in the last 30 on which the player earned seeding credit on this server; absent when seeding is off for the server
player.seed.excluded true or false: whether the player is excluded from seeding rewards in this organization
player.seed.minutes Player’s seeding credit on this server over the last 30 days, in whole minutes; absent when seeding is off for the server
player.session.minutes Minutes the player’s current session on this server has lasted; absent unless the player is on this server, and for up to a minute after the join
player.cbl.activeBans Number of active bans on the player’s Community Ban List profile; 0 if CBL does not know the player
player.cbl.risk Community Ban List risk rating; absent if CBL does not know the player
player.steam.accountAgeDays Age of the player’s Steam account in days; absent for a private profile or a player without Steam
player.steam.daysSinceLastBan Days since the player’s last VAC or game ban; absent if there are none
player.steam.gameBans Number of game bans on the player’s Steam account
player.steam.hours Hours played in the game on Steam; absent if the game details are private or the player doesn’t own the game
player.steam.vacBans Number of VAC bans on the player’s Steam account
player.tags Comma-separated names of the tags on the player — use $has / $lacks to check membership
counter.<name> A windowed counter of one event type (by the acting player) you define on the automation

Three more fields are stamped on the run by heliana itself, not read off an event or a live snapshot. Use them as template variables in an action’s text ({run.at}, {player.url}, {user.name}); per-action conditions see them too. The automation’s top-level conditions are checked before these fields exist, so there a field reads as empty. An action whose text names {player.url} on a run whose player your organization can’t see is skipped with the field named, rather than sent with the literal token.

Field Description
run.at ISO 8601 timestamp of the run — the same moment for a manual run, an event, and a scheduled run
player.url Link to the player’s card in the console; present only on a run with a player subject
user.name Name of the operator who clicked Run — present only on a manual run; an event or a schedule has no actor