Events
The SDK aggregates 24 types of Discord gateway events as counters, flushed every 60 seconds. Unlike interactions and actions, gateway events are not sent individually -- they are counted and delivered as a batch with a data.count field.
How Events Are Collected
- The SDK registers a listener on each relevant discord.js client event.
- Each time the event fires, a per-type counter is incremented in memory.
- Every 60 seconds (on the snapshot tick), all non-zero counters are flushed as individual
event_*records withdata.countset to the accumulated count.
This aggregation approach avoids sending a flood of individual events for high-frequency gateway activity like messageCreate or typingStart.
24 Event Types
No Intent Required (12 events)
These events are always available -- they require no privileged or special intents:
| Event Type | discord.js Event | Description |
|---|---|---|
event_channel_create | channelCreate | A channel was created |
event_channel_update | channelUpdate | A channel was updated |
event_channel_delete | channelDelete | A channel was deleted |
event_role_create | roleCreate | A role was created |
event_role_update | roleUpdate | A role was updated |
event_role_delete | roleDelete | A role was deleted |
event_thread_create | threadCreate | A thread was created |
event_thread_update | threadUpdate | A thread was updated |
event_thread_delete | threadDelete | A thread was deleted |
event_invite_create | inviteCreate | An invite was created |
event_invite_delete | inviteDelete | An invite was deleted |
event_voice_state | voiceStateUpdate | A voice state changed (join, leave, mute, etc.) |
GuildMembers Intent Required (3 events)
Note
GuildMembers is a privileged intent. You must enable it in the Discord Developer Portal under your application's Bot settings. Bots in 75+ servers must also be approved for this intent.
| Event Type | discord.js Event | Description |
|---|---|---|
event_member_join | guildMemberAdd | A member joined a server |
event_member_leave | guildMemberRemove | A member left a server |
event_member_update | guildMemberUpdate | A member was updated (role change, nickname, etc.) |
GuildBans Intent Required (2 events)
| Event Type | discord.js Event | Description |
|---|---|---|
event_ban_add | guildBanAdd | A member was banned |
event_ban_remove | guildBanRemove | A ban was removed |
GuildMessages Intent Required (3 events)
| Event Type | discord.js Event | Description |
|---|---|---|
event_message_create | messageCreate | A message was sent in a guild channel |
event_message_update | messageUpdate | A message was edited |
event_message_delete | messageDelete | A message was deleted |
No message content
The SDK never reads or stores message content. Only the event occurrence is counted. The GuildMessages intent is required by Discord to receive messageCreate events, but the SDK uses these events purely for counting.
GuildMessageReactions Intent Required (2 events)
| Event Type | discord.js Event | Description |
|---|---|---|
event_reaction_add | messageReactionAdd | A reaction was added |
event_reaction_remove | messageReactionRemove | A reaction was removed |
GuildMessageTyping Intent Required (1 event)
| Event Type | discord.js Event | Description |
|---|---|---|
event_typing_start | typingStart | A user started typing |
GuildPresences Intent Required (1 event)
Note
GuildPresences is a privileged intent. It must be enabled in the Discord Developer Portal and approved for bots in 75+ servers.
| Event Type | discord.js Event | Description |
|---|---|---|
event_presence_update | presenceUpdate | A user's presence changed (online, idle, dnd, etc.) |
Intent Auto-detection
The SDK reads your bot's intent configuration from client.options.intents.bitfield at attach time. Listeners are only registered for events whose required intent is present. No error is thrown for missing intents -- the corresponding events are simply not collected.
Enable debug: true to see the intent detection result:
[dicolytics] gateway events: 12 listeners registered (intents=0x609)The hex value 0x609 corresponds to Guilds | GuildMessages | GuildMembers intents.
Aggregation and Counting
data.count Field
Each flushed event record contains a data.count field representing how many times that gateway event fired during the 60-second window:
{
"type": "event_message_create",
"ts": "2025-01-15T12:00:00.000Z",
"data": {
"count": 47,
"shardId": 0
}
}discord_events vs. events
Note
discord_events=SUM(data.count)-- the total number of gateway events that occurred. This is the "real" count.events(row count) =COUNT(*)-- the number of aggregated records. One record per type per 60-second window per shard.
For example, if event_message_create fires 500 times in a 60-second window on shard 0, that produces 1 row with data.count = 500. The discord_events metric reports 500, while the events count increases by 1.
Disabling Specific Events
Disable individual gateway event types via the disabledEvents option:
createDicolytics(client, {
apiKey: '...',
disabledEvents: [
'event_typing_start', // High volume, often not useful
'event_presence_update', // Requires privileged intent
],
});create_dicolytics(bot,
api_key="...",
disabled_events=[
"event_typing_start", # High volume, often not useful
"event_presence_update", # Requires privileged intent
],
)When an event type is disabled, its listener is never registered -- there is zero overhead for disabled events.
Required Intent Summary
| Intent | Event Types |
|---|---|
| (none) | event_channel_create, event_channel_update, event_channel_delete, event_role_create, event_role_update, event_role_delete, event_thread_create, event_thread_update, event_thread_delete, event_invite_create, event_invite_delete, event_voice_state |
GuildMembers | event_member_join, event_member_leave, event_member_update |
GuildBans | event_ban_add, event_ban_remove |
GuildMessages | event_message_create, event_message_update, event_message_delete |
GuildMessageReactions | event_reaction_add, event_reaction_remove |
GuildMessageTyping | event_typing_start |
GuildPresences | event_presence_update |