K
Docs
Building Bots

⚡ Triggers

Triggers are Discord events that automatically fire your flows — no user interaction needed.

⚠️Triggers need Full Bot mode

Triggers require a persistent Discord gateway connection, which only Full Bot mode opens. Bots in the default Interaction Only mode can save triggers, but they stay inactive until you switch. See Bot Modes for the full comparison and how to switch.

🔬What a trigger looks like

This is what a trigger card looks like in your bot's Triggers tab. Sparks listed on the card are available in every piece inside the linked flow.

👋
Member joins
guildMemberAdd
Trigger
Sparks in this flow
{{input.guild.id}}Your Discord server's unique ID
{{input.guild.name}}Your server's name
{{input.guild.memberCount}}How many members are in the server
{{input.guild.icon}}Your server's icon image (empty if it has none)
{{member.id}}The new member's Discord ID
{{member.username}}Their Discord username
{{member.displayName}}Their nickname in this server, or username if none
{{member.name}}Their username (alias for member.username)
{{member.joinedAt}}When they joined (ISO timestamp)
{{member.avatar}}Their avatar — server avatar if they set one
📐Under the hood — triggers under the hood
TypeScript
// A Trigger is just a Discord event listener — Kitcord registers these for you:
client.on("guildMemberAdd", async (member) => {
  const user  = member.user;   // → {{input.user.*}}
  const guild = member.guild;  // → {{input.guild.id}}
  // your flow runs here
});

client.on("messageCreate", async (message) => {
  if (message.author.bot) return; // filters: { ignoreBots: true }
  const content = message.content; // → {{message.content}}
  // your flow runs here
});

// Kitcord reads events[] from your Kit and calls client.on() for each one.

🔔All Event Types

Click any event to see its full documentation — available sparks, filters, and TypeScript equivalent.

🟢
Bot is ready
clientReady

Fires once when the bot successfully connects to the Discord gateway.

{{id}}{{name}}+2
👋
Member joins
guildMemberAdd

Fires when a new member joins any server the bot is in.

{{id}}{{name}}+8
👋
Member leaves
guildMemberRemove

Fires when a member leaves or is kicked from the server.

{{id}}{{name}}+7
🔨
Member banned
guildBanAdd

Fires when a member is banned from a server.

{{id}}{{name}}+5
🔓
Member unbanned
guildBanRemove

Fires when a member is unbanned.

{{id}}{{name}}+4
💬
Message sent
messageCreate

Fires when a message is sent in a channel the bot can see.

{{id}}{{name}}+18
🗑️
Message deleted
messageDelete

Fires when a message is deleted.

{{id}}{{name}}+8
✏️
Message edited
messageUpdate

Fires when a message is edited.

{{id}}{{name}}+16
😀
Reaction added
reactionAdd

Fires when someone adds a reaction to a message.

{{id}}{{name}}+6
😶
Reaction removed
reactionRemove

Fires when someone removes a reaction from a message.

{{id}}{{name}}+6
🎙️
Voice state changes
voiceStateUpdate

Fires when a member joins, leaves, or moves voice channels.

{{id}}{{name}}+6
⚡
Interaction received
interactionCreate

Fires when a Discord interaction is received (slash commands use Spells instead).

{{id}}{{name}}+6
🔘
Button pressed
componentClick

Fires when someone presses a button your bot sent. Match it to the button's custom id. Works in Interaction Only mode.

{{id}}{{name}}+8
🔽
Dropdown chosen
selectChoose

Fires when someone picks from a dropdown your bot sent. What they picked arrives as {{component.value}}. Works in Interaction Only mode.

{{id}}{{name}}+10
🪟
Form submitted
modalSubmit

Fires when someone submits a pop-up form. Each answer arrives as {{form.values.<field custom id>}}. Works in Interaction Only mode.

{{id}}{{name}}+7

🔧Filters

Some events support filters that narrow when the trigger fires.

💬
Message sent
messageCreate
Trigger
Filters
ignoreBots
true
Sparks in this flow
{{input.guild.id}}Your Discord server's unique ID
{{input.guild.name}}Your server's name
{{input.guild.memberCount}}How many members are in the server
{{input.guild.icon}}Your server's icon image (empty if it has none)
{{message.id}}The message's unique ID
{{message.content}}The full text of the message
{{message.channelId}}ID of the channel the message was sent in
{{message.author.id}}Discord ID of who sent the message
{{message.author.username}}Sender's Discord username
{{message.author.displayName}}Sender's display name (or username if they have none)
{{message.author.name}}Sender's username (alias for message.author.username)
{{channel.id}}ID of the channel (same as message.channelId)
{{channel.name}}Name of the channel
{{message.image}}First image on the message — attachment, embed image or sticker
{{message.images}}Every image on the message, as a list
{{message.imageCount}}How many images the message carries
{{message.attachments}}Every file attached to the message (images or not)
{{message.author.avatar}}Avatar of whoever sent the message
{{message.url}}Link that jumps straight to the message
{{message.replyTo}}ID of the message this one replies to (empty if it isn't a reply)
💡ignoreBots on messageCreate

Always turn on ignoreBots for messageCreate flows. Without it, your bot reacts to its own messages and can loop indefinitely.

🔀Multiple Triggers, One Flow

You can point multiple triggers at the same flow — useful for shared logic like logging both member joins and leaves to the same Vault table. Make sure both events provide the sparks your flow needs.