Skip to content

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

  1. The SDK registers a listener on each relevant discord.js client event.
  2. Each time the event fires, a per-type counter is incremented in memory.
  3. Every 60 seconds (on the snapshot tick), all non-zero counters are flushed as individual event_* records with data.count set 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 Typediscord.js EventDescription
event_channel_createchannelCreateA channel was created
event_channel_updatechannelUpdateA channel was updated
event_channel_deletechannelDeleteA channel was deleted
event_role_createroleCreateA role was created
event_role_updateroleUpdateA role was updated
event_role_deleteroleDeleteA role was deleted
event_thread_createthreadCreateA thread was created
event_thread_updatethreadUpdateA thread was updated
event_thread_deletethreadDeleteA thread was deleted
event_invite_createinviteCreateAn invite was created
event_invite_deleteinviteDeleteAn invite was deleted
event_voice_statevoiceStateUpdateA 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 Typediscord.js EventDescription
event_member_joinguildMemberAddA member joined a server
event_member_leaveguildMemberRemoveA member left a server
event_member_updateguildMemberUpdateA member was updated (role change, nickname, etc.)

GuildBans Intent Required (2 events)

Event Typediscord.js EventDescription
event_ban_addguildBanAddA member was banned
event_ban_removeguildBanRemoveA ban was removed

GuildMessages Intent Required (3 events)

Event Typediscord.js EventDescription
event_message_createmessageCreateA message was sent in a guild channel
event_message_updatemessageUpdateA message was edited
event_message_deletemessageDeleteA 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 Typediscord.js EventDescription
event_reaction_addmessageReactionAddA reaction was added
event_reaction_removemessageReactionRemoveA reaction was removed

GuildMessageTyping Intent Required (1 event)

Event Typediscord.js EventDescription
event_typing_starttypingStartA 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 Typediscord.js EventDescription
event_presence_updatepresenceUpdateA 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:

json
{
  "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:

ts
createDicolytics(client, {
  apiKey: '...',
  disabledEvents: [
    'event_typing_start',     // High volume, often not useful
    'event_presence_update',  // Requires privileged intent
  ],
});
python
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

IntentEvent 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
GuildMembersevent_member_join, event_member_leave, event_member_update
GuildBansevent_ban_add, event_ban_remove
GuildMessagesevent_message_create, event_message_update, event_message_delete
GuildMessageReactionsevent_reaction_add, event_reaction_remove
GuildMessageTypingevent_typing_start
GuildPresencesevent_presence_update

Dicolytics — Discord bot analytics