AppBot Documentation

What is AppBot?

AppBot is a comprehensive Discord application and recruitment automation system that streamlines the entire process from application submission to staff review and member onboarding.

๐Ÿ“

Custom Applications

Build forms with up to 50 questions or use quick 5-field ticket modals.

โšก

Workflow Automation

Automate role assignments, nickname changes, and message delivery.

๐Ÿ“Š

Analytics & Tracking

Comprehensive statistics with charts and staff performance metrics.

๐Ÿ”—

Integrations

Steam profiles, Google Sheets, Discord OAuth, and more.

๐ŸŽฏ Who is AppBot for?

  • Gaming Communities: Recruit guild or clan members with Steam verification.
  • Discord Servers: Staff applications, member screening, role requests.
  • Organizations: Event registration, volunteer applications, surveys.
  • Content Creators: Moderator applications, collaboration requests.

โš ๏ธ Important: Bot Hierarchy

Most โ€œbot not workingโ€ issues are caused by role hierarchy.

In Discord Server Settings โ†’ Roles, move the AppBot role above every role it manages.

Application Workflow

Understanding the complete lifecycle of an application from start to finish.

1

User Initiates Application

User clicks a button or selects from a dropdown in a channel you've configured. The bot performs permission checks (roles, cooldowns, membership duration).

2

Application Mode Determined

DM Mode: Bot sends questions via direct message (up to 50 questions)

Ticket/Modal Mode: Popup form with 5 fields opens in-server

3

On Submit Actions Execute

Configurable actions run immediately: role assignments, nickname changes, channel messages, thread creation, and optional scheduled tasks.

4

Staff Review

Application appears in log channel as a thread (or regular message). Staff can Accept, Deny, or Open Ticket for further discussion. Optional voting system allows multiple staff to vote before auto-decision.

5

Accept/Deny Actions Execute

Staff selects from preset profiles (e.g., "Trial Member", "Full Member"). The bot executes the corresponding role changes, messages, and optional scheduled actions.

6

Data Storage & Export

Application data is stored and can be exported to CSV or synced to Google Sheets (Premium). Statistics update in real-time for analytics dashboard.

๐Ÿ”„ State System

AppBot maintains a session state for each application. This allows users to leave and return to their application without losing progress. DM applications can be resumed if the user's DM is reopened.

App Start Configuration

Control how users discover and initiate applications in your Discord server.

๐Ÿ“‹ Overview

The App Start section is where you design the entry point for your applications. Users will see a message in a designated channel with buttons or a dropdown menu to begin their application. You can group multiple applications together to keep your server organized and user-friendly.

overview

Application Grouping

Applications can be grouped together so multiple related applications share a single start message. This keeps your channels clean and makes it easier for users to find what they need.

๐Ÿ’ก How to Group Applications

In the left panel, drag and drop one application onto another to group them together (up to 10 applications per group). Grouped applications will share the same start message, channel, and color coding.

Benefits of Grouping:

  • Single message contains multiple application options
  • Shared color coding for visual consistency
  • Cleaner channel organization
  • Option to use "All in one" log channel for the entire group

Start Message Configuration

Each application group has a customizable start message that appears in Discord. This message is what users interact with to begin an application.

Message Components:

  • # Channel: Select which channel the start message appears in. This is where users will find and click the application buttons.
  • Color Indicator: Click the colored circle to choose a color. This color appears as a border on the message and helps identify the application group in your dashboard.
  • Message Text: Write your instructions or description. Supports Discord markdown formatting like **bold text**.
  • Image: Click the image icon to add a visual banner to your start message. Images make your applications more attractive and professional.

Buttons vs Dropdown Menu

Users interact with applications through either individual buttons or a dropdown menu. You can switch between these modes using the cog icon (โš™๏ธ) next to the buttons.

Button Mode (Default):

  • Each application displays as its own button
  • Users click directly on the application they want
  • Best for 2-5 applications in a group
  • Buttons can have custom labels, colors, and emojis
  • Button styles: Primary, Secondary, Success, Danger

Dropdown Mode:

  • All applications appear in a single select menu
  • More compact layout for 5+ applications
  • Users select from the dropdown to begin
  • Better for servers with many application types

โš™๏ธ Advanced Button Settings

Click the cog icon next to your buttons to access advanced options where you can:

  • Toggle between Button and Dropdown modes
  • Edit button labels (the text displayed on each button)
  • Change button styles and colors
  • Add custom emojis to buttons

Sending the Message to Discord

After configuring your start message, use the arrow button (โ†’) on the right side to send it to Discord.

How It Works:

  • If this is the first time sending, the bot creates a new message in the selected channel
  • If the message already exists, the bot updates it with your changes
  • If the previous message was deleted, a new one is created
  • The message will show a loading indicator while being sent

โš ๏ธ Important

Users won't see your changes until you click the send button. Think of this as a "publish" action that makes your configuration live in Discord.

Log Channels Configuration

Log channels are where application submissions are sent for staff review. You have flexible options for organizing these logs.

Group Log Channel (For groups with 2+ applications):

When you have multiple applications grouped together, you can enable "All in the same" mode. This sends all applications from the group to a single log channel, keeping everything organized in one place.

  • Toggle "All in the same" to enable group logging
  • Select a channel from the dropdown
  • When enabled, individual log channels are dimmed/disabled
  • All applications in the group will post to this shared channel

Individual Log Channels:

Each application can have its own dedicated log channel. This is useful when different staff teams handle different application types.

  • Select a channel for each application in the list
  • Applications show their name next to the channel selector
  • Each log channel can have its own ping settings

Thread Ping Notifications

When an application is submitted, it creates a thread in your log channel. You can configure which roles get pinged (mentioned) in that thread.

How Thread Pings Work:

  • Click the + button next to "Ping" to add roles
  • Selected roles will be mentioned when a new application arrives
  • Pinged users will see the thread appear in their channel list
  • By default, threads are "hidden" unless you're pinged or manually open them
  • Multiple roles can be added for each application
  • Click the X on a role to remove it from pings

โš ๏ธ Discord Limitation

Roles with more than 100 members cannot be pinged in threads due to Discord's restrictions. If you have a large staff team, consider creating smaller role groups or using channels instead of threads.

๐Ÿ’ก Pro Tip: Silent Notifications

Mute the log channel in your server settings but keep the role pings enabled. This way, threads will become visible for pinged staff members without making a sound effect. Perfect for reducing notification fatigue while keeping staff informed.

Visual Customization

Message Text Formatting:

Your start message supports Discord markdown:

  • **bold text** for emphasis
  • *italic text* for subtle highlights
  • __underlined__ for underlining
  • `code` for inline code

Adding Images:

Click the image placeholder to open the image upload modal where you can:

  • Upload an image from your computer
  • Enter an image URL
  • Preview how it will look
  • Remove the image by clicking the X

Color Coding:

The color you choose appears as a border on your start message in Discord and helps you quickly identify different application groups in the dashboard. Click the colored circle to open a color picker.

Common Setup Examples

Example 1: Staff Applications

Setup: Single application, dedicated log channel, ping @moderators role
Best for: Servers recruiting staff members

Example 2: Multiple Departments

Setup: Group 3-5 department applications, use dropdown menu, shared log channel with different pings per department
Best for: Large communities with multiple teams (Support, Events, Moderation)

Example 3: Guild Recruitment

Setup: Two applications (Main roster + Trial), button mode with custom styling, separate log channels for each tier
Best for: Gaming guilds with multiple membership levels

๐Ÿ”ง Troubleshooting

  • Message not appearing: Check that you selected a channel and clicked the send button
  • Buttons not working: Ensure the bot has permission to send messages in that channel
  • Pings not working: Verify the role has fewer than 100 members and the bot has permission to mention roles
  • Can't see threads: Make sure pinged roles are added, or users manually open the thread

Application Types: DM vs Modal Ticket

AppBot offers two distinct application methods: DM Applications (conversational, one-at-a-time questions) and Modal Tickets (instant form submission). Each serves different use cases and user experiences.

overview

๐Ÿ“‹ Quick Comparison

FeatureDM ApplicationModal Ticket
FormatConversational (one question at a time)Form-based (all fields at once)
LocationBot DMsPop-up modal in server
Question LimitUnlimited5 fields maximum
Buttons/SelectionsYes (buttons & dropdowns)No (text input only)
Media SupportImages, videos, embedsText only
Best ForDetailed applications, screeningQuick tickets, support forms

๐Ÿ—จ๏ธ DM Applications (Conversational)

How It Works

When a user clicks an application button, the bot initiates a private conversation in their DMs. Questions are presented one at a time, allowing for a guided, conversational experience with rich media support.

User Experience Flow:

  1. User clicks application button in server
  2. Bot sends first question via DM
  3. User answers (text, file upload, or button selection)
  4. Bot validates answer and sends next question
  5. Process repeats until all questions answered
  6. Application submits to staff channel/thread

Configuration

DM applications use the Questions section in your dashboard where you build your question flow.

Question Features:

  • Text Questions: Open-ended responses up to 1,920 characters
  • Buttons: Single or multiple choice selections
    • Up to 5 buttons per question (or use dropdown for 6-25 options)
    • Emoji support for visual clarity
  • Media Embeds: Add images, thumbnails, or videos to questions
  • File Uploads: Users can attach documents, images, or other files
  • Validation:
    • Number-only responses
    • Media-required responses
    • Custom regex patterns (Premium)

Example: A gaming clan application might ask:

  1. "What's your in-game name?" (text)
  2. "Which role are you applying for?" (dropdown: Tank, DPS, Support, Healer)
  3. "Link your Steam Profile URL" (validated URL)
  4. "Upload a screenshot of your stats" (media required)
  5. "How many hours per week can you commit?" (number only)

Special Question Types

Steam Profile Question

The bot automatically detects questions titled "Link your Steam Profile URL" and provides special validation and helper UI.

  • Validates Steam profile URLs (profiles/[ID] or id/[username])
  • Checks if profile is public (required for data retrieval)
  • Displays Steam branding and help button
  • Stores Steam ID separately for integration features

Button Questions

When a question includes buttons:

  • User must click a button (text responses rejected)
  • Single-select (1-5 buttons) or multi-select (6-25 dropdown options)
  • Selected values trigger automation actions (if configured)
  • Multi-select questions can set min/max selection requirements

Rate Limiting & Validation

DM applications include built-in protections:

  • Character Limit: 1,920 characters per response (Discord embed limit)
  • File Support: Accepts images, videos, documents (.txt, .pdf, .doc, .docx, etc.)
  • Empty Responses: Blocked (must contain text or file)

๐Ÿ’ก Tip: Users can type /cancel at any time to abort their application.

๐Ÿ“ Modal Tickets (Form Submission)

How It Works

When a user clicks a ticket button, Discord opens a pop-up modal form directly in the server. All fields appear at once, allowing instant submission without DM exchanges.

User Experience Flow:

  1. User clicks ticket button in server
  2. Modal form pops up instantly (no DM required)
  3. User fills out all fields in the form
  4. User clicks "Submit" button
  5. Ticket creates thread/channel immediately

โšก Speed Advantage: Modal tickets submit in seconds compared to minutes for DM applications.

Configuration

Modal tickets are configured in the Ticket Settings section, separate from DM application questions.

Modal Settings:

  • Modal Title: Main heading of the form (max 45 characters)
    • Supports placeholders: {user}, {server}, {button_label}
  • Fields (1-5): Each field configures:
    • Label: Field title (max 45 chars, supports placeholders)
    • Input Type: Short (single line) or Paragraph (multi-line)
    • Required: Whether field must be filled
    • Default Text: Pre-filled value (supports placeholders)
    • Placeholder: Hint text when field is empty
    • Max Length: Character limit (4,000 max for paragraph, 100 for short)

Example: A support ticket modal:

Title: "Support Request"
Field 1: "Issue Category" (Short, Required)
Field 2: "Describe your problem" (Paragraph, Required, Max: 500)
Field 3: "Error message (if any)" (Paragraph, Optional)
Field 4: "Username affected" (Short, Required, Default: {user_tag})
Field 5: "Priority level" (Short, Required, Placeholder: "Low/Medium/High")

Field Types & Limits

Short Input Fields

  • Single-line text box
  • 100 character maximum
  • Best for: names, usernames, short selections

Paragraph Input Fields

  • Multi-line text area with scrolling
  • 4,000 character maximum (configurable)
  • Resizable by user
  • Best for: detailed explanations, descriptions, problems

โš ๏ธ Modal Limitations

  • Maximum 5 fields per modal (Discord API restriction)
  • Text input only - no buttons, dropdowns, or media
  • Cannot validate answers before submission
  • User cannot save progress (submit or lose data)

Placeholder Support

Modal titles, field labels, default text, and placeholders all support dynamic placeholders. This allows personalized forms based on context.

Example: Title: "Welcome {user_name} - {button_label} Form"
Result: "Welcome John#1234 - VIP Application Form"

See the Variables Reference section for all available placeholders.

Required vs Optional Fields

Fields can be marked as required or optional. Required fields show a red asterisk (*) and prevent submission if left empty.

  • Required: User cannot submit without filling this field
  • Optional: Field can be left blank

๐Ÿ’ก Best Practice: Keep required fields to essential information only. Too many required fields reduces completion rates.

๐ŸŽฏ Which Type Should You Use?

Use DM Applications When:

  • You need detailed screening with 6+ questions
  • You need buttons/dropdowns for multiple choice questions
  • You want rich media (images, videos) in questions
  • You require file uploads from applicants
  • You want validation before next question (regex, number-only, etc.)
  • You're running formal applications (staff, partnerships, creator programs)
  • You want to integrate Steam profiles or Discord OAuth

Best for: Staff applications, partnership requests, content creator programs, detailed verification systems, gaming clan recruitment.

Use Modal Tickets When:

  • You need quick submissions (under 1 minute)
  • You have 5 or fewer simple questions
  • You want users to see all questions upfront
  • You're creating support/help tickets
  • You want instant response without DM delays
  • You only need text-based answers
  • You want to avoid DM privacy issues
  • You're running high-volume systems (bug reports, feedback forms)

Best for: Support tickets, bug reports, feedback forms, quick registrations, simple inquiries, event sign-ups.

๐Ÿ“Š Decision Matrix

Your NeedRecommended Type
6+ questionsDM Application
1-5 simple questionsModal Ticket
Multiple choice questionsDM Application
File uploads neededDM Application
Instant submission priorityModal Ticket
Answer validation neededDM Application
High submission volumeModal Ticket
Rich media in questionsDM Application

๐Ÿ”ง Troubleshooting

DM Application Issues

โŒ User says bot isn't responding to answers

  • Cause: User has DMs disabled or blocked the bot
  • Solution: User must enable DMs in Server Privacy Settings
  • Prevention: Add instructions to application button description

โŒ Bot rejects text answers saying "Must select a button"

  • Cause: Current question has buttons configured
  • Solution: User must click one of the provided buttons
  • Fix: Remove buttons from question if text answers needed

โŒ Steam question keeps rejecting valid URLs

  • Cause: Profile is set to private
  • Solution: User must temporarily set Steam profile to public
  • Alternative: Use different validation method (text question with regex)

โŒ Users complain about spam detection

  • Cause: Answering faster than 1.5 second rate limit
  • Solution: This is intentional to prevent abuse
  • Context: Rate limit prevents bots and encourages thoughtful answers

โŒ Application stuck - bot won't send next question

  • Check: Is the current question validating correctly?
  • Check: Is the question text configured properly?
  • Solution: User can type /cancel and restart
  • Admin Fix: Check dashboard question configuration for errors

Modal Ticket Issues

โŒ Modal won't open when button clicked

  • Cause: Ticket has 0 fields configured
  • Solution: Add at least 1 field in Ticket Settings
  • User Message: "Modal has no fields"

โŒ Placeholders showing as literal text (e.g., "user_name")

  • Cause: Placeholder syntax error or unsupported variable
  • Solution: Check spelling and use exact syntax from Variables Reference
  • Test: Submit test ticket to verify placeholder processing

โŒ Can't add 6th field to modal

  • Cause: Discord API limits modals to 5 fields
  • Solution: Use DM Application type instead
  • Alternative: Combine related fields or make some fields optional

โŒ Character counter showing negative numbers

  • Cause: Default text or placeholder exceeds max length
  • Solution: Reduce default text length or increase max length
  • Visual: Counter turns red when over limit

โŒ Users accidentally closing modal and losing data

  • Issue: Discord modals don't save progress
  • Prevention: Keep fields simple and quick to fill
  • User Tip: Draft answers in notepad first for complex tickets

โœ… Best Practices

DM Application Best Practices

  • Question Order: Start with easy questions, save complex ones for later (builds commitment)
  • Button Labels: Keep under 20 characters for mobile readability
  • Media Questions: Add context images to reduce confusion
  • Progress Indication: Use question numbering: "Question 3 of 8"
  • Steam Questions: Always place before lengthy questions (fails fast if invalid)
  • Validation: Use number/media requirements only when truly necessary
  • Regex (Premium): Test thoroughly - bad regex breaks applications
  • Multi-Select: Use dropdowns for 6+ options to save vertical space

Modal Ticket Best Practices

  • Field Count: Use 3-5 fields for optimal completion rate
  • Required Fields: Only mark truly essential fields as required
  • Field Order: Most important information first
  • Max Lengths: Set reasonable limits (200-500 for descriptions, 50-100 for short fields)
  • Default Text: Pre-fill user context when possible (name, email, etc.)
  • Placeholders: Use placeholder text to show expected format
  • Labels: Keep under 40 chars - truncation at 45 breaks formatting
  • Testing: Submit test tickets to verify all placeholders process correctly

Universal Best Practices

  • Clear Instructions: Tell users what format you expect
  • Mobile Testing: Test on both desktop and mobile - modals look different
  • Privacy Notice: Inform users their data goes to staff (especially for DMs)
  • Automation: Set up accept/deny actions to save staff time
  • Analytics: Monitor completion rates - redesign if <50% complete
  • Feedback Loop: Ask staff what information they actually need

๐Ÿ”„ Switching Between Types

Converting DM Application to Modal Ticket

If your DM application has become too long or users drop off, consider converting to a modal ticket:

  1. Identify your 5 most critical questions
  2. Remove media, buttons, and validation requirements
  3. Simplify question wording for quick reading
  4. Create new ticket configuration with these 5 questions
  5. Update your application button to trigger ticket instead
  6. Move detailed screening to post-submission (staff interview)

โš ๏ธ Data Loss Warning

Switching types does NOT convert existing configurations. You must manually recreate questions in the new format. Old applications remain intact in their original format.

Converting Modal Ticket to DM Application

If your modal feels limiting or you need more complex screening:

  1. List all current ticket fields
  2. Identify where you need buttons, validation, or media
  3. Create DM application questions in dashboard
  4. Add button options for multiple choice fields
  5. Add validation rules (number-only, regex, etc.)
  6. Include welcome/outro messages for better UX
  7. Update button to trigger DM application
  8. Test thoroughly before announcing switch

๐Ÿ’ก Pro Tip: You can run both types simultaneously for different purposes (e.g., quick support tickets + detailed staff applications).

๐Ÿ’ก Real-World Examples

Example 1: Gaming Community Staff Application (DM)

Purpose: Detailed screening for moderator positions

  1. Q1: "What position are you applying for?" (Buttons: Moderator, Admin, Developer, Support)
  2. Q2: "What's your Discord username?" (Text - auto-filled with {user_tag})
  3. Q3: "How old are you?" (Number validation)
  4. Q4: "Link your Steam Profile URL" (Steam validation)
  5. Q5: "Which time zones are you available?" (Multi-select dropdown: EST, PST, GMT, etc.)
  6. Q6: "How many hours per week can you dedicate?" (Number validation)
  7. Q7: "Why do you want to be staff?" (Long text response)
  8. Q8: "Do you have prior moderation experience?" (Buttons: Yes, No)
  9. Q9: "If yes, describe your experience" (Conditional - appears only if Q8 = Yes)
  10. Q10: "Upload a screenshot of your Discord settings showing 2FA enabled" (Media required)

Why DM: 10 questions with validation, buttons, and file uploads. Too complex for modal.

Example 2: Bug Report Ticket (Modal)

Purpose: Quick bug submissions from users

Title: "Bug Report - {user_name}"
Field 1 (Short, Required): "Bug Title"
Field 2 (Paragraph, Required): "What happened?" (Max: 500)
Field 3 (Paragraph, Optional): "Steps to reproduce" (Max: 500)
Field 4 (Short, Required): "Platform" (Placeholder: "Windows/Mac/Mobile/Web")
Field 5 (Short, Optional): "Related command/feature" (Placeholder: "e.g., /ban command")

Why Modal: 5 simple fields, no validation needed, users want quick submission.

Example 3: Event Registration (Modal)

Purpose: Tournament sign-ups with team info

Title: "{button_label} Registration"
Field 1 (Short, Required): "Team Name"
Field 2 (Short, Required): "Team Captain Discord Tag" (Default: {user_tag})
Field 3 (Paragraph, Required): "Team Roster" (Placeholder: "List all 5 player names and roles")
Field 4 (Short, Required): "Average Team Rank" (Placeholder: "e.g., Diamond 2")
Field 5 (Short, Optional): "Additional Notes"

Why Modal: Time-sensitive registrations, all info visible upfront, 30-second completion.

Example 4: Content Creator Partnership (DM)

Purpose: Vetting YouTubers/Streamers for partnerships

  1. Q1: "What type of content creator are you?" (Buttons: YouTuber, Twitch Streamer, TikToker, Instagram, Other)
  2. Q2: "What's your channel/profile URL?" (Text with URL validation)
  3. Q3: "How many subscribers/followers do you have?" (Number validation)
  4. Q4: "What's your average view count?" (Number validation)
  5. Q5: "What content niche?" (Dropdown: Gaming, Tech, Lifestyle, Education, etc.)
  6. Q6: "Upload your media kit or analytics screenshot" (Media required)
  7. Q7: "Why do you want to partner with us?" (Long text)
  8. Q8: "What can you offer our community?" (Long text)

Why DM: Requires validation, media uploads, and detailed screening. High-value partnerships need thorough vetting.

Example 5: Support Ticket (Modal)

Purpose: General help requests

Title: "Support Request"
Field 1 (Short, Required): "Category" (Placeholder: "Account/Billing/Technical/Other")
Field 2 (Short, Required): "Subject" (Max: 100)
Field 3 (Paragraph, Required): "Describe your issue" (Max: 1000)
Field 4 (Short, Optional): "Error code (if applicable)"
Field 5 (Short, Required): "Priority" (Placeholder: "Low/Medium/High/Urgent")

Why Modal: Users need immediate help, all fields viewable at once, staff can categorize quickly.

๐Ÿ”— Integration with Other Features

Works with Both Types

  • Actions & Automation: Submit/Accept/Deny actions trigger for both DM apps and tickets
  • Google Sheets: Both types sync answers to your spreadsheet
  • Variables: All placeholders work in both (tickets have more in-modal support)
  • Statistics: Analytics track both types separately
  • Welcome Messages: Custom thank-you messages after submission
  • Staff Channels: Both create threads/channels in designated staff areas

DM Application Exclusive Features

  • Discord OAuth: Verify user's Discord servers/connections
  • Steam Integration: Auto-fetch Steam data (hours played, games owned, etc.)
  • Question Buttons: Interactive button selections with custom IDs
  • Conditional Questions: Show/hide questions based on previous answers
  • Media Embeds: Images, videos, thumbnails in questions
  • File Attachments: Users upload documents, screenshots, etc.
  • Answer Validation: Number-only, media-required, regex patterns
  • Multi-Select Dropdowns: Choose multiple options from 6-25 choices

Modal Ticket Exclusive Features

  • In-Modal Placeholders: Dynamic titles and labels visible before submission
  • Default Text: Pre-filled values with placeholder support
  • Field Placeholders: Hint text inside empty fields
  • Instant Submission: No DM required, works even with DMs disabled
  • Anonymous Operation: Staff see submission without needing DM access

๐ŸŽ“ Advanced Configuration

DM Application Advanced Techniques

Multi-Path Applications

Create different question flows based on button selections:

Q1: "What role?" (Buttons: Developer, Designer, Manager)
Q2: "Years of experience?" (Number)
Q3a: If Developer selected โ†’ "Primary programming language?" (Text)
Q3b: If Designer selected โ†’ "Portfolio URL?" (Text)
Q3c: If Manager selected โ†’ "Team size managed?" (Number)

๐Ÿ’ก Use button custom_id in automation actions to trigger different workflows.

Progressive Screening

Start easy, get harder to filter out low-effort applicants:

  1. Simple questions (name, age, timezone)
  2. Medium difficulty (experience, availability)
  3. Complex questions (essays, scenarios, examples)
  4. Time-consuming tasks (file uploads, external links)

Users who answer all questions demonstrate genuine interest.

Steam Integration Workflow

Q1: "Link your Steam Profile URL"
โ†’ Bot fetches hours played, VAC bans, account age
Q2: "Do you have 100+ hours in [Game]?" (Bot already knows, honesty test)
Q3: Based on Steam data โ†’ Accept/Deny automatically

Regex Validation Examples (Premium)

  • Email: ^[\w\.-]+@[\w\.-]+\.\w+$
  • Phone (US): ^\d{3}-\d{3}-\d{4}$
  • YouTube URL: ^(https?://)?(www\.)?(youtube\.com|youtu\.be)/.+$
  • Discord Tag: ^.+#\d{4}$

Modal Ticket Advanced Techniques

Context-Aware Forms

Use placeholders to create dynamic forms based on button label:

Button 1: "Report Player"
Button 2: "Report Bug"
Button 3: "Report Server Issue"

Modal Title: "{button_label} Form"
โ†’ Opens as "Report Player Form", "Report Bug Form", or "Report Server Issue Form"

Field 1 Label: "{button_label} Details"
โ†’ Shows as "Report Player Details", "Report Bug Details", etc.

Pre-Filled User Data

Reduce user effort by auto-filling known information:

Field: "Your Discord Tag"
Default Text: {user_tag}
โ†’ Pre-fills "Username#1234" (user can edit if needed)

Field: "Your User ID"
Default Text: {user_id}
โ†’ Pre-fills "123456789012345678"

Character Limit Strategy

Use limits to encourage concise, actionable responses:

  • 50 chars: Short identifiers (usernames, codes)
  • 100 chars: Brief descriptions, titles
  • 200 chars: Tweet-length explanations
  • 500 chars: Detailed but focused responses
  • 1000+ chars: Comprehensive explanations

๐Ÿ’ก Lower limits = faster completion, higher quality. Don't default to 4000 unless necessary.

Placeholder as Instructions

Field Label: "Bug Description"
Placeholder: "1. What you did 2. What happened 3. What should happen"
โ†’ Guides users to structured responses without extra text

๐Ÿ“Š Performance & Analytics

Tracking Completion Rates

Monitor your application's effectiveness in the Statistics dashboard:

  • Started: Users who clicked button and received first question/modal
  • Submitted: Users who completed all questions
  • Completion Rate: Submitted รท Started ร— 100%

Good Completion Rate Benchmarks

  • DM Applications: 60-80% (varies by length and complexity)
  • Modal Tickets: 85-95% (quick forms = high completion)

โš ๏ธ Low completion rates (<50%) indicate: Too many questions, confusing wording, overly strict validation, or poor question order.

A/B Testing Your Applications

Test different configurations to find what works best:

Test Variables:

  • Question Count: 5 vs 10 vs 15 questions
  • Question Order: Easy-first vs important-first
  • Validation: Strict vs lenient requirements
  • Button Labels: "Submit" vs "Apply Now" vs "Send Application"
  • Media Usage: With vs without images in questions
  • Welcome Message: Formal vs casual tone

Example Test: Create two identical apps, one with 8 questions and one with 12. Run both for a week. Compare completion rates and time-to-submit. Keep the winner.

Time-to-Submit Metrics

Track how long applications take:

  • DM Applications: Typically 5-15 minutes for thorough responses
  • Modal Tickets: Typically 30 seconds to 2 minutes

๐Ÿ’ก If DM apps take 20+ minutes on average, consider: (1) reducing questions, (2) simplifying wording, or (3) switching to modal for non-critical fields.

Drop-Off Point Analysis

Find where users quit your DM application:

  1. Check database for status: 'started' applications
  2. Count how many answers each abandoned app has
  3. Identify the question where most users quit
  4. Options to fix:
    • Simplify that question's wording
    • Remove validation if too strict
    • Move question later in flow
    • Replace with multiple simpler questions

โ“ Frequently Asked Questions

Q: Can I have both DM applications AND modal tickets in the same server?

A: Yes! Each "app" in your dashboard can be either type independently. You might have "Staff Application" (DM) and "Bug Report" (Modal) running simultaneously.

Q: Can users edit their answers after submission?

A: No. Once submitted, applications are locked. Users must contact staff to request changes or resubmit a new application. This prevents abuse and maintains audit trails.

Q: What happens if a user's DMs are closed?

A: DM applications will fail to start. The bot sends an error message in the server channel. Users must enable DMs in Server Settings โ†’ Privacy Settings โ†’ Allow Direct Messages.

Q: Can I convert existing DM applications to use modals?

A: You can change the configuration, but existing in-progress applications continue in their original format. New submissions will use the updated format.

Q: Do modal tickets work on mobile?

A: Yes! Discord's modals are fully mobile-responsive. However, long-form typing is harder on mobile, so keep fields concise for mobile users.

Q: Can I require file uploads in modal tickets?

A: No. Modals only support text input. If you need file uploads, use DM applications with the "media required" validation option.

Q: How do I see which type an app is using?

A: In the dashboard, check if "Ticket Settings" is enabled for that app. If enabled with fields, it's a modal ticket. If disabled, it's a DM application using the Questions section.

Q: Can I use buttons in modal tickets?

A: No. Discord's modal API only supports text input (short and paragraph). For button-based selections, use DM applications.

Q: What's the character limit for modal fields?

A: Short fields: 100 characters (fixed). Paragraph fields: 4,000 characters maximum (configurable). You can set custom max lengths for paragraphs (e.g., 500 chars).

Q: Can I add more than 5 fields to a modal?

A: No. This is a Discord API limitation. If you need 6+ fields, use DM applications which have no question limit.

Q: Do placeholders work in DM application questions?

A: Yes! Both DM questions and modal fields support all placeholders. The difference is modals process them when the form opens, while DM apps process them when each question is sent.

Q: Can I make some modal fields optional?

A: Yes! Uncheck "Required" for any field. Users can leave optional fields blank.

Q: How do I prevent spam applications?

A: For DM apps, the bot has built-in rate limiting (1.5s between answers). For modals, use role requirements in the App Start settings to limit who can submit.

Q: Can users save their progress in DM applications?

A: Yes! If a user stops answering, their progress is saved. They can resume later by sending another message to the bot. Progress expires after the application is submitted or cancelled.

Q: Can I see how long each application took to complete?

A: Yes! Check the timeStarted and submission timestamp in Google Sheets or the Statistics dashboard. Calculate the difference to see completion time.

๐Ÿ“ Summary

When to Use Each Type

โœ… Use DM Applications For:

  • Detailed screening (6+ questions)
  • Multiple choice questions (buttons/dropdowns)
  • File uploads and media
  • Answer validation (number, regex, media-required)
  • Steam or Discord OAuth integration
  • Complex workflows with conditional logic
  • Staff applications, partnerships, formal recruitment

โœ… Use Modal Tickets For:

  • Quick submissions (1-5 simple questions)
  • Text-only responses
  • Instant turnaround time
  • High-volume systems
  • Support tickets, bug reports
  • Event registrations, feedback forms
  • Users with DMs disabled

Both types integrate with all AppBot features (automation, Google Sheets, statistics, etc.). Choose based on your specific needs, or run both types for different purposes in the same server.

Application Buttons & Selection Options

Transform your DM applications from open-ended text into structured, multiple-choice experiences. Buttons and dropdowns guide applicants through predefined options, making answers consistent and easier to process.

overview

๐Ÿ“‹ Button System Overview

Add interactive buttons or dropdown menus to any question in your DM application. The system automatically:

  • Uses buttons (1-5 options) for quick, visible choices
  • Switches to dropdown menus (6-25 options) for longer lists
  • Supports single-select (choose one) or multi-select (choose multiple)
  • Enforces selection (users cannot send text when buttons are present)
  • Stores selected values for automation triggers

๐Ÿ”˜ Button Basics

When Buttons Appear

Add buttons to any question in your DM application (buttons are not available in modal tickets - text only). When a question has buttons configured, users must click a button - text responses are rejected.

Example Question with Buttons:

What role are you applying for?

๐Ÿ’ก User Experience: If user tries typing an answer, bot replies:"Must select a button"

Button Configuration

Each button has the following properties:

Label

The text displayed on the button (e.g., "Moderator", "Tank", "Yes")

  • Maximum 80 characters (Discord limitation)
  • Keep under 20 characters for mobile readability
  • Cannot be empty

Style

Visual appearance (color) of the button:

  • Primary (Blurple) - Default Discord blue
  • Secondary (Gray) - Neutral option
  • Success (Green) - Positive/confirm actions
  • Danger (Red) - Negative/warning actions
  • Link (Blue) - Opens external URL (special use)

Emoji (Optional)

Icon displayed before the button label

  • Supports Unicode emojis: ๐ŸŽฎ ๐Ÿ›ก๏ธ โš”๏ธ ๐Ÿ† โœ…
  • Supports custom server emojis (if bot has access)
  • Makes buttons more visually appealing and scannable
  • Recommended for all buttons to improve UX

Button Limits & Behavior

Automatic Format Selection

The bot automatically chooses the best display format based on button count:

  • 1-5 Buttons: Displayed as clickable buttons in a row
  • 6-25 Buttons: Displayed as a dropdown/select menu
  • 2-5 Buttons + Multi-Select Enabled: Forced to dropdown format

Example: A question with 8 role options automatically displays as a dropdown menu, even though you configured them as "buttons" in the dashboard.

โš ๏ธ Button Limitations

  • Maximum 25 options per question (Discord API limit)
  • Cannot mix buttons and text input on same question
  • Link-style buttons cannot be used for application answers (external URLs only)
  • Custom server emojis must be from a server the bot is in

๐ŸŽฏ Single-Select vs Multi-Select

Single-Select (Default)

User must choose exactly one option. This is the default behavior for all button questions.

Best For:

  • Role selection ("Which position?")
  • Yes/No questions
  • Exclusive choices ("Main class?")
  • Ranking preferences ("Priority level?")

Example: "What's your primary role?" - User clicks "Tank" and moves to next question.

Multi-Select (Advanced)

User can select multiple options from the list. Available when you enable "Multi-Select" on a question in the dashboard.

Multi-Select Configuration:

  • Enable Multi-Select: Toggle in question settings
  • Minimum Selections: Always 1 (at least one required)
  • Maximum Selections: Configurable (default = all options)
    • Set to 0 or equal to total options = no limit
    • Set specific number (e.g., "Pick your top 3")

Best For:

  • Availability windows ("Which days can you moderate?")
  • Skill selections ("Which languages do you know?")
  • Game preferences ("Which modes do you play?")
  • Multiple role applications ("Apply for multiple positions?")

Example: "Which time zones are you available in?" - User selects EST, PST, and GMT from dropdown, then clicks submit.

Technical Behavior:

When multi-select is enabled with 2-5 options, the bot automatically switches to dropdown format instead of buttons. This is because Discord's button API doesn't support multi-select - only dropdowns do.

๐Ÿ“Š Quick Comparison

FeatureSingle-SelectMulti-Select
User ActionClick one optionSelect 1+ options, then submit
Display (1-5 options)ButtonsDropdown (forced)
Display (6-25 options)DropdownDropdown
Answer StorageSingle valueComma-separated list
Best ForExclusive choicesMultiple valid answers

๐Ÿ“‹ Dropdown Menus

When Dropdowns Appear

Dropdowns (select menus) automatically replace buttons when you have 6 or more options, or when you enable multi-select on a question with 2-5 options.

Example Dropdown Question:

Which time zones are you available in?
Select 1-3 options
Select an option...โ–ผ
๐ŸŒ… EST - Eastern
๐ŸŒ„ CST - Central
๐ŸŒ‡ MST - Mountain
๐ŸŒ† PST - Pacific
๐ŸŒ GMT - London
๐Ÿ‡ช๐Ÿ‡บ CET - Central Europe
๐ŸŒ JST - Japan
๐Ÿฆ˜ AEST - Australia

Dropdown Advantages

  • Space Efficient: Handles 6-25 options without cluttering the interface
  • Organized: Users can scroll through options in a clean list
  • Searchable: Discord's dropdown allows typing to filter (desktop only)
  • Multi-Select: Only dropdowns support selecting multiple options
  • Mobile Friendly: Better than 25 buttons on small screens

Dropdown Configuration

Configure dropdowns the same way you configure buttons in the dashboard. The bot automatically switches to dropdown format based on count and settings.

Dropdown Triggers:

  • Automatic: 6-25 options configured โ†’ Displays as dropdown
  • Multi-Select: 2-5 options + multi-select enabled โ†’ Forced to dropdown

Technical Note: You always configure "buttons" in the dashboard. The bot's code makes the decision to render them as buttons vs dropdown based on the conditions above. This keeps the dashboard interface simple while optimizing user experience.

Dropdown Limitations

โš ๏ธ Important Restrictions

  • Maximum 25 options (Discord API hard limit)
  • Minimum 1 option must be selected (cannot skip)
  • No button styles in dropdowns (all options look identical)
  • Emojis still work and are highly recommended for visual distinction
  • Users must click a "Submit" confirmation after selecting (not instant like buttons)

๐Ÿ’ก Real-World Examples

Example 1: Staff Role Selection

Single-select buttons with clear hierarchy

Question: "What position are you applying for?"

Configuration:

  • Type: Single-select buttons (4 options)
  • Styles: Green for highest role, gray for entry level
  • Custom IDs: role_admin, role_moderator, role_support, role_trial
  • Automation: Auto-assign appropriate role channel access on accept

Example 2: Availability Multi-Select

Multi-select dropdown for scheduling

Question: "Which days can you moderate? (Select all that apply)"

Select options... (1-7)โ–ผ
๐Ÿ“… Monday
๐Ÿ“… Tuesday
๐Ÿ“… Wednesday
๐Ÿ“… Thursday
๐Ÿ“… Friday
๐Ÿ“… Saturday
๐Ÿ“… Sunday

Configuration:

  • Type: Multi-select dropdown (7 options)
  • Min Selections: 1 (must pick at least one day)
  • Max Selections: 7 (can select all days)
  • Custom IDs: day_mon, day_tue, etc.
  • Storage: Answer saved as comma-separated list: "Monday, Wednesday, Friday"

Example 3: Game Preference Selection

Large dropdown for many options

Question: "What's your main game?"

Select an option...โ–ผ
๐ŸŽฎ Valorant
๐Ÿ”ซ CS2
๐ŸŽฏ Overwatch 2
โš”๏ธ League of Legends
๐ŸŽฒ Dota 2
๐Ÿ‘พ Apex Legends
๐Ÿฐ Fortnite
๐Ÿงฑ Minecraft
... (17 more options)

Configuration:

  • Type: Single-select dropdown (25 games)
  • Why Dropdown: 25 buttons would be overwhelming
  • Custom IDs: game_valorant, game_cs2, etc.
  • Automation: Assign game-specific roles on accept

Example 4: Agreement/Terms Acceptance

Clear yes/no with visual distinction

Question: "Do you agree to follow all server rules and guidelines?"

Configuration:

  • Type: Single-select buttons (2 options)
  • Styles: Green for agree, red for decline
  • Custom IDs: agree_rules, decline_rules
  • Automation: If decline_rules โ†’ Auto-deny application

Example 5: Experience Level Assessment

Progression-based selection with color coding

Question: "How would you rate your moderation experience?"

Configuration:

  • Type: Single-select buttons (4 options)
  • Styles: Red โ†’ Gray โ†’ Blue โ†’ Green progression
  • Custom IDs: exp_beginner, exp_intermediate, exp_advanced, exp_expert
  • Automation: Different training paths based on experience level

Example 6: Skills Multi-Select

Pick top 3 skills from larger list

Question: "What are your top 3 skills? (Select exactly 3)"

Select 3 options...โ–ผ
๐Ÿ’ป Web Development
๐ŸŽจ Graphic Design
๐Ÿ“น Video Editing
๐ŸŽต Music Production
๐Ÿ“ Content Writing
๐ŸŽฎ Game Development
๐Ÿค Community Management
๐Ÿ“Š Data Analysis

Configuration:

  • Type: Multi-select dropdown (8 options)
  • Min Selections: 3
  • Max Selections: 3 (exactly 3 required)
  • Custom IDs: skill_webdev, skill_design, etc.
  • Use Case: Match applicants to project teams based on skills

Mobile Optimization

50%+ of Discord users are on mobile. Design for small screens:

  • Button Labels: Keep under 15 characters for mobile (20 max)
  • Emoji Usage: Essential on mobile - provides visual cues without reading
  • Dropdown Preference: 5+ options? Use dropdown - easier to scroll than tap tiny buttons
  • Test on Mobile: Join your server on phone, test every button question
  • Avoid Long Words: "Moderator" fits, "Senior Community Management Staff" doesn't

๐Ÿ”ง Troubleshooting

โŒ "Must select a button" error when I try to type

Cause: Question has buttons configured.

Solution: This is intentional behavior. When buttons are present, text input is disabled.

Fix: If you want text input, remove all buttons from that question in the dashboard.

โŒ Buttons aren't appearing - showing dropdown instead

Cause: You have 6+ options configured, OR multi-select is enabled.

Solution: This is automatic optimization. Dropdowns work better for 6+ options.

Fix: If you want buttons, reduce to 5 or fewer options AND disable multi-select.

โŒ Custom emojis not showing on buttons

Cause: Bot doesn't have access to the emoji's server.

Solution: Bot must be in the server that owns the custom emoji.

Fix: Use Unicode emojis (๐ŸŽฎ โš”๏ธ ๐Ÿ›ก๏ธ) or add bot to emoji server.

โŒ Button labels are truncated/cut off

Cause: Label exceeds 80 characters (Discord limit).

Solution: Shorten labels to under 20 characters for best display.

Fix: Edit button labels in dashboard - use emojis to convey meaning.

โŒ Can't add more than 25 buttons

Cause: Discord API hard limit (25 options per select menu).

Solution: This is a Discord limitation, not AppBot.

Fix: Split into multiple questions OR use text input with validation.

โŒ Multi-select not working - only allows one selection

Cause: Multi-select not enabled in dashboard.

Solution: Enable "Multi-Select" toggle in question settings.

Fix: Edit question โ†’ Enable Multi-Select โ†’ Set max selections.

Actions & Automation

Configure what happens automatically at each stage of the application lifecycle: submission, acceptance, and denial.

overview

๐Ÿ“‹ Overview

The Actions section controls automated workflows at three critical moments. Each stage can trigger role changes, nickname updates, messages, and more. While they share most features, there are important differences in timing and role assignment logic.

Understanding the Three Stages

โšก Quick Comparison

Featureโšช Submit๐ŸŸข Accept๐Ÿ”ด Deny
TriggerAutomaticManual (staff)Manual (staff)
Button RolesStored onlyโœ“ Appliedโœ— Ignored
Staff ModalNoYesYes
Thread CreationYesModifiesModifies
Default Icon๐Ÿ“‹โœ…โ›”

Stage-Specific Features

โšช Submit Stage (Automatic)

  • When: Immediately after user completes application
  • Purpose: Initial processing, mark as pending, create thread, notify staff
  • Unique Settings:
    • Private Thread toggle (adds applicant to private thread)
    • Disable Threads (post as regular message instead)
    • Disable Log Msg (suppress default accept/deny log messages)
    • Dynamic Ping (auto-mention staff based on applicant's button selections)
    • Thread message buttons for staff role selection
  • Role Behavior: Button-selected roles are stored but not applied yet

๐ŸŸข Accept Stage (Manual)

  • When: Staff clicks Accept button
  • Purpose: Grant full access, assign all privileges, welcome the member
  • Unique Settings:
    • Staff comment modal (required or optional internal note)
    • Custom DM field (staff can add personal message)
    • Role-specific messages (send different DMs per role selected)
  • Role Behavior: Button-selected roles are applied (from questions + thread messages + Steam)

๐Ÿ”ด Deny Stage (Manual)

  • When: Staff clicks Deny button
  • Purpose: Remove pending status, optionally inform applicant, close application
  • Unique Settings:
    • Staff comment modal (same as Accept)
    • Custom DM field (same as Accept)
  • Role Behavior: Button-selected roles are ignored completely

๐Ÿ’ก Key Insight: Role Assignment Logic

The critical difference is how button roles are handled:

Submit: User selects "Tank" button โ†’ Role ID stored in database
Accept: Final roles = Current - Removals + Additions + Button roles
Deny: Final roles = Current - Removals + Additions (Button roles never applied)

Submit-Only Settings

These configuration options only appear in the Submit stage:

Thread Behavior Toggles

โš ๏ธ Important: Default Log Messages

By default, the bot sends a system log message to your log channel whenever an application is accepted or denied. The toggles below control thread creation and whether those default messages appear.

Private Thread

  • Enabled: Creates a private thread. Only mentioned users and roles can access it. The applicant is automatically added.
  • Disabled: Creates a public thread. Inherits permissions from parent channel. Applicant must be pinged or manually join to see it.
  • Use case: Enable when you want the applicant involved in the review discussion
  • Tip: Combine with "Disable Log Msg" to use the start message channel as the log channel

Disable Threads

  • Enabled: Applications post as regular messages in the log channel instead of creating threads
  • Best for: Servers that hit Discord's active thread limits or prefer traditional workflows
  • Limitation: Thread-specific features like like edit Thread Name won't function

Disable Log Msg

  • Enabled: Suppresses the default system message when apps are accepted or denied
  • Use case: Cleaner workflows when you have custom channel messages configured
  • Advanced: With private threads + disabled logs, you can use the same channel for start messages and applications

Dynamic Staff Pings

Automatically mention staff roles in the thread based on which buttons the applicant selected during their application.

How It Works:

  • Enable "Dynamic Ping" toggle in Submit โ†’ Send Message settings
  • For each button in your application questions, assign a staff role to ping
  • When applicant selects a button, the corresponding staff role is mentioned in the thread
  • Multiple selections = multiple role pings
  • Pings appear in the custom thread message, not as separate notifications

Setup Example:

Question: "Which department are you applying for?"
Buttons: Engineering, Marketing, Support
Dynamic Ping Config:
โ€ข Engineering button โ†’ Pings @Engineering-Leads
โ€ข Marketing button โ†’ Pings @Marketing-Managers
โ€ข Support button โ†’ Pings @Support-Staff

Result: Applicant selects "Engineering" โ†’ Thread message includes "@Engineering-Leads New application!"

โš ๏ธ Discord Limitations

Roles with 100+ members cannot be mentioned in threads due to Discord API restrictions. For large staff teams, use smaller sub-roles or regular channel messages.

Thread Message Buttons (Staff Role Selection)

Add interactive buttons to the thread message that staff can click to select roles for the applicant.

Button Configuration:

  • Configure in Submit โ†’ Send Message โ†’ Add Buttons
  • Assign a role to each button
  • Staff click buttons during review to prepare role assignments
  • Roles are only applied on Accept, not immediately when clicked
  • Buttons toggle on/off (click again to deselect)
  • Current selections shown in an embed below the buttons

Button vs Question Buttons:

  • Question buttons: Applicant clicks during application
  • Thread message buttons: Staff clicks during review
  • Both types are stored and applied together on Accept
  • Both types are ignored on Deny

๐Ÿ’ก Thread Button Example

Scenario: Guild with flexible role assignment
Thread Buttons:
โ€ข "Main Roster" โ†’ @Main Member
โ€ข "Raider" โ†’ @Raider
โ€ข "Officer Track" โ†’ @Trainee Officer

Workflow:
1. Staff reviews application
2. Staff clicks "Main Roster" and "Raider"
3. Embed updates: "Current Roles: @Main Member @Raider"
4. Staff clicks Accept
5. Both roles are assigned to applicant

Permissions:

  • Only users with configured Staff Roles or Administrator can click role buttons
  • Non-staff see "Not enough permissions" error
  • Prevents applicants or other members from manipulating role assignments

Staff Comment Modal (Accept & Deny)

When staff click Accept or Deny, a popup modal appears with two text fields for comments and custom messages.

Internal Staff Log Comment

  • First field in the modal popup
  • Can be set as Required or Optional in dashboard
  • Posted as an embed in the application thread
  • Visible only to staff with thread access
  • Documents decision reasoning for record-keeping
  • Maximum 3000 characters

Customization Options:

  • Placeholder text: Gray hint text shown before staff types (e.g., "Explain your decision")
  • Default value: Pre-filled text that appears automatically (e.g., "Meets all requirements")
  • Required toggle: Force staff to enter a reason (Accept/Deny only, not Submit)

Direct Message to Applicant

  • Second field in the modal popup
  • Always optional (cannot be required)
  • Sent to applicant via DM along with your configured messages
  • Allows staff to add personal notes or specific instructions
  • Also posted in thread as an embed for transparency
  • Maximum 3000 characters

Customization Options:

  • Placeholder text: Guide staff on what to write (e.g., "Optional message to applicant")
  • Default value: Common messages like "Welcome aboard!" or "Feel free to reapply in 30 days"

๐Ÿ’ก Modal Best Practices

  • Accept placeholders: "Welcome message or next steps" encourages positive, actionable feedback
  • Deny placeholders: "Reason for denial (optional)" reminds staff to be professional
  • Default values: Save staff time on repetitive comments like "Approved - standard process"
  • Required comments: Use for accountability on important decisions

How Comments Appear

  • In Thread: Two separate embeds posted - one for internal comment (if provided), one for DM preview (if provided)
  • Accept embeds: Green color
  • Deny embeds: Red color
  • Author: Shows staff member's username and avatar
  • Visibility: Internal comments only visible to thread members; DM content also sent to applicant

Shared Actions (All Stages)

The following features are available in Submit, Accept, and Deny stages with identical functionality:

Add Role

Assign roles to the applicant when the stage executes.

Configuration:

  • Click the + button to open role selector
  • Choose from dropdown of available server roles
  • Multiple roles can be selected

Behavior by Stage:

  • Submit: Common to add @Pending or @Applicant role
  • Accept: Add @Member, @Recruit, or tier roles
  • Deny: Typically left empty, or add @Denied for tracking

โš ๏ธ Role Hierarchy Requirements

The #1 cause of "roles not working" issues:

  • Bot's role must be positioned above every role it manages
  • Check in Discord Server Settings โ†’ Roles
  • Drag the bot role higher in the list
  • Administrator-permission roles are automatically filtered out

Remove Role

Remove roles from the applicant when the stage executes.

Configuration:

  • Click the + button to open role selector
  • Choose which roles to remove
  • Executes simultaneously with "Add Role" for efficiency
  • Only removes roles the user actually has (safe to list roles they might not have)

Behavior by Stage:

  • Submit: Remove @Guest or @Unverified when applying
  • Accept: Remove @Pending, @Applicant, or @Trial
  • Deny: Remove @Pending, @Applicant

Edit Nickname

Change the applicant's server nickname to match your naming conventions.

Configuration:

  • Click the pfp icon to open nickname editor modal
  • Enter static text or use dynamic placeholders
  • Leave empty to keep current nickname
  • Maximum 32 characters (Discord limit)

Available Placeholders:

  • {username} โ†’ Discord username
  • {globalname} โ†’ Global display name
  • {nickname} โ†’ Current server nickname
  • {answer1}, {answer2} โ†’ Specific answers
  • {app_count} โ†’ Application counter number
  • {acceptor} โ†’ Staff name (Accept/Deny only)

Common Patterns:

  • Submit: [PENDING] {username}
  • Accept: [MEMBER] {username} or {answer1} | {username}
  • Deny: Usually left empty to preserve original nickname

๐Ÿ’ก Nickname Fallback Logic

Smart placeholder behavior when values are missing:

  • If {nickname} is empty, falls back to {username}
  • If {globalname} is empty, falls back to {username}
  • If your template includes multiple name placeholders and some are empty, only the first empty one gets the username fallback
  • Prevents blank nicknames from empty data

Edit Thread Name

Customize the name of the application thread to organize and identify applications easily.

Configuration:

  • Click the thread edit icon to open the modal
  • Enter static text or use dynamic placeholders
  • Maximum 100 characters (Discord limit)

Default Thread Names:

  • Submit: ๐Ÿ“‹ username (or ๐Ÿ“‹ ๐Ÿ‘คโ” if Hide Stats enabled)
  • Accept: โœ… username ๐Ÿ›‚ staffname
  • Deny: โ›” username ๐Ÿ›‚ staffname

Available Placeholders:

Same as Edit Nickname, plus:

  • {acceptor} โ†’ Staff member's name (Accept/Deny only)
  • All answer and question placeholders
  • Custom emojis can be copy-pasted from the modal's emoji picker

Advanced Customization:

The modal includes an "Advanced" section with conditional replacements based on answers or button selections:

For Button Questions:
  • Each button can have a custom replacement text
  • When that button is selected, use {rule1} to insert the custom text
  • Example: Tank button โ†’ replacement "TANK" โ†’ Thread name: {rule1} Application - {username} becomes "TANK Application - JohnDoe"
For Text Questions:
  • Match Text: Enter words or JavaScript regex to search for in the answer
  • Replace Text: Text to use when match is found
  • Use {rule1}, {rule2} etc. in your template to insert replacements
  • Example: If answer contains "yes" โ†’ replace with "APPROVED" โ†’ Thread name uses {rule1}

๐Ÿ’ก Thread Name Examples

Simple counter: App #{app_count} - {username}
Department-based: ๐Ÿ“‹ {answer1} | {username} (if answer1 is department)
Role indicator: {rule1} {username} (if rule1 = button selection like "TANK")
Accept with staff: โœ… {username} โ†’ {acceptor}
Status with counter: #{app_count} | {rule1} | {username}

โš ๏ธ Thread Name Timing

  • Submit thread name is set when thread is created
  • Accept/Deny thread names are applied when thread is archived
  • If thread is already archived, bot unarchives โ†’ renames โ†’ re-archives
  • Bot needs "Manage Threads" permission

Send Message

Post custom embeds with text, images, and optional buttons to the application thread or a different channel.

Message Builder Components:

  • Enable toggle: Turn message on/off without deleting configuration
  • Text field: Main message content, supports Discord markdown and placeholders
  • Picture URL: Large banner image (bottom of embed), must be direct image link
  • Thumbnail URL: Small corner image (top-right), must be direct image link
  • Channel selector: Defaults to thread, can send to any channel

Available Placeholders:

  • {user} โ†’ Mentions the applicant
  • {username}, {globalname}, {nickname} โ†’ Name variants
  • {thread} or {app_link} โ†’ Link to application
  • {acceptor} or {staffName} โ†’ Staff member (Accept/Deny)
  • {guildname} โ†’ Server name
  • {appname} โ†’ Application name
  • {app_button} โ†’ Start button label
  • {answer1}, {answer2} โ†’ Specific answers
  • {question1}, {question2} โ†’ Question text
  • {here} or @here โ†’ Pings @here
  • {<@&roleId>} โ†’ Pings specific role (e.g., {<@&123456789>})

Message Behavior:

  • Thread messages: Posted in the application thread
  • Channel messages: Select different channel to post elsewhere
  • Pings: User mentions, role mentions, and @here appear as content (not in embed) to trigger notifications
  • Videos/YouTube: Links post as separate message before the embed
  • Multiple messages: You can configure multiple Send Message actions per stage

โš ๏ธ Submit vs Accept/Deny Messages

  • Submit messages: Appear immediately when application is submitted
  • Accept/Deny messages: Appear when staff processes the application
  • Same configuration interface, but timing and available placeholders differ
  • {acceptor} placeholder only works in Accept/Deny, not Submit

Send Command

Execute a custom message in a specific channel, useful for cross-posting or triggering other bots.

Configuration:

  • Click the command icon (terminal symbol) to open settings
  • Enable toggle to activate
  • Select target channel from dropdown
  • Enter command or message text
  • Supports all placeholders (same as Send Message)

Use Cases:

  • Cross-posting: "New {username} application in {thread}" to #staff-notifications
  • Public announcements: "Welcome {user} to the team!" in #welcome (Accept only)
  • External logging: Post to channels monitored by other bots for analytics
  • Trigger workflows: Some bots respond to specific message patterns

Execution Timing:

  • Executes after role changes and DMs
  • Executes after "Send Message" actions
  • Multiple commands can be configured (though only one field in UI - use Send Message for multiple channels)

๐Ÿ’ก Command vs Message

Send Message: Creates rich embeds with images, colors, and formatting
Send Command: Simple text post to different channel, better for cross-posting

Both support the same placeholders and can target different channels.

Schedules (Premium)

Delay execution of actions to occur after a specified number of hours.

Configuration:

  • Click the timer icon to open schedule settings
  • Enter hours until execution (e.g., 24, 48, 168)
  • Configure which actions should be scheduled
  • Scheduled actions: role additions, role removals, messages
  • Requires active premium subscription

Schedule Behavior by Stage:

  • If applicant leaves server before execution, schedule is cancelled
  • Submit schedule: Executes X hours after submission
  • Accept schedule: Executes X hours after acceptance, overwrites Submit schedule if present
  • Deny schedule: Executes X hours after denial, overwrites Submit schedule if present

Common Use Cases:

  • Trial periods: Submit adds @Trial, schedule removes @Trial and adds @Full Member after 168 hours (7 days)
  • Temporary access: Accept adds @Event Access, schedule removes it after 48 hours
  • Delayed onboarding: Accept schedules "Welcome to advanced training!" DM 24 hours later
  • Reminder messages: Submit schedules "Your application is still pending" after 72 hours

โš ๏ธ Schedule Requirements & Limitations

  • Requires active premium subscription (free tier ignores schedules)
  • Minimum 1 hour delay
  • Maximum ~8760 hours (1 year) recommended
  • Accept/Deny schedules overwrite Submit schedules
  • If user leaves server, schedule is automatically cancelled
  • Schedule execution cannot be manually cancelled (yet)

Forum Tags

Automatically add or remove tags when your log channel is a Forum channel.

Configuration:

  • Click the tag icon to open tag manager
  • Only functional when log channel type is "Forum"
  • Grayed out when log channel is not a forum
  • Add up to 5 tags total per thread (Discord limit)
  • Select tags to add and/or remove

Tag Behavior:

  • Add tags: Appends new tags to existing ones
  • Remove tags: Removes specified tags from thread
  • Combination: Can add and remove in same operation (e.g., remove "Pending", add "Approved")
  • Limit: Discord enforces 5 tags maximum per thread
  • Timing: Tags update when thread is renamed and archived (Accept/Deny), or when created (Submit)

Common Tag Workflows:

  • Submit: Add "Pending", "New", department tag
  • Accept: Remove "Pending", add "Accepted", "Active"
  • Deny: Remove "Pending", add "Denied", "Closed"
  • Department tracking: Add department/role tags based on selection
  • Priority: Add "Urgent", "Standard", "Low Priority" tags

๐Ÿ’ก Forum Channel Advantages

Using a Forum channel as your log channel provides:

  • Tag-based filtering and organization
  • Each application is a separate "post" with metadata
  • Better visual organization than text channels with threads
  • Built-in sorting and filtering by tags
  • Cleaner for high-volume applications
  • Users can subscribe to specific tag notifications

โš ๏ธ Forum Tag Limitations

  • Only works when log channel is type "Forum" (not regular text channel)
  • Maximum 5 tags per thread (Discord limit)
  • Tags must exist in the forum channel before you can assign them
  • Create tags in Discord first, then they'll appear in the dashboard selector

Accept-Only Features

These features are exclusive to the Accept stage and don't appear in Submit or Deny:

Role-Specific Messages

Send custom DMs or channel messages based on which roles the applicant selected via buttons during their application.

How It Works:

  • Located in the "Custom Role Message" section at bottom of Accept settings
  • Lists all roles that have been assigned to buttons in your application questions
  • Click on the available role button to configure its custom message
  • Each role can have unique text, embeds, images, and channel destinations
  • Messages send in addition to standard Accept messages

Message Configuration:

  • Enable toggle: Turn role message on/off
  • DM or Channel: Send to applicant's DM or post in a channel
  • Text field: Custom message text with placeholder support
  • Picture/Thumbnail: Add role-specific images
  • Channel selector: Choose channel for role announcements

Use Cases:

  • Role-specific onboarding: Tank role โ†’ "Read tanking guide at [link]"
  • Department welcome: Engineering role โ†’ "Join #engineering-onboarding"
  • Team assignments: Raid Team A โ†’ "Your raid schedule is Tuesday/Thursday 8pm"
  • Conditional instructions: Officer role โ†’ "Review officer guidelines in #officer-info"

๐Ÿ’ก Role Message Example

Application Question: "Which roles interest you?" (Multi-select buttons)
Buttons: Tank, Healer, DPS, Crafter
Applicant Selects: Tank + Crafter

On Accept, applicant receives:
1. Standard Accept message ("Congratulations!")
2. Tank role message ("Welcome Tank! Join #tank-training")
3. Crafter role message ("Crafters meet in #crafting-hub every Sunday")

Result: Personalized onboarding based on their selections

Message Delivery Order:

  1. Staff modal comment (internal log)
  2. Staff modal DM field (if provided)
  3. Standard Accept DM (if configured)
  4. Role-specific DMs (one per role selected)
  5. Channel messages (standard + role-specific)

โš ๏ธ Role Message Requirements

  • Only appears if your application has buttons with assigned roles
  • Only sends for roles the applicant actually selected
  • Won't appear in Deny (button roles are never assigned on deny)
  • If applicant has DMs disabled, role DMs fail silently
  • Channel messages post regardless of DM status

Button Role Assignment

This is not a separate feature but a critical behavior unique to Accept:

Role Calculation on Accept:

  1. Start with applicant's current roles
  2. Remove roles from "Remove Role" list
  3. Add roles from "Add Role" list
  4. Add roles from question buttons (applicant's selections)
  5. Add roles from thread message buttons (staff's selections)
  6. Add Steam-verified roles (if Steam integration enabled)
  7. Remove duplicates
  8. Filter out admin-permission roles
  9. Apply all changes in single operation

Why This Matters:

  • Accept is the only stage where button roles are actually assigned
  • Submit stores the selections but doesn't apply them
  • Deny completely ignores button selections
  • This ensures denied applicants never receive privilege-granting roles

Complete Workflow Examples

Example 1: Simple Staff Recruitment

Submit Configuration:

  • Add Role: @Applicant
  • Remove Role: @Member
  • Thread Name: ๐Ÿ“‹ Staff App - {username}
  • Send Message: "Thank you for applying! Staff will review your application soon."

Accept Configuration:

  • Add Role: @Staff
  • Remove Role: @Applicant
  • Nickname: [STAFF] {username}
  • Thread Name: โœ… {username} โ†’ {acceptor}
  • Send Message (DM): "Congratulations! Welcome to the staff team. Please read #staff-guide for your responsibilities."
  • Send Command (#announcements): "Please welcome our newest staff member, {user}! ๐ŸŽ‰"

Deny Configuration:

  • Remove Role: @Applicant
  • Thread Name: โ›” {username}
  • Send Message (DM): "Thank you for your interest in our staff team. While we cannot offer you a position at this time, we encourage you to remain active in the community and reapply in the future."

Example 2: Guild Recruitment with Trial Period

Submit Configuration:

  • Add Role: @Applicant
  • Remove Role: @Guest
  • Private Thread: Enabled
  • Thread Name: ๐Ÿ†• {answer1} - {username} (if answer1 is class/role)
  • Send Message: Buttons for staff to select additional roles (Main Roster, Alt Roster, Social)
  • Dynamic Ping: Enabled (pings recruitment officers based on class selection)

Accept Configuration:

  • Add Role: @Trial Member
  • Remove Role: @Applicant
  • Nickname: [TRIAL] {username}
  • Thread Name: โœ… Trial - {username}
  • Send Message (DM): "Welcome to the guild! Your trial period is 7 days. Join #trial-info for guidelines and schedules."
  • Send Command (#guild-chat): "Welcome {user} as a trial member! Help them feel at home ๐Ÿ "
  • Schedule (168 hours): Remove @Trial Member, Add @Full Member, Send DM "Congratulations on completing your trial! You're now a full member."
  • Role Messages:
    • Main Roster role โ†’ "You're on our main roster! Raids are Monday/Wednesday 8pm"
    • Alt Roster role โ†’ "You're on alt roster. We'll call you for fill-ins!"

Deny Configuration:

  • Remove Role: @Applicant
  • Thread Name: โ›” {username}
  • Send Message (DM): "Thank you for your application. We're currently at capacity for {answer1} players, but we encourage you to reapply in 30 days."

Example 3: Multi-Department Company

Submit Configuration:

  • Add Role: @Applicant
  • Thread Name: ๐Ÿ“‹ {answer1} - {username} (answer1 is department)
  • Send Message: "Your application has been received. Department leads have been notified."
  • Dynamic Ping: Enabled
    • Engineering button โ†’ @Engineering-Leads
    • Marketing button โ†’ @Marketing-Managers
    • Support button โ†’ @Support-Directors
  • Thread Buttons: "Schedule Interview", "Request Additional Info", "Fast Track"

Accept Configuration:

  • Add Role: @Employee
  • Remove Role: @Applicant
  • Button roles assigned automatically (Engineering, Marketing, Support - from questions)
  • Thread Name: โœ… {rule1} - {username} (rule1 = department abbreviation)
  • Send Message (DM): "Congratulations! Welcome to the team. Your onboarding coordinator will contact you within 24 hours."
  • Send Command (#team-announcements): "Please welcome {user} to the {answer1} team! ๐ŸŽŠ"
  • Role Messages:
    • Engineering โ†’ DM: "Join #engineering-onboarding and complete the setup guide" + Channel message in #engineering
    • Marketing โ†’ DM: "Your first project brief is in #marketing-projects" + Channel message in #marketing
    • Support โ†’ DM: "Training starts Monday in #support-training" + Channel message in #support

Deny Configuration:

  • Remove Role: @Applicant
  • Thread Name: โ›” {username} - {answer1}
  • Send Message (DM): "Thank you for your interest in {answer1}. We'll keep your information on file for future openings."

๐Ÿ”ง Troubleshooting Actions

Role Issues:

  • Roles not adding/removing: Check Server Settings โ†’ Roles. Bot role must be above managed roles.
  • Button roles not assigned: Only happens on Accept, never on Deny or Submit
  • "Could not edit member": Bot lacks "Manage Roles" permission or role hierarchy issue
  • Some roles work, others don't: Check individual role positions in hierarchy

Message Issues:

  • DM not received: User has DMs disabled (fails silently, no error)
  • Channel message not posting: Bot needs "Send Messages" permission in target channel
  • Placeholders not replacing: Check spelling and format exactly as shown (case-sensitive)
  • Pings not working: Roles with 100+ members can't be pinged in threads

Thread Issues:

  • Thread not created: Bot needs "Create Public/Private Threads" permission
  • Thread won't rename: Bot needs "Manage Threads" permission
  • Private thread doesn't add user: This is automatic, check if private thread toggle is enabled
  • "Maximum threads reached": Archive old threads to make room

Schedule Issues:

  • Schedule not executing: Premium subscription required and must be active
  • Schedule disappeared: User left server (schedules auto-cancel)
  • Wrong timing: Hours are calculated from action time, not real-world time zones

Forum Tag Issues:

  • Tags not applying: Only works in Forum channels, not regular text channels
  • Tag option grayed out: Log channel is not type "Forum"
  • Tags not showing: Create tags in Discord forum channel first
  • Too many tags error: Discord limit is 5 tags per thread

Permission Errors:

  • "Not enough permissions": Staff needs configured Staff Roles or Administrator
  • "Application already processed": Someone else already accepted/denied
  • "Cannot fetch member": User left the server

Permissions & Requirements

Control who can apply for applications and who can manage them. Set role requirements, cooldowns, and membership duration criteria to ensure only eligible users can submit applications.

overview

๐Ÿ“‹ Overview

The Permissions section is divided into two categories: Staff permissions (who can manage applications) and Applicant requirements (who can apply). These restrictions are checked before users can interact with the application system.

Staff Permissions

Define which roles have permission to manage applications. These settings control access to administrative actions like accepting, denying, and viewing applications.

Staff Roles

Assign roles that can perform staff actions on applications.

What Staff Can Do:

  • Accept applications
  • Deny applications
  • Send direct messages to applicants
  • Open tickets for discussion
  • Click thread message buttons to select roles
  • View application threads and answers

Configuration:

  • Click the + button to add staff roles
  • Select multiple roles from the dropdown
  • Click X on a role badge to remove it
  • If no roles are added, only Administrator permission users can manage applications
  • Users with Administrator permission always have staff access, regardless of role list

โš ๏ธ Important: Empty Staff Roles

If you leave the Staff Roles list empty:

  • Only users with Administrator or Manage Server permissions can manage applications
  • Regular members with other roles will see "Not enough permissions" errors
  • This is a security feature to prevent unauthorized access

Enable/Disable Application Roles

Assign roles that can toggle applications on or off using the /info command.

What This Controls:

  • Users with these roles can use /info to see application status
  • They can enable or disable specific applications temporarily
  • Useful for staff who manage recruitment without needing full staff permissions
  • Does not grant access to Accept/Deny actions

Configuration:

  • Click the + button to add roles
  • Multiple roles can be selected
  • Separate from Staff Roles (can overlap if needed)
  • If empty, only Administrators can toggle applications

๐Ÿ’ก Use Case Example

Scenario: Recruitment team manages when applications open/close
Setup: Add @Recruitment-Lead to "Enable/Disable" roles
Result: Recruitment leads can turn applications on/off for events without needing full staff permissions

Applicant Requirements

Set criteria that users must meet before they can start an application. The bot checks these requirements when a user clicks the start button and blocks access if criteria aren't met.

Required Roles to Apply

Users must have specific roles to access the application.

Configuration:

  • Click the + button to add required roles
  • Multiple roles can be added
  • Toggle between "any" or "all" mode when 2+ roles are selected
  • If empty, no role requirements (anyone can apply)

Any vs All Mode:

  • Any mode (default): User needs at least ONE of the listed roles
  • All mode: User must have EVERY listed role
  • Mode toggle only appears when 2 or more roles are added
  • Click the "any"/"all" button to switch modes

Example Scenarios:

Scenario 1 - Department Applications:
Required Roles: @Engineering, @Marketing, @Support (ANY mode)
Result: Members of any department can apply

Scenario 2 - Senior Staff:
Required Roles: @Staff, @Verified (ALL mode)
Result: Only verified staff members can apply

Scenario 3 - Open Recruitment:
Required Roles: (empty)
Result: Anyone can apply

โš ๏ธ Role Requirement Logic

The bot checks requirements in this order:

  1. Check if user has required roles (if any configured)
  2. Check if user has prevented roles (blocks access if they do)
  3. Check membership time requirement
  4. Check cooldown period
  5. Only if all checks pass can user start the application

Prevent Roles from Applying

Block users with specific roles from accessing the application.

Configuration:

  • Click the + button to add blocked roles
  • Multiple roles can be added
  • Toggle between "any" or "all" mode when 2+ roles are selected
  • If empty, no roles are blocked

Any vs All Mode:

  • Any mode (default): User is blocked if they have ANY of the listed roles
  • All mode: User is only blocked if they have ALL listed roles
  • Mode toggle appears when 2 or more roles are added

Common Use Cases:

  • Existing members: Prevent @Member role from applying (for new member recruitment)
  • Banned users: Prevent @Blacklisted from re-applying
  • Recent denials: Prevent @Recently-Denied role (set by Deny action)
  • Backlog control: Prevent @Max-Apps-Reached to limit spam (Premium feature)

๐Ÿ’ก Combining Required and Prevent Roles

Setup:
Required Roles: @Verified (must have)
Prevent Roles: @Banned, @Staff (must not have)

Result:
Only verified non-staff members who aren't banned can apply

Required Membership Time

Set a minimum server membership duration before users can apply.

Configuration:

  • Toggle to enable/disable the requirement
  • Set days (0-999)
  • Set hours (0-23)
  • Both fields are additive (e.g., 7 days + 12 hours = 7.5 days total)
  • Bot calculates from user's join date to current time

How It Works:

  • When user clicks start button, bot checks their Discord join timestamp
  • Calculates elapsed time since joining the server
  • If elapsed time is less than required, user sees error message
  • Error message tells them how much longer they must wait

Example Requirements:

  • New server protection: 7 days + 0 hours (prevent brand new accounts)
  • Observation period: 30 days (ensure active participation first)
  • Quick screening: 0 days + 12 hours (basic delay)
  • Long-term members only: 90 days (veteran applications)

โš ๏ธ Membership Time Calculation

  • Time is calculated from user's server join date, not Discord account creation
  • If user left and rejoined, timer resets to most recent join
  • Bot cannot see join dates older than its own invite date (limitation)
  • Hours field maxes at 23 - use days for longer periods

Re-Application Cooldown

Prevent users from submitting the same application repeatedly within a short time period.

Configuration:

  • Toggle to enable/disable cooldown
  • Set days (0-999)
  • Set hours (0-23)
  • Minimum cooldown: 15 minutes (0 days + 0 hours defaults to 15 minutes)
  • Cooldown starts from most recent submission time, not acceptance/denial

How It Works:

  • When user submits an application, timestamp is recorded
  • If user tries to start same application again before cooldown expires, access is blocked
  • Error message tells them how much time remains
  • Cooldown is per-application (user can apply to different applications)
  • Cooldown persists even if previous application was accepted/denied

Cooldown Behavior:

  • Started but not submitted: No cooldown triggered
  • Submitted (pending): Cooldown starts
  • Accepted: Cooldown remains active
  • Denied: Cooldown remains active
  • Multiple submissions: Cooldown resets each time user submits

Common Cooldown Periods:

  • Quick retry: 1 day (for low-stakes applications)
  • Standard: 7 days (balanced approach)
  • Long cooldown: 30 days (high-stakes positions)
  • Seasonal: 90 days (quarterly recruitment cycles)

๐Ÿ’ก Cooldown Strategy

Consider your application volume when setting cooldowns:

  • High volume servers: Shorter cooldowns (1-3 days) allow quick corrections
  • Selective recruitment: Longer cooldowns (30+ days) reduce spam
  • Trial periods: Match cooldown to trial duration (e.g., 7-day trial = 7-day cooldown)

Max Applications Role Assignment (Premium)

Automatically assign a role to users after they submit a specific number of pending applications.

โš ๏ธ Premium Feature

This feature requires an active premium subscription. It only appears when re-application cooldown is enabled.

How It Works:

  • Tracks how many times a user has submitted this specific application
  • When user reaches the configured submission number (e.g., 2nd, 3rd, 5th), bot assigns role(s)
  • Only counts submitted (pending) applications - accepted and denied apps don't count
  • Role persists until manually removed
  • Typically used with "Prevent Roles" to stop users from applying repeatedly

Configuration:

  • Appears below cooldown settings when cooldown is enabled
  • Set "Submission No." (minimum 2, defaults to 2)
  • Click + to add role(s) to assign
  • Multiple roles can be added
  • Common pattern: Create a @Max-Apps-Reached role and add it to "Prevent Roles"

Example Workflow:

Goal: Prevent users from submitting more than 2 pending applications

Setup:
1. Create role: @Too-Many-Apps
2. Enable re-application cooldown (any duration)
3. Set "Submission No." to 2
4. Add @Too-Many-Apps to the role list
5. In "Prevent Roles", add @Too-Many-Apps

Result:
โ€ข User submits 1st app โ†’ Pending, no role assigned
โ€ข User submits 2nd app โ†’ Pending, @Too-Many-Apps assigned
โ€ข User tries 3rd app โ†’ Blocked by "Prevent Roles"
โ€ข Staff accepts/denies user's apps โ†’ User can apply again (manually remove @Too-Many-Apps or use Deny action to remove it)

Counter Behavior:

  • Counts: Only submitted applications in "pending" status
  • Doesn't count: Started but not submitted, accepted apps, denied apps
  • Resets: Never automatically resets (manual intervention required)
  • Per-application: Counter is specific to each application type

๐Ÿ’ก Backlog Management Strategy

This feature is designed to reduce application backlog:

  • Set submission limit to 2-3 for active recruitment periods
  • Add the assigned role to Deny โ†’ Remove Role (auto-cleanup when denied)
  • Add the assigned role to Accept โ†’ Remove Role (auto-cleanup when accepted)
  • This creates a self-managing system where processed apps free up user's slots

โš ๏ธ Important Notes

  • Role assignment happens on submission, not on Accept/Deny
  • If you want to reset a user's counter, you must manually remove their role
  • Counter doesn't automatically decrease when apps are accepted/denied
  • Use Deny โ†’ Remove Role to automatically clean up the role
  • Minimum submission number is 2 (cannot set to 1)

Permission Check Flow

Understanding the order of checks helps you design effective permission systems.

When User Clicks Start Button:

  1. Required Roles Check: Does user have required role(s)? (If configured)
    • ANY mode: User must have at least one role
    • ALL mode: User must have every role
    • If fails: "You need [role name] to apply"
  2. Prevent Roles Check: Does user have blocked role(s)? (If configured)
    • ANY mode: User blocked if they have any role
    • ALL mode: User blocked only if they have all roles
    • If fails: "You cannot apply with [role name]"
  3. Membership Time Check: Has user been member long enough? (If enabled)
    • Calculates days + hours since server join
    • If fails: "You must be a member for [X] more time"
  4. Cooldown Check: Has enough time passed since last submission? (If enabled)
    • Checks timestamp of most recent submission
    • If fails: "You can apply again in [X] time"
  5. DM Access Check: Can bot send DMs to user? (For non-ticket applications)
    • If fails: "Please enable DMs from server members"

When Staff Tries to Accept/Deny:

  1. Staff Role Check: Does user have staff role or Administrator permission?
    • If fails: "Not enough permissions"
  2. Application Status Check: Is application still pending?
    • If fails: "Application already processed"
  3. Member Fetch Check: Is applicant still in server?
    • If fails: "User left guild"

๐Ÿ’ก Designing Permission Systems

Effective permission design balances security with accessibility:

  • Layer requirements: Start with role requirements, add cooldowns later
  • Test as non-admin: Use an alt account to verify permission checks work
  • Clear error messages: Bot tells users exactly why they're blocked
  • Document requirements: Mention role/time requirements in your start message

Common Permission Configurations

Example 1: Open Recruitment

Goal: Anyone can apply, but with spam protection
Setup:
โ€ข Required Roles: (empty)
โ€ข Prevent Roles: (empty)
โ€ข Membership Time: 1 day
โ€ข Cooldown: 3 days
Best for: Growing servers, public recruitment

Example 2: Member Progression

Goal: Only verified members can apply for advanced roles
Setup:
โ€ข Required Roles: @Verified (must have)
โ€ข Prevent Roles: @Staff (already staff can't apply)
โ€ข Membership Time: 30 days
โ€ข Cooldown: 14 days
Best for: Staff applications, leadership roles

Example 3: Controlled Recruitment

Goal: Limit applications to reduce backlog
Setup:
โ€ข Required Roles: @Eligible (manually assigned)
โ€ข Prevent Roles: @Too-Many-Apps
โ€ข Membership Time: 7 days
โ€ข Cooldown: 7 days
โ€ข Max Apps (Premium): 2 submissions โ†’ add @Too-Many-Apps
Best for: High-volume servers, selective recruitment

Example 4: Department Applications

Goal: Current employees can apply for department transfers
Setup:
โ€ข Required Roles: @Employee (must have)
โ€ข Prevent Roles: @Engineering, @Marketing, @Support (ANY mode - can't apply if already in a department)
โ€ข Membership Time: (disabled)
โ€ข Cooldown: 30 days (prevent frequent transfers)
Best for: Internal transfers, department changes

๐Ÿ”ง Troubleshooting Permissions

Common Issues:

  • "You need [role] to apply" but user has the role:
    • Check if using ALL mode with multiple required roles
    • User must have ALL roles, not just one
    • Switch to ANY mode if they only need one
  • "You cannot apply with [role]" unexpectedly:
    • Check Prevent Roles list for that role
    • Check if using ALL vs ANY mode
    • Remove the role from Prevent list if needed
  • Cooldown still blocking after time passed:
    • Cooldown calculates from submission time, not accept/deny time
    • Check actual submission timestamp in database
    • Ensure you set days/hours correctly (hours max is 23)
  • Staff can't accept/deny:
    • Add their role to Staff Roles list
    • Or give them Administrator permission
    • Empty staff role list requires Administrator
  • Membership time always fails:
    • Bot calculates from server join date
    • If user left and rejoined, timer reset
    • Bot can't see joins before it was invited
  • Max apps role not assigning:
    • Feature requires premium subscription
    • Only counts submitted (pending) apps
    • Accepted/denied apps don't count toward limit
    • Counter never automatically resets

Discord Integration

Verify applicants using Discord OAuth2 to check linked accounts and server memberships. These checks occur before the application starts and require user authorization.

overview

๐Ÿ“‹ Overview

Discord Integration uses OAuth2 authentication to access applicant data that isn't normally visible to bots. When enabled, applicants are redirected to Discord's authorization page before starting their application. This allows the bot to verify linked accounts and server memberships.

โš ๏ธ OAuth2 Authorization Required

When either Discord Integration option is enabled:

  • Applicants see Discord's authorization prompt when clicking the start button
  • They must grant permission to view their connections and guilds
  • Authorization is secure and handled entirely by Discord
  • Bot never sees or stores passwords
  • Users can revoke access anytime in Discord โ†’ User Settings โ†’ Authorized Apps

Linked Accounts Verification

Check which external platforms the applicant has linked to their Discord account.

What Gets Checked

When enabled, the bot can see all platforms linked to the applicant's Discord account, including:

  • YouTube: Linked YouTube channels
  • Twitch: Twitch accounts
  • Reddit: Reddit usernames
  • Twitter/X: Twitter accounts
  • Steam: Steam profiles
  • Spotify: Spotify accounts
  • Xbox: Xbox gamertags
  • PlayStation: PSN IDs
  • And any other platforms Discord supports

How It Works

  1. User clicks application start button
  2. Bot redirects to Discord OAuth2 authorization page
  3. User grants "View your connections" permission
  4. Bot retrieves list of linked platforms
  5. Application begins normally

Special Behavior: Steam Comparison

If the applicant has Steam linked to Discord AND your application includes a Steam profile question:

  • Bot automatically compares the linked Steam account against the Steam URL answer
  • If they don't match, applicant may be flagged for verification
  • Helps detect fake Steam profiles or incorrect submissions
  • Appears in application data for staff review

๐Ÿ’ก Use Cases for Linked Accounts

  • Content creator recruitment: Verify YouTube/Twitch channels exist
  • Gaming communities: Confirm Steam/Xbox/PSN accounts
  • Social verification: Check if applicant has established online presence
  • Platform requirements: Require specific platform links (e.g., must have Twitch linked)

Configuration

  • Toggle "Linked Accounts" to enable/disable
  • When enabled, applicants must authorize OAuth2
  • Linked accounts data is stored with application for staff review
  • No additional setup required beyond enabling the toggle

โš ๏ธ Privacy Considerations

  • Bot can only see platforms the user has publicly linked in Discord settings
  • Hidden or private connections won't be visible
  • Bot doesn't gain access to these platforms - only sees that they're linked
  • Applicants can unlink accounts before applying to hide them

Discord Server Membership Verification

Check if the applicant is a member of specific Discord servers before allowing them to apply.

What Gets Checked

When enabled, the bot verifies if the applicant is a member of any servers you specify. This is useful for:

  • Cross-server requirements (e.g., must be in partner server)
  • Verification servers (e.g., must be verified elsewhere first)
  • Network requirements (e.g., gaming network with multiple servers)
  • Alliance requirements (e.g., must be in allied guild)

How It Works

  1. You add server IDs to the list (explained below)
  2. User clicks application start button
  3. Bot redirects to Discord OAuth2 authorization page
  4. User grants "View your servers" permission
  5. Bot checks if user is member of ANY of the listed servers
  6. If user is in at least one listed server, application proceeds
  7. If user is in none of the listed servers, application is blocked

Adding Server IDs

Method 1: Manual Entry

  1. Click the "+ Server ID" button to add a new field
  2. Enter the Discord server ID (18-19 digit number)
  3. Optionally add a note/label in the second field (for your reference)
  4. Click X to remove a server from the list
  5. Add as many servers as needed

Method 2: Quick Select (if available)

  • If the dropdown appears, it shows servers where the bot is also present
  • Click a server name from the list to auto-fill its ID
  • Use the search box to filter servers by name
  • Much faster than manually copying IDs

Getting Server IDs

To manually find a Discord server ID:

  1. Open Discord (desktop or browser, not mobile)
  2. Click your profile picture โ†’ User Settings (โš™๏ธ gear icon)
  3. Go to "Advanced" tab
  4. Enable "Developer Mode"
  5. Close settings
  6. Right-click on any server icon in your server list
  7. Click "Copy Server ID" at the bottom of the menu
  8. Paste the ID into the dashboard field

๐Ÿ’ก How to Get Server IDs

Step 1: Discord โ†’ User Settings โš™๏ธ โ†’ Advanced โ†’ Enable "Developer Mode"
Step 2: Right-click any server icon โ†’ "Copy Server ID"
Step 3: Paste ID into dashboard

Configuration Options

  • Toggle: Enable/disable server verification
  • Server IDs: List of servers to check (accepts multiple)
  • Optional Notes: Add labels like "Partner Server" or "Verification Hub" for your reference
  • Search: Filter your server list when you have many entries

Verification Logic

  • ANY match: User must be in at least ONE of the listed servers (not all)
  • No "ALL" mode: Cannot require membership in multiple servers simultaneously
  • Empty list: If no servers are added, this check is skipped even if toggle is enabled
  • Private servers: Bot can verify membership even if user left or server is private

Example Use Cases

Example 1: Partner Server Requirement

Scenario: Only accept applications from members of partner communities
Setup:
โ€ข Enable "Discord Servers"
โ€ข Add 3-5 partner server IDs
โ€ข Add notes: "Partner 1", "Partner 2", etc.
Result: Applicants must be in at least one partner server

Example 2: Verification Server

Scenario: Require users to verify identity in external verification server first
Setup:
โ€ข Enable "Discord Servers"
โ€ข Add verification server ID
โ€ข Note: "Must be verified here first"
Result: Users must join and verify in verification server before applying

Example 3: Gaming Network

Scenario: Multi-server gaming network, any network member can apply
Setup:
โ€ข Enable "Discord Servers"
โ€ข Add all network server IDs (Main, EU, NA, Asia)
Result: Members from any regional server can apply

โš ๏ธ Important Limitations

  • Bot doesn't need to be in those servers: Can verify membership in any public or private server
  • User must authorize: If user declines OAuth2, they cannot proceed with application
  • Only checks membership: Doesn't check roles, permissions, or activity in those servers
  • No verification threshold: Cannot require "X days membership" in external servers
  • Server must exist: Invalid server IDs are silently ignored

OAuth2 Authorization Flow

Understanding the authorization process helps you guide applicants through the experience.

What Users See

  1. Click start button: Instead of opening DMs or modal, redirected to Discord website
  2. Authorization page: Discord shows official authorization prompt with:
    • Bot name and avatar
    • Requested permissions ("connections", "guilds")
    • "Authorize" and "Cancel" buttons
  3. Grant permission: User clicks "Authorize"
  4. Redirect back: Discord redirects user back to your application
  5. Application starts: Bot has verified data, application proceeds normally

If User Declines Authorization

  • Application cannot proceed
  • User sees error message explaining authorization is required
  • User can try again by clicking start button again
  • No data is collected if user declines

Data Storage

  • Linked accounts: List of platform names stored with application (e.g., "Steam, YouTube, Reddit")
  • Server memberships: List of server IDs user is member of (only from your configured list)
  • Not stored: Platform usernames, profile URLs, or full guild list
  • Retention: Data follows your application data retention settings

๐Ÿ’ก User Experience Tips

  • Explain in start message: "You'll be asked to authorize Discord access to verify requirements"
  • Clarify what's checked: "We verify you're in our partner server"
  • Privacy assurance: "We only see if accounts are linked, not your credentials"
  • Revoking access: Tell users they can revoke in Discord โ†’ Authorized Apps anytime

Combining Discord Integration with Other Requirements

Discord Integration works alongside other permission systems for layered verification.

Check Order

  1. Role requirements (from Permissions tab)
  2. Prevent roles (from Permissions tab)
  3. Membership time (from Permissions tab)
  4. Cooldown (from Permissions tab)
  5. Discord OAuth2 authorization (if enabled)
  6. Linked accounts check (if enabled)
  7. Server membership check (if enabled)
  8. Application starts

Example: Multi-Layer Verification

Goal: Highly secure staff recruitment
Setup:
โ€ข Permissions โ†’ Required Roles: @Verified
โ€ข Permissions โ†’ Membership Time: 30 days
โ€ข Discord โ†’ Linked Accounts: Enabled
โ€ข Discord โ†’ Server Membership: Must be in verification server

Result:
Applicant must: 1. Have @Verified role
2. Be server member for 30+ days
3. Authorize Discord OAuth2
4. Be member of verification server
Only then can they start the application

โš ๏ธ Balance Security with Accessibility

Too many requirements can frustrate legitimate applicants:

  • Each additional check adds friction to the application process
  • OAuth2 authorization can confuse users unfamiliar with it
  • External server requirements may exclude qualified candidates
  • Consider your community's tech-savviness when enabling these features

Viewing OAuth2 Data in Applications

When staff review applications, OAuth2 verification results appear in the application thread.

What Staff See

  • Linked Accounts: List of platforms (e.g., "Steam, YouTube, Twitch")
  • Server Memberships: "โœ“ Verified in required servers" or list of matched servers
  • Steam Comparison: If Steam is linked and answered, shows match status
  • Missing Data: If user has no linked accounts, shows "None"

Using OAuth2 Data for Decisions

  • Verify claimed social media accounts actually exist
  • Confirm platform usernames match Discord identity
  • Check if applicant meets partnership requirements
  • Detect potential fake accounts (no linked platforms = suspicious)

๐Ÿ”ง Troubleshooting Discord Integration

Common Issues:

  • "Authorization failed":
    • User clicked "Cancel" on OAuth2 page
    • Discord API temporarily unavailable
    • User needs to try again
  • "Not a member of required servers":
    • Check server IDs are correct (18-19 digits)
    • User actually isn't in any of those servers
    • User left the servers before applying
    • Verify server IDs are valid and server still exists
  • "No linked accounts detected":
    • User hasn't linked any platforms in Discord settings
    • User set connections to private
    • This is normal for users who don't use connection features
  • Steam mismatch warning:
    • Applicant entered different Steam profile than linked one
    • Could be legitimate (multiple accounts) or suspicious
    • Ask applicant to clarify in interview
  • Server list not showing:
    • Feature only shows servers where bot is also present
    • If bot isn't in many servers, list will be empty
    • Use manual ID entry instead
  • Users confused by OAuth2:
    • Add explanation to your start message
    • Create a #how-to-apply channel with screenshots
    • Clarify it's official Discord authorization (not a scam)

Steam Integration

Automatically assign roles based on Steam profile data including game ownership, total playtime, and recent activity. Requires applicants to provide their Steam profile URL.

overview

๐Ÿ“‹ Overview

Steam Integration allows you to verify and reward players based on their Steam gaming data. The bot retrieves public profile information and assigns roles automatically based on criteria you configure. This is perfect for gaming communities recruiting experienced players.

โš ๏ธ Requirements

  • Applicant must provide Steam profile URL in application (typically via question)
  • Steam profile must be set to Public (not Friends Only or Private)
  • Bot can only see publicly available data
  • Profile must exist and be accessible at submission time
  • Game data must be public in Steam privacy settings

How Steam Integration Works

Data Flow

  1. Applicant submits application with Steam profile URL answer
  2. Bot extracts Steam ID from the provided URL
  3. Bot queries Steam API for public profile data
  4. Bot checks game library, playtime, and recent activity
  5. Bot compares data against your configured criteria
  6. Matching roles are assigned automatically on Accept

What Data Is Retrieved

  • Game Library: List of owned games
  • Total Hours: All-time playtime per game
  • Recent Activity: Hours played in last 2 weeks per game
  • Profile Status: Public/Private status

๐Ÿ’ก Privacy Note

Bot only accesses data that's publicly visible on Steam profiles. If an applicant's profile or game details are set to private, the bot cannot retrieve that information and will treat it as "game not owned" or "0 hours played."

Configuring Steam Requirements

Set up game-based role assignments using the Steam settings table. Each game can have multiple criteria (ownership, total hours, recent activity) with different role rewards.

Adding Games

Step 1: Search for Game

  • Click the "+ add game" button
  • Search modal opens with search bar
  • Type game name (minimum 2 characters)
  • Results appear as you type, pulled from Steam store
  • Click a game from results to add it

Step 2: Configure Game Criteria

Once added, each game shows as a row with the following options:

Game Ownership

Assign a role simply for owning the game in their library.

Configuration:

  • Game row shows game thumbnail/icon
  • "in Library" indicator
  • Click + button to select role
  • Selected role appears next to the game
  • Click X on role to remove

Use Cases:

  • Game verification: Prove they own your game (e.g., @CS2-Player)
  • Genre tagging: Own RPG game โ†’ @RPG-Enthusiast
  • Franchise recognition: Own Dark Souls โ†’ @Souls-Veteran

Total Hours Played

Assign roles based on all-time playtime in a specific game.

Configuration:

  • Click "Tot Hours" button under the game
  • Enter minimum hours (left field)
  • Enter maximum hours (right field) - optional
  • Click + to select role
  • Add multiple hour ranges for the same game with different roles
  • Click X to remove a hour requirement row

Hour Range Logic:

  • Min only: 100 (no max) = 100+ hours required
  • Min and Max: 100 โ†” 500 = between 100-500 hours
  • Max only: (no min) โ†” 50 = less than 50 hours
  • Multiple ranges: Create tiers (0-100 = Novice, 100-500 = Experienced, 500+ = Expert)

Example Setup:

Game: Counter-Strike 2
Tier 1: 0 โ†” 500 hours โ†’ @CS2-Beginner
Tier 2: 500 โ†” 2000 hours โ†’ @CS2-Intermediate
Tier 3: 2000+ hours โ†’ @CS2-Expert

Result: Players automatically get tier role based on playtime

โš ๏ธ Overlapping Ranges

If a player's hours fall into multiple ranges, all matching roles are assigned. To create exclusive tiers, ensure ranges don't overlap:

  • โŒ Bad: 0-500 and 100-1000 (overlap at 100-500)
  • โœ… Good: 0-500, 500-1000, 1000+ (no overlap)

Last 2 Weeks Activity

Assign roles based on recent playtime (rolling 2-week window).

Configuration:

  • "last 2 weeks" row appears under each game automatically
  • Enter minimum hours (left field)
  • Enter maximum hours (right field) - optional
  • Click + to select role
  • Only one "last 2 weeks" requirement per game
  • Cannot add multiple rows like Total Hours

Use Cases:

  • Activity verification: 10+ hours last 2 weeks โ†’ @Active-Player
  • Recruitment requirements: Must have played recently to join raid team
  • Season participation: Active during current season
  • Inactivity detection: 0 hours last 2 weeks โ†’ (don't assign active role)

Example Setup:

Game: Destiny 2
Ownership: In library โ†’ @D2-Player
Total Hours: 500+ โ†’ @D2-Veteran
Last 2 Weeks: 20+ hours โ†’ @D2-Active

Result: Active veterans get all 3 roles, inactive veterans get only first 2

๐Ÿ’ก Combining Criteria

All criteria for a game are evaluated independently. A player can match multiple criteria and receive all corresponding roles. This lets you create nuanced role systems:

  • Ownership role (proves they have the game)
  • Experience role (shows skill level)
  • Activity role (proves current engagement)

Managing Steam Games

Editing Games

  • Change game: Click the game thumbnail to open search modal and select different game
  • Add hours tiers: Click "Tot Hours" button to add another hour range row
  • Remove hour tier: Click X on the right side of the hour range row
  • Remove game entirely: Click X on the far right of the game row (top-level)

Role Management

  • Add role: Click + button next to criteria
  • Change role: Remove existing role (X) then add new one (+)
  • Remove role: Click X on the role badge
  • Missing roles: If role is deleted from Discord, shows "Delete me (ID: ...)" - click X to clean up

Adding Multiple Games

  • Click "+ add game" for each additional game
  • No limit on number of games (within reason)
  • Each game appears as separate section in the table
  • Games are checked sequentially - all matching criteria assign roles

โš ๏ธ Performance Considerations

  • Checking 10+ games may slow down application processing
  • Focus on 3-5 most relevant games for your community
  • Steam API has rate limits - too many requests may fail

When Steam Roles Are Assigned

Assignment Timing

Steam roles are assigned on Accept only, not on Submit or Deny.

Process Flow:

  1. User submits application with Steam URL
  2. Bot validates Steam profile is public and accessible
  3. Bot retrieves game data from Steam API
  4. Bot evaluates all configured criteria
  5. Matching roles are stored in database
  6. When staff clicks Accept, Steam roles are assigned along with other roles
  7. If staff clicks Deny, no Steam roles are assigned

Final Role Calculation on Accept

Steam roles are added to the total role calculation:

Final Roles =
Current roles
- Remove roles (from Accept settings)
+ Add roles (from Accept settings)
+ Button-selected roles (from questions)
+ Thread button roles (from staff)
+ Steam roles (from game criteria)

๐Ÿ’ก Steam Role Strategy

Best practices for Steam role assignment:

  • Combine with manual roles: Steam verifies skill, staff verify personality fit
  • Use for tier systems: Automatic tier based on hours, manual override if needed
  • Activity tracking: Recent hours requirement ensures active players only
  • Multi-game verification: Check multiple games for broader skill assessment

Steam Profile Requirements

Setting Up Steam Question

To use Steam Integration, your application must include a question asking for Steam profile URL.

Recommended Question Format:

  • Question text: "Link your Steam Profile URL" or "What is your Steam profile link?"
  • Question type: Short answer (text input)
  • Mark as required: Yes (if Steam verification is mandatory)
  • Instructions: "Ensure your profile is set to Public in Steam privacy settings"

Accepted Steam URL Formats

The bot can parse multiple Steam URL formats:

  • https://steamcommunity.com/id/username (Vanity URL)
  • https://steamcommunity.com/profiles/76561198012345678 (Steam ID64)
  • steamcommunity.com/id/username (without https://)
  • steamcommunity.com/profiles/76561198012345678 (without https://)

โš ๏ธ Invalid URLs

If applicant provides invalid or inaccessible Steam URL:

  • Bot attempts to parse the URL
  • If parsing fails, no Steam data is retrieved
  • No Steam roles are assigned (treated as 0 hours / not owned)
  • Staff can see error in application data
  • Staff should ask for correction before accepting

Privacy Settings Requirements

Applicants must configure their Steam privacy settings correctly:

Required Settings:

  1. Open Steam โ†’ Profile โ†’ Edit Profile
  2. Go to Privacy Settings
  3. Set "My profile" to Public
  4. Set "Game details" to Public
  5. Set "Friends list" to Public or Friends Only (not required but helpful)
  6. Save changes

๐Ÿ’ก Guiding Applicants

Add instructions to your application start message:

"Before applying, ensure your Steam profile is set to Public:
Steam โ†’ Profile โ†’ Edit Profile โ†’ Privacy Settings โ†’ My profile: Public

We verify game hours for role assignment. Private profiles cannot be verified."

Steam Data in Applications

What Staff See

When staff review applications, Steam data appears in the application thread:

Information Displayed:

  • Profile Status: Public/Private indicator
  • Profile URL: Clickable link to applicant's Steam profile
  • Games Checked: List of games you configured
  • Ownership Status: โœ“ Owned or โœ— Not owned for each game
  • Total Hours: All-time playtime for each owned game
  • Recent Hours: Last 2 weeks playtime for each owned game
  • Roles to Assign: List of Steam roles that will be assigned on Accept

Discord OAuth2 Comparison

If Discord Integration โ†’ Linked Accounts is also enabled:

  • Bot checks if Steam is linked to applicant's Discord account
  • Compares linked Steam ID against provided Steam URL
  • If they match: Shows โœ“ "Steam profiles match"
  • If they don't match: Shows โš ๏ธ "Steam profiles don't match - verify with applicant"
  • Helps detect fake profiles or incorrect URLs

โš ๏ธ Steam Mismatch Warning

If Steam profiles don't match:

  • Could be legitimate (multiple Steam accounts)
  • Could indicate incorrect URL provided
  • Could be attempt to use someone else's profile
  • Staff should ask applicant to clarify before accepting
  • Not automatically blocking - staff discretion required

Common Steam Integration Setups

Example 1: Guild Recruitment

Game: World of Warcraft
Setup:
โ€ข In Library โ†’ @WoW-Player
โ€ข 500+ hours โ†’ @Experienced
โ€ข 1500+ hours โ†’ @Veteran
โ€ข 20+ hours last 2 weeks โ†’ @Active

Result: Active veterans get @WoW-Player + @Veteran + @Active roles

Example 2: Competitive Team

Game: Counter-Strike 2
Setup:
โ€ข 1000+ hours โ†’ @CS2-Experienced
โ€ข 3000+ hours โ†’ @CS2-Expert
โ€ข 40+ hours last 2 weeks โ†’ @CS2-Active-Grinder

Recruitment Requirement: Must have @CS2-Experienced + @CS2-Active-Grinder to join competitive team

Example 3: Multi-Game Community

Games Configured: CS2, Dota 2, Apex Legends, Valorant
Setup for each:
โ€ข In Library โ†’ @{GameName}-Player
โ€ข 500+ hours โ†’ @{GameName}-Vet

Result: Players automatically tagged for all games they own and have hours in

Example 4: Activity-Based Roles

Game: Rust
Setup:
โ€ข In Library โ†’ @Rust-Owner
โ€ข 50+ hours last 2 weeks โ†’ @Rust-Hardcore
โ€ข 20-50 hours last 2 weeks โ†’ @Rust-Regular
โ€ข 5-20 hours last 2 weeks โ†’ @Rust-Casual

Result: Activity-based tiers that update with each new application (roles reflect current playstyle)

๐Ÿ”ง Troubleshooting Steam Integration

Common Issues:

  • "Could not retrieve Steam data":
    • Profile is set to Private or Friends Only
    • Steam URL is invalid or malformed
    • Steam profile doesn't exist
    • Steam API is temporarily down
    • Ask applicant to verify profile is Public
  • "Game not owned" but applicant claims they own it:
    • Game details privacy setting is not Public
    • Game is family shared (doesn't show in API)
    • Game was refunded (no longer in library)
    • Free weekend (temporary access, not ownership)
  • "0 hours" but applicant has playtime:
    • Game details set to Private
    • Playtime was before privacy settings changed
    • Hours played in offline mode (not tracked by Steam)
    • Steam API cache delay (can take hours to update)
  • Roles not assigned on Accept:
    • Check bot role hierarchy (must be above Steam roles)
    • Verify Steam data was retrieved successfully (check application thread)
    • Ensure criteria are configured correctly (min/max values)
    • Steam roles only assign on Accept, never on Deny
  • Wrong roles assigned:
    • Check for overlapping hour ranges
    • Verify role selectors point to correct roles
    • Multiple criteria can match - all roles are assigned
    • Review exact hour counts in application thread
  • Game search not working:
    • Type at least 2 characters
    • Steam store API might be down
    • Try different search terms
    • Some games have unusual names in Steam database
  • Steam profiles don't match warning:
    • Applicant linked different Steam to Discord
    • Applicant has multiple Steam accounts
    • Ask applicant which is their main account
    • Not automatically blocking - manual verification needed

Google Sheets & Data Management

Export application data to CSV files or sync automatically to Google Sheets for analytics, record-keeping, and external processing.

overview

๐Ÿ“‹ Overview

AppBot provides two methods for accessing application data: manual CSV downloads for quick exports, and automatic Google Sheets integration for real-time syncing. Both methods respect your data retention settings and include all submitted application information.

CSV Export

Download application data as CSV (Comma-Separated Values) files for use in Excel, Google Sheets, or other data analysis tools.

Download Options

All Apps

  • Downloads every application ever submitted for this application type
  • Includes pending, accepted, and denied applications
  • Contains complete history since application was created
  • File name format: AppName_All_YYYY-MM-DD.csv
  • Click "All Apps" button to download

Since Last Download

  • Only appears after you've downloaded at least once
  • Downloads only applications submitted since your last download
  • Shows date of last download (e.g., "Since last Download: 15 Dec")
  • Useful for incremental updates
  • File name format: AppName_Since_LastDate_YYYY-MM-DD.csv
  • Timestamp updates each time you use "All Apps" or "Since Last Download"

CSV File Contents

Each CSV includes the following columns:

  • User ID: Discord user ID (18-19 digits)
  • Username: Discord username at submission time
  • Status: Pending, Accepted, or Denied
  • Submitted: Date and time of submission
  • Processed: Date and time of accept/deny (if applicable)
  • Processed By: Staff member who accepted/denied (if applicable)
  • Thread ID: Discord thread ID for the application
  • Application Counter: Sequential number (#1, #2, #3...)
  • Question 1, Question 2, etc.: One column per application question with applicant's answer
  • Locale: User's Discord language setting (if available)

๐Ÿ’ก CSV Use Cases

  • Backup: Keep offline copies of application data
  • Analytics: Import into Excel/Google Sheets for charts and analysis
  • External processing: Feed data into custom tools or databases
  • Reporting: Generate monthly reports on application volume
  • Auditing: Track staff performance and processing times

CSV Formatting Notes

  • Text fields are enclosed in quotes if they contain commas
  • Line breaks in answers are preserved as \n
  • Role mentions appear as role IDs (e.g., 123456789)
  • Empty answers show as blank cells
  • Timestamps are in ISO 8601 format (YYYY-MM-DD HH:MM:SS)
  • UTF-8 encoding supports international characters

โš ๏ธ Data Retention Impact

CSV exports are affected by your "Retain Answers" setting:

  • Retention Enabled: Full answer content included in CSV
  • Retention Disabled: Answer columns may be empty for processed applications
  • Metadata (user, status, timestamps) always included regardless of retention setting

Data Retention

Control whether application answers are stored in the database after applications are processed.

Retain Answers Toggle

  • Enabled: Application answers are preserved indefinitely
  • Disabled: Answer content is deleted when application is accepted/denied
  • Toggle can be changed at any time
  • Changes only affect future applications, not existing data

What Gets Retained/Deleted

Always Retained (regardless of setting):

  • User ID and username
  • Application status (pending/accepted/denied)
  • Submission timestamp
  • Processing timestamp
  • Staff member who processed
  • Thread ID and link
  • Application counter number

Deleted When Retention is Disabled:

  • Full text of all answers
  • Selected button choices
  • Uploaded images (if any)
  • Any PII (Personally Identifiable Information) in answers

When Deletion Occurs

  • Accept: Answers deleted immediately after Accept action completes
  • Deny: Answers deleted immediately after Deny action completes
  • Pending: Answers retained until processed
  • Scheduled actions: If schedule is active, answers retained until schedule executes

Recommended Settings

  • Enable retention if: You need historical data, analytics, or record-keeping
  • Disable retention if: Privacy is paramount or you handle sensitive information

โš ๏ธ Consent Notice

"I consent to AppBot retaining the content of application answers while this toggle is active. If disabled, only basic metadata will be preserved."

By enabling retention, you acknowledge responsibility for data storage and must comply with applicable privacy laws (GDPR, CCPA, etc.) in your jurisdiction.

Google Sheets Integration (Premium)

Automatically sync application data to a Google Sheet in real-time, eliminating the need for manual exports.

โš ๏ธ Premium Feature

Google Sheets integration requires an active premium subscription. Free tier users can only use CSV exports.

How It Works

  1. Click "Sign in with Google" button
  2. Google OAuth2 authorization popup appears
  3. Grant AppBot permission to create and edit spreadsheets
  4. Bot creates a new Google Sheet in your Google Drive
  5. Sheet is automatically populated with your application structure
  6. New applications sync to the sheet within 24 hours
  7. Status updates (accept/deny) sync within 24 hours

Google Sheet Structure

The automatically created sheet includes:

Column Layout:

  • A: User ID
  • B: Username
  • C: Status (Submitted/Accepted/Denied)
  • D: Submission Date/Time
  • E: Processing Date/Time
  • F: Processed By (staff username)
  • G: Thread Link (clickable)
  • H: Application Number
  • I+: Question 1, Question 2, etc. (one column per question)

Sheet Features:

  • Header row is frozen for easy scrolling
  • Columns are auto-sized for readability
  • Thread links are clickable (open Discord directly)
  • Conditional formatting shows status colors (green = accepted, red = denied)
  • New rows append to bottom automatically

Sync Behavior

What Syncs:

  • New applications (when submitted)
  • Status changes (when accepted/denied)
  • Staff member who processed
  • Processing timestamps

Sync Frequency:

  • Updates occur once per day (typically overnight)
  • Not real-time - expect up to 24-hour delay
  • Batch processing reduces API quota usage
  • Multiple applications in same day appear in single batch

What Doesn't Sync:

  • Changes made directly in the Google Sheet (one-way sync from bot to sheet)
  • Applications processed before sheet was created
  • Historical data (only new data after setup syncs)

๐Ÿ’ก Google Sheets Benefits

  • Automatic updates: No manual downloads needed
  • Collaboration: Share sheet with team members
  • Analysis: Use Google Sheets formulas, charts, pivot tables
  • Integration: Connect to other Google services (Data Studio, Apps Script)
  • Access anywhere: View on mobile, tablet, desktop
  • Version history: Google automatically tracks changes

Managing Your Google Sheet

Once Connected:

  • "Google Sheet Connected" indicator appears
  • "Open Google Sheet" link takes you directly to the sheet
  • Sheet updates automatically - no further action needed
  • You can edit, format, and customize the sheet freely
  • Bot will continue adding new rows without affecting your changes

Removing Integration:

  • Click "Remove" button to disconnect
  • Sheet remains in your Google Drive (not deleted)
  • Syncing stops immediately
  • You can reconnect later with a new sheet
  • Previous sheet won't resume syncing - new sheet is created

โš ๏ธ Important Notes

  • One Google Sheet per application type
  • If you delete the sheet from Google Drive, syncing fails silently
  • Recreating a sheet creates a new one (old one doesn't reconnect)
  • Sheet owner is the Google account that authorized
  • Share the sheet with team members for collaborative access
  • Don't delete header row or rename sheet tabs - breaks syncing

Data Export Best Practices

For Small Communities (Low Volume)

Recommendation: CSV exports only
โ€ข Download "All Apps" monthly for backup
โ€ข Enable data retention for historical reference
โ€ข Keep CSVs in organized folders locally
Cost: Free

For Active Communities (Medium Volume)

Recommendation: Google Sheets integration
โ€ข Premium subscription for auto-sync
โ€ข Enable data retention
โ€ข Download CSV backups quarterly
โ€ข Use Google Sheets for daily analytics
Cost: Premium subscription

For Large Organizations (High Volume)

Recommendation: Google Sheets + External Database
โ€ข Premium subscription for Google Sheets
โ€ข Enable data retention
โ€ข Export Google Sheets to external database weekly
โ€ข Use advanced analytics tools on exported data
Cost: Premium subscription + external tool costs

For Privacy-Focused Communities

Recommendation: Minimal retention
โ€ข Disable data retention
โ€ข Download CSV immediately after processing applications
โ€ข Store CSVs securely offline
โ€ข Delete online copies regularly
Cost: Free

Advanced Data Analysis

Excel/Google Sheets Formulas

Common formulas for analyzing application data:

Application Volume:

  • =COUNTIF(C:C,"Submitted") - Count pending applications
  • =COUNTIF(C:C,"Accepted") - Count accepted applications
  • =COUNTIF(C:C,"Denied") - Count denied applications

Acceptance Rate:

  • =COUNTIF(C:C,"Accepted")/(COUNTIF(C:C,"Accepted")+COUNTIF(C:C,"Denied"))*100
  • Returns percentage of accepted vs total processed

Staff Performance:

  • =COUNTIF(F:F,"StaffName") - Count applications processed by specific staff
  • =AVERAGE(E:E-D:D) - Average time from submission to processing

Time-Based Analysis:

  • =COUNTIFS(D:D,">=1/1/2024",D:D,"<2/1/2024") - Count January applications
  • =SUMPRODUCT((MONTH(D:D)=1)*(C:C="Accepted")) - Accepted in January

Visualization Ideas

  • Pie chart: Status distribution (Pending/Accepted/Denied)
  • Line chart: Applications per day/week/month
  • Bar chart: Staff processing volume comparison
  • Heatmap: Application submission times (identify peak hours)

๐Ÿ”ง Troubleshooting Data & Sheets

CSV Issues:

  • CSV won't download:
    • Check browser pop-up blocker
    • Disable browser extensions temporarily
    • Try different browser
    • Check browser download settings
  • "Since Last Download" missing:
    • Must download "All Apps" at least once first
    • Timestamp is stored per application type
    • Button appears after first download completes
  • Empty answer columns in CSV:
    • Data retention may be disabled
    • Applications may have been processed before retention was enabled
    • Scheduled actions may have cleared data
  • Special characters display incorrectly:
    • Open CSV with UTF-8 encoding
    • In Excel: Data โ†’ From Text/CSV โ†’ File Origin: UTF-8
    • Google Sheets handles UTF-8 automatically

Google Sheets Issues:

  • "Sign in with Google" fails:
    • Pop-ups may be blocked
    • Check browser privacy settings
    • Try incognito/private mode
    • Ensure cookies are enabled for google.com
  • Sheet created but not syncing:
    • Syncing happens once per day (24hr delay)
    • Check if premium subscription is active
    • Verify sheet wasn't deleted from Google Drive
    • Check sheet URL in dashboard is correct
  • Sheet shows #REF or #ERROR:
    • Don't delete header row
    • Don't rename sheet tabs
    • Don't move columns (bot expects specific layout)
    • Make new sheet instead of fixing broken one
  • "Remove" button doesn't work:
    • Refresh page and try again
    • Sheet remains in your Drive (not automatically deleted)
    • Manually delete from Google Drive if desired
  • Can't find sheet in Google Drive:
    • Check "Shared with me" section
    • Search by application name
    • Use "Open Google Sheet" link from dashboard
    • Sheet is owned by account that authorized

Data Retention Issues:

  • Data still present after disabling retention:
    • Change only affects new applications
    • Existing data remains until you manually delete
    • Pending applications retain data until processed
  • Data deleted unexpectedly:
    • Check if retention toggle was disabled
    • Scheduled actions clear data when executed
    • Accept/Deny clears data if retention off

Welcome & Verify

Automate new member onboarding with customizable welcome messages and verification systems. Control server access, assign roles automatically, and create engaging first impressions for new members.

overview

๐Ÿ“‹ Overview

The Welcome & Verify system provides two powerful features for managing new members:

  • Verification System: Require new members to verify before accessing your server, with automatic role assignment
  • Welcome Messages (Premium): Automatically greet new members with custom messages and instant access to application buttons

๐Ÿ” Verification System

Create a verification gate that new members must complete before accessing your server. This helps prevent spam, bots, and ensures members actively engage with your community.

How It Works

  1. New member joins your Discord server
  2. Bot sends verification message in designated channel
  3. Member clicks "Verify" button
  4. Bot automatically assigns configured roles
  5. Optional: Bot logs verification in log channel

Configuration

1. Enable Verification

Toggle the Enable Verification switch to activate the system.

Choose whether to send verification as a standalone message or attach it to an existing group message.

2. Add Verification Roles

Click the + button next to "add role on verified" to select roles that will be automatically assigned when a member verifies.

  • You can add multiple roles
  • Roles appear as colored tags (matching their Discord color)
  • Click the x on any role to remove it

โš ๏ธ Important: Bot Role Hierarchy

Remember to manually drag the bot role above any roles you want to add in Discord's server settings. The bot cannot assign roles that are positioned higher than its own role.

3. Customize Verification Message

Design the message members see when they need to verify:

  • Color: Click the color circle to open the color picker and customize the message border
  • Channel: Select where the verification message appears (dropdown menu)
  • Text: Write your verification instructions in the text area

    Example: ## Please click below to verify and gain access to our server!

4. Link to Group Messages (Optional)

Tie the verification button to existing application group messages instead of sending a standalone message:

  • Select one or more Group buttons below the message editor
  • Selected groups show as buttons: + Group 1 ..., + Group 2 ...
  • Click a group button to remove it

How it works: If linked to a group, the group's message text takes precedence. If no group is selected, the verification message sends as standalone.

5. Send/Update Message

Click the arrow button (โ†’) to send the verification message to Discord. The button shows a loading spinner while the message is being posted.

Verification Logs

Track successful verifications by enabling the logs system:

  1. Toggle Send Logs to enable logging
  2. Select a log channel from the dropdown
  3. Bot will post a log entry each time a member successfully verifies

Use case: Staff can monitor verification activity, identify verification issues, and track member onboarding patterns.

๐Ÿ‘‹ Welcome Messages Premium

Automatically greet new members with a custom welcome message that can include text, images, and instant access to application buttons. This creates an engaging first impression and streamlines the application process.

How It Works

  1. New member joins your Discord server
  2. Bot automatically sends welcome message to designated channel
  3. Message displays custom text, optional image, and selected app buttons
  4. Member can immediately start applications or read server information

Configuration

1. Enable Welcome Messages

Toggle the Automatic Welcome Message switch to activate the system.

This feature is available for Premium subscribers only.

2. Select Welcome Channel

Choose where welcome messages appear using the # Channel dropdown. This should typically be a public channel where new members can see the message.

Common choices: #welcome, #start-here, #introduction

3. Design Welcome Message

Once a channel is selected, the message editor appears:

Customize Colors

Click the color circle to open the color picker and customize the message border color.

Write Welcome Text

Compose your welcome message in the text area. Use Markdown for formatting:

## Welcome to [Server Name]!
We're glad you're here. Click below to apply for roles!

You can use just text, just an image, or both! Leave the text empty to send image-only welcomes.

Add Welcome Image

Click the image icon to upload:

  • Images (.png, .jpg, .gif)
  • Videos (.mp4, .mov)

Images make welcome messages more engaging and visually branded to your server.

4. Add Application Buttons

Give new members immediate access to applications by adding app buttons to the welcome message:

  1. After designing your message, scroll down to the app selection area
  2. Click any app to add its button to the welcome message
  3. Added apps appear as buttons below the message editor
  4. Click a button to remove it from the welcome message

Example: Add "Member Application" and "Staff Application" buttons so new members can immediately apply for roles without searching through channels.

๐Ÿ’ก Use Cases

Verification-Only Server

Use verification without welcome messages for maximum security. New members see only the verification message and must click "Verify" before accessing any channels.

Best for: Private communities, competitive teams, age-restricted servers

Welcome + Applications

Combine welcome messages with application buttons for streamlined onboarding. New members are immediately greeted and can apply for roles without navigation.

Best for: Gaming clans, content creator communities, role-play servers

Hybrid Approach

Use verification for basic access, then welcome messages in a member-only channel with application buttons.

Best for: Large public servers, educational communities, multi-tier access systems

๐Ÿ”ง Troubleshooting

โŒ Bot Can't Assign Roles

Problem: Verification completes but roles aren't assigned

Solution:

  • Check bot role hierarchy in Server Settings โ†’ Roles
  • Drag the bot role above all roles you want it to assign
  • Ensure bot has "Manage Roles" permission

โŒ Verification Message Not Sending

Problem: Arrow button loads but no message appears

Solution:

  • Verify the bot has "Send Messages" permission in selected channel
  • Check that channel selection is saved (dropdown shows channel name)
  • Try refreshing channels using the refresh button
  • Ensure message text or group is properly configured

โŒ Welcome Messages Not Appearing

Problem: New members join but no welcome message sends

Solution:

  • Confirm Welcome Messages toggle is enabled
  • Check Premium subscription status
  • Verify bot has permissions in welcome channel
  • Ensure at least text OR image is configured

โŒ Verification Logs Not Working

Problem: Verifications succeed but no logs appear

Solution:

  • Toggle "Send Logs" must be enabled
  • Log channel must be selected from dropdown
  • Bot needs "Send Messages" permission in log channel
  • Check that log channel still exists and wasn't deleted

โŒ App Buttons Not Showing in Welcome

Problem: Welcome message sends but app buttons are missing

Solution:

  • Ensure apps are properly selected in the app list section
  • Apps must be enabled and have start buttons configured
  • Check that selected apps still exist in your applications list
  • Try removing and re-adding the app buttons

โœจ Best Practices

  • Keep verification simple: Clear instructions, single click to verify
  • Welcome channel placement: Make it one of the first channels new members see
  • Limit app buttons: Only include 2-4 most important applications in welcome messages
  • Test thoroughly: Use an alt account to test the full verification and welcome flow
  • Monitor logs: Check verification logs regularly to spot potential issues
  • Update seasonally: Refresh welcome images and text to keep things fresh
  • Brand consistency: Match colors to your server's theme and branding

โš ๏ธ Important Notes

  • Welcome Messages are a Premium feature - upgrade to unlock
  • Changes to verification/welcome messages don't affect previously sent messages
  • Verification roles are additive - they don't remove existing roles
  • Role hierarchy restrictions apply to all role assignments

Events & Slow Mode

Automate Discord Event management with custom triggers, thread creation, and announcements. Protect your channels from spam with intelligent auto slowmode that adapts to chat activity.

overview

๐Ÿ“‹ Overview

The Events & Slow Mode system provides two powerful automation features:

  • Event Automation: Automatically create threads, send announcements, and manage Discord Events with custom triggers
  • Auto Slow Mode: Dynamically apply slowmode restrictions when message frequency exceeds thresholds, preventing spam and raid attacks

๐Ÿ“… Event Automation

Whenever someone creates a Discord Event, the bot can automatically create threads, ping roles, and post announcements. Users who click "Interested" are automatically added to the event thread.

How It Works

  1. User creates a Discord Event in a monitored channel
  2. Bot checks global creator requirements (if configured)
  3. Bot finds matching triggers based on channel and settings
  4. Bot creates a thread (public or private) in specified channel
  5. Bot pings configured roles in the thread
  6. Bot sends custom announcements to designated channels
  7. When users click "Interested", they're automatically added to the thread
  8. When users remove interest, they're removed from the thread

Global Creator Requirements

Control who can trigger event automation across all triggers. These requirements apply to all triggers before individual trigger settings are checked.

Required Roles

Users must have at least one of these roles to trigger event automation:

  1. Click the + button next to "Required roles to fire Trigger"
  2. Select role(s) from the modal
  3. Only users with one or more of these roles can trigger automation
  4. Click x on any role to remove it

Leave empty to allow all users to trigger events.

Forbidden Roles

Users with any of these roles are prevented from triggering automation:

  1. Click the + button next to "Prevent roles from firing Trigger"
  2. Select role(s) from the modal
  3. Users with these roles cannot trigger automation, even if they have required roles

Use case: Allow Staff to create events but prevent Muted or Restricted roles from triggering automation.

Creating Event Triggers

Triggers define when and how the bot responds to Discord Events. You can create multiple triggers for different channels or event types.

1. Add New Trigger

  1. Click the "EVENT TRIGGER" button in the left sidebar
  2. A new trigger appears as "Trigger 1", "Trigger 2", etc.
  3. Click the trigger to configure it
  4. Toggle Enabled to activate/deactivate the trigger

2. Select Monitored Channels

Choose which channels to monitor for event creation:

  1. Under "If event created in", click Select Channel(s)
  2. Choose one or multiple channels from the dropdown
  3. Selected channels appear as tags with or between them
  4. Click X on any channel tag to remove it

The "or" logic means events created in any of these channels will trigger automation.

Example: Monitor #announcements or #events or #community-events

3. Configure Thread Creation

Automatically create threads when events are created:

Thread Channel

Select where the thread should be created:

  1. Under "Thread Is created in", click the dropdown
  2. Select the channel where threads will appear
Thread Name

Customize the thread name using variables:

  • Enter a custom name in the "Thread name" input
  • Use variables: {event_date}, {event_title}
  • Maximum 100 characters (automatically truncated)

Example: {event_date} - {event_title} Discussion
Result: 20 Jan 25 - Game Night Discussion

Ping Roles

Automatically ping roles in the thread:

  1. Click the + button next to "Ping roles"
  2. Select role(s) to ping when the thread is created
  3. These roles are mentioned in the initial thread message
Private Thread

Check Private Thread to create private threads instead of public ones.

Private threads are only visible to pinged roles and users added to the thread.

4. Add Custom Announcements

Send custom messages to different channels when events are created. You can add multiple announcements per trigger.

  1. Click "Custom Message" at the bottom
  2. For each announcement:
    • Select the channel where the message will be sent
    • Write your message text in the textarea
    • Use variables to include event details
    • Click X to delete the announcement
  3. Add multiple announcements to post in different channels
Available Variables
VariableOutput
{event_title}Event name
{event_description}Event description
{event_date}Event start date (DD Mon YY format)
{event_url}Direct link to the Discord Event
{thread}Link to the created thread

Example announcement:
๐ŸŽฎ New Event: {event_title}
{event_description}
๐Ÿ“… Starts: {event_date}
๐Ÿ’ฌ Discussion: {thread}
{event_url}

5. Delete Trigger

Click Delete Trigger in the top-right to remove a trigger completely.

Automatic Thread Management

The bot automatically manages threads and user participation:

Initial Thread Message

When a thread is created, the bot sends:

  • Mention of the event creator
  • Pings for configured roles
  • Event start time (relative format: "in 2 days")
  • Direct link to the event

Interest-Based Thread Access

When users click "Interested" on the Discord Event:

  • Bot automatically adds them to the thread
  • Bot sends a welcome ping (deleted after 2 seconds)
  • Users are queued and pinged in batches every 3 seconds

When users remove interest:

  • Bot removes them from the thread
  • They're removed from the ping queue

Use Cases

Community Game Nights

Monitor #events, create threads in #game-night-chat, ping @Gamers role, and announce in #announcements.

Staff Meetings

Monitor #staff-events, create private threads in #meeting-threads, ping @Staff, no public announcements.

Multi-Channel Event System

Create different triggers for #tournaments, #social-events, and #workshopswith unique thread channels, pings, and announcements for each.

๐Ÿ›ก๏ธ Auto Slow Mode

Automatically apply slowmode restrictions when message frequency exceeds configured thresholds. This protects your channels from spam raids, bot attacks, and excessive messaging.

How It Works

  1. Bot monitors configured channels for message activity
  2. Every 5 seconds, bot counts messages in the last 5-second window
  3. If message count exceeds threshold, bot applies slowmode
  4. Slowmode restricts users to 1 message per configured interval
  5. With auto-increment enabled, slowmode escalates for sustained spam
  6. Users with "Manage Channel" or "Manage Messages" permissions are exempt

Configuration

1. Enable Auto Slow Mode

Toggle Enable Auto Slow Mode to activate the system.

Members can be dynamically restricted to sending one message and creating one thread per selected interval, unless they have Manage Channel or Manage Messages permissions.

2. Select Channels to Monitor

Choose which channels should be protected:

  1. Click Select Channel(s) under "Chats to monitor"
  2. Select one or multiple channels
  3. Selected channels appear as tags with or between them
  4. Click X on any channel to remove it

Example: Monitor #general or #memes or #off-topic

3. Configure Message Threshold

Set how many messages trigger slowmode:

  1. Enter a number in "If messages in the last 5s are more than"
  2. Bot checks every 5 seconds
  3. If message count exceeds this number, slowmode is applied

Example: Set to 12 messages
If 13+ messages are sent in any 5-second window, slowmode activates.

4. Select Slowmode Duration

Choose how long users must wait between messages:

  1. Click the dropdown under "โ‡พ apply slowmode"
  2. Select duration from 5 seconds to 6 hours
  3. This becomes the base slowmode duration
Available Durations
5 seconds10 seconds15 seconds30 seconds1 minute2 minutes5 minutes10 minutes15 minutes30 minutes1 hour2 hours6 hours

5. Auto Increment (Optional)

Enable Auto increment to escalate slowmode automatically if spam continues.

How It Works

When spam persists at higher message thresholds, the bot automatically increases slowmode duration:

  • Base threshold: 12 msgs โ†’ 5 seconds slowmode
  • 2x threshold: 24 msgs โ†’ 10 seconds slowmode
  • 4x threshold: 48 msgs โ†’ 15 seconds slowmode
  • 8x threshold: 96 msgs โ†’ 30 seconds slowmode
Preview

The dashboard shows a preview of increment levels based on your settings:

If last 5sincrement

24 msgs โ†’ 10 seconds

48 msgs โ†’ 15 seconds

96 msgs โ†’ 30 seconds

192 msgs โ†’ 1 minute

โš ๏ธ Auto Increment Requirements

  • You must set a minimum trigger amount (cannot be 0)
  • Higher slowmode durations must be available in the list
  • If no higher levels exist, increment won't trigger

Permission Exemptions

Users with these permissions are always exempt from slowmode:

  • Manage Channel
  • Manage Messages

This ensures staff can always communicate freely during spam incidents.

Use Cases

Spam Raid Protection

Set threshold to 15 msgs, slowmode to 10 seconds, enable auto-increment. When raiders spam, slowmode escalates automatically.

High-Traffic Channels

For busy channels like #general, set higher threshold (20 msgs) with shorter slowmode (5 seconds) to manage conversation flow without disrupting normal chat.

Event Overflow Control

During events or announcements, enable slowmode on #announcements with low threshold (8 msgs) and long duration (30 seconds) to maintain readability.

Temporary Spam Prevention

Enable slowmode only during known vulnerable times (late night, when staff are offline) by toggling the feature on/off as needed.

๐Ÿ”ง Troubleshooting

โŒ Events Not Triggering Automation

Problem: Events are created but nothing happens

Solution:

  • Verify the trigger is Enabled
  • Check that event was created in a monitored channel
  • Confirm creator meets global role requirements
  • Ensure bot has permissions in thread and announcement channels
  • Check bot role hierarchy for role pings

โŒ Threads Not Being Created

Problem: Announcements send but no thread appears

Solution:

  • Verify a thread channel is selected
  • Bot needs "Create Public/Private Threads" permission
  • Check that thread channel still exists
  • Thread names must be under 100 characters
  • For private threads, bot needs "Manage Threads" permission

โŒ Users Not Added to Thread

Problem: Users click "Interested" but aren't added to thread

Solution:

  • Bot needs "Manage Threads" permission
  • For private threads, bot must have access to the thread
  • Check that the thread wasn't manually archived
  • Verify bot is still online and responding

โŒ Role Pings Not Working

Problem: Roles mentioned but no ping sent

Solution:

  • Bot role must be above pinged roles in hierarchy
  • Roles must have "Allow anyone to mention this role" enabled
  • Bot needs "Mention Everyone" permission for @everyone/@here
  • Check that roles still exist and weren't deleted

โŒ Slowmode Not Activating

Problem: Spam occurs but slowmode doesn't apply

Solution:

  • Confirm Auto Slow Mode toggle is enabled
  • Verify channels are selected in monitor list
  • Bot needs "Manage Channel" permission
  • Check that threshold is set (not 0)
  • Ensure bot is online and monitoring
  • Slowmode duration must be selected from dropdown

โŒ Auto Increment Not Working

Problem: Spam continues but slowmode doesn't escalate

Solution:

  • Auto increment toggle must be enabled
  • Base trigger amount cannot be 0
  • Higher slowmode durations must be available in the list
  • Check preview to see available increment levels
  • If preview shows "No higher slowmode levels available", select shorter base duration

โŒ Announcements Not Sending

Problem: Thread creates but announcements don't appear

Solution:

  • Verify announcement channels are selected
  • Bot needs "Send Messages" permission in announcement channels
  • Check that message text isn't empty
  • Ensure announcement channels still exist
  • Variables must use exact format: {event_title}

โœจ Best Practices

Event Automation

  • Test thoroughly: Create test events to verify triggers work correctly
  • Use descriptive thread names: Include date and title for easy navigation
  • Limit role pings: Only ping roles that need immediate notification
  • Monitor thread channels: Choose channels where threads make sense contextually
  • Global requirements: Use global settings for server-wide restrictions, per-trigger settings for specific cases
  • Multiple triggers: Create separate triggers for different event types or communities
  • Private vs public: Use private threads for staff/member-only events

Auto Slow Mode

  • Start conservative: Begin with higher thresholds and adjust based on actual spam patterns
  • Monitor high-traffic channels: Protect channels most vulnerable to spam
  • Use auto-increment: Enable for maximum protection against sustained raids
  • Test limits: Use an alt account to test threshold accuracy
  • Staff exemptions: Ensure staff have Manage Channel/Messages permissions
  • Combine with moderation: Use slowmode alongside other anti-spam measures
  • Document settings: Keep notes on what thresholds work for your community size

โš ๏ธ Important Notes

Event Automation
  • Global creator requirements apply to all triggers before individual settings
  • Thread names are truncated at 100 characters automatically
  • Users removed from events are also removed from threads
  • Pings are sent in batches every 3 seconds to avoid rate limits
  • Bot must remain online to process "Interested" clicks
  • Event URLs in announcements are automatically appended to avoid formatting issues
Auto Slow Mode
  • Slowmode checks occur every 5 seconds, not instantly
  • Users with Manage Channel/Messages permissions are always exempt
  • Auto-increment multiplies thresholds by 2x, 4x, 8x, etc.
  • Slowmode affects both messages and thread creation
  • Bot needs "Manage Channel" permission to apply slowmode
  • Changes to settings don't affect currently applied slowmode

Messaging System

Create and send custom messages with embeds, role pings, and interactive reaction role buttons. Perfect for announcements, role selection menus, server rules, and automated role assignments.

overview

๐Ÿ“‹ Overview

The Messaging System allows you to create rich Discord messages that can be sent to any channel. Messages can include embedded content with colors and images, role mentions, and interactive buttons that assign or remove roles when clicked by members.

  • Embed Messages: Rich formatted messages with colors, thumbnails, and images
  • Normal Text: Simple plain text messages without embeds
  • Role Pings: Mention specific roles in your messages
  • Reaction Roles: Interactive buttons that toggle role assignments
  • Unlimited Messages: Create as many custom messages as needed

How It Works

Message Creation Process

  1. Create a new message from the dashboard sidebar
  2. Configure message settings (channel, color, content type)
  3. Add text content and optional media (thumbnails, images, videos, GIFs)
  4. Optionally add role pings and reaction role buttons
  5. Send the message to the selected channel

Example Use Case: Create a "Choose Your Roles" message with buttons for Member, Gamer, Artist, and News roles. Members click buttons to self-assign roles without needing moderator assistance.

Message Types

๐Ÿ“ Normal Text vs Embed

  • Normal Text: Simple plain text message, no formatting or media
  • Embed: Rich message with color bar, thumbnail, image, and formatted text
  • Toggle the "Normal Text" checkbox to switch between types
  • Embed messages are more visually appealing and support media attachments

Configuration Guide

Step 1: Create a Message

Click the NEW MSG button in the sidebar to create a message. Each message appears as "Msg 1", "Msg 2", etc. in the list.

Step 2: Select Channel

Click the Select Channel dropdown to choose where the message will be sent. The bot must have permission to send messages in the selected channel.

Step 3: Configure Message Style (Embed Only)

For embed messages, customize the appearance:

  • Color: Click the colored circle to choose an embed color (default: #636ee6)
  • Thumbnail: Small image in the top-right corner (optional)
  • Picture/Video/GIF: Large media below the message text (optional)

Media URLs must be direct links from Discord CDN or other hosting services:
https://cdn.discordapp.com/attachments/...

Step 4: Add Role Pings (Embed Only)

Click the + button to add roles that will be mentioned when the message is sent. This notifies all members with those roles.

  • Select roles from the dropdown menu
  • Multiple roles can be added
  • Click a role's x to remove it
  • Role pings only work in embed mode

โš ๏ธ Role Ping Limitations

  • Roles must have "Allow anyone to @mention this role" enabled in Discord
  • Or the bot must have "Mention All Roles" permission
  • Pinging @everyone or @here is not supported through this system

Step 5: Write Message Content

Enter your message text in the large text area. For embed messages, this becomes the embed description. For normal text, it's the message content.

Supported formatting:

  • **bold text** - Bold text
  • *italic text* - Italic text
  • __underline__ - Underlined text
  • `code` - Inline code
  • ```code block``` - Code block
  • [link text](url) - Hyperlinks (embed only)

Reaction Role Buttons

What Are Reaction Roles?

Reaction roles are interactive buttons attached to messages that allow members to self-assign or remove roles by clicking. This eliminates the need for manual role assignments by moderators.

Adding Buttons

  1. Click the + button in the "add react role button" section
  2. A new button appears with default label "Button"
  3. Click the button to open the configuration modal
  4. Configure the button settings (see below)
  5. Add up to 25 buttons per message (Discord limitation)

Button Configuration

Button Settings

  • Label: The text displayed on the button (max 80 characters)
  • Style: Button color/appearance (Primary, Secondary, Success, Danger)
  • Emoji: Optional emoji to display before or instead of label
  • Role: The role that will be assigned/removed when clicked
  • Disabled: Option to temporarily disable a button

Button Styles

  • Primary (1): Blurple/purple button (default Discord color)
  • Secondary (2): Gray button
  • Success (3): Green button
  • Danger (4): Red button

How Reaction Roles Work

When a member clicks a reaction role button:

  1. The bot checks if the member already has the role
  2. If they have it: Role is removed, bot replies "โŒ Removed role **RoleName**"
  3. If they don't have it: Role is added, bot replies "โœ… Assigned role **RoleName**"
  4. The reply is ephemeral (only visible to the member who clicked)

Example Setup: Create a "Notification Preferences" message with buttons for @Updates (primary blue), @Events (green), @Announcements (blurple). Members can click to toggle which notifications they receive.

โš ๏ธ Reaction Role Limitations

  • Administrator Protection: Cannot assign roles with Administrator permission
  • Role Hierarchy: Bot cannot assign roles higher than its own highest role
  • Bot Permissions: Bot needs "Manage Roles" permission
  • Button Limit: Maximum 25 buttons per message (Discord API limit)
  • Label Length: Button labels truncate after 55 characters in preview

Removing Buttons

Click the x on any button to remove it from the message. This does not affect existing messages already sent - only new messages sent after the change.

Sending Messages

Send Process

  1. Complete all message configuration
  2. Click the arrow button (โ†’) in the top-right corner
  3. The button shows a loading spinner while sending
  4. Message appears in the selected Discord channel
  5. If successful, the message is sent with all configured elements

What Gets Sent

Embed Messages:

  • Colored embed sidebar
  • Message text as embed description
  • Thumbnail in top-right corner (if configured)
  • Large image/video/GIF below text (if configured)
  • Role mentions above the embed (if configured)
  • Interactive buttons below the embed (if configured)

Normal Text Messages:

  • Plain text content only
  • Interactive buttons below text (if configured)
  • No role pings, thumbnails, or images

โš ๏ธ Common Sending Errors

  • "The Bot needs permissions..." - Bot lacks Send Messages or Embed Links permission in selected channel
  • No channel selected: Select a channel before sending
  • Invalid media URL: Ensure thumbnail/picture URLs are valid direct links
  • Button configuration incomplete: All buttons must have a role assigned

Managing Messages

Editing Messages

Changes made to messages in the dashboard only affect new messages sent after the changes. Previously sent messages in Discord channels are not automatically updated.

Deleting Messages

Click the Delete Message button to remove a message configuration from the dashboard. This does not delete messages already sent to Discord channels - those must be manually deleted in Discord by someone with Manage Messages permission.

Message Organization

  • Messages appear as "Msg 1", "Msg 2", etc. in the sidebar
  • Click any message to select and edit it
  • Active message is highlighted with darker background
  • Create unlimited messages for different purposes

Use Cases & Examples

1. Role Selection Menu

Purpose: Let members choose optional roles
Setup: Embed message with title "Choose Your Roles"
Buttons: Gamer (green), Artist (blue), Developer (purple), News (gray)
Channel: #role-selection

2. Server Rules with Agreement

Purpose: Display rules and grant Member role upon agreement
Setup: Embed with rules text and thumbnail (server icon)
Buttons: "I Agree to the Rules" (green) โ†’ assigns @Member
Channel: #rules

3. Event Notifications

Purpose: Let members opt into event pings
Setup: Embed explaining event notification types
Buttons: Tournament Alerts (red), Movie Nights (blue), Game Sessions (green)
Channel: #notifications

4. Important Announcements

Purpose: Send formatted announcements with role pings
Setup: Embed with custom color, announcement text, banner image
Role Pings: @everyone or @Members
Channel: #announcements

5. Platform Roles

Purpose: Let gamers select their gaming platforms
Setup: Embed with gaming controller thumbnail
Buttons: PC (blue), PlayStation (blue), Xbox (green), Nintendo (red), Mobile (gray)
Channel: #platform-selection

Best Practices

Message Design

  • Keep text concise: Short, clear instructions work best
  • Use descriptive button labels: "Get Updates Role" better than just "Updates"
  • Group related buttons: Put similar roles together visually
  • Match button colors to purpose: Green for positive, red for warnings, blue for neutral
  • Test before sending: Verify all settings in a test channel first

Role Organization

  • Create role categories: Separate notification roles from game roles from platform roles
  • Use clear role names: @Game-Updates not @Updates
  • Set role colors: Makes roles distinguishable in member lists
  • Position roles correctly: Ensure bot role is higher than reaction roles in hierarchy

Channel Setup

  • Dedicated channels: #roles or #role-selection for role menus
  • Lock channels: Read-only except for bot messages prevents clutter
  • Pin important messages: Pin role selection messages for easy access
  • Clear old messages: Remove outdated role messages to avoid confusion

๐Ÿ’ก Pro Tips

  • Use emojis in button labels to make them more visually appealing (๐ŸŽฎ Gamer, ๐ŸŽจ Artist)
  • Create separate messages for different role categories rather than one giant message
  • Test reaction roles with an alt account to verify permissions work correctly
  • Document which message corresponds to which purpose in your server admin notes
  • Regularly audit which roles are assigned through reaction roles for analytics

Troubleshooting

Message Won't Send

Check These Items:

  • Channel is selected from dropdown
  • Bot has Send Messages permission in that channel
  • Bot has Embed Links permission (for embed messages)
  • Message text is not empty
  • Media URLs are valid and accessible
  • You've saved guild settings before sending

Reaction Roles Not Working

Common Issues:

  • Role not assigned: Ensure each button has a role selected in configuration
  • "Cannot assign role" error: Bot role must be higher than target role in server settings
  • "Error adding role" message: Bot lacks Manage Roles permission
  • Admin role error: Cannot assign Administrator roles (security protection)
  • Button not responding: Ensure button isn't set to disabled in configuration

Media Not Displaying

If thumbnails or images don't appear:

  • Verify URL is a direct link to image file (ends in .png, .jpg, .gif, etc.)
  • Use Discord CDN links when possible: https://cdn.discordapp.com/attachments/...
  • Check if external image host allows embedding (some sites block it)
  • Ensure URL uses HTTPS, not HTTP
  • Test URL by pasting it in browser to verify image loads

Role Pings Not Working

If roles aren't being mentioned:

  • Ensure role has "Allow anyone to @mention" enabled in Discord role settings
  • Or grant bot "Mention All Roles" permission
  • Verify you're using embed mode (role pings don't work in normal text)
  • Check that roles selected in dashboard still exist in Discord
  • Save guild settings and resend the message

Button Configuration Not Saving

If button changes aren't persisting:

  • Ensure you click outside the modal or close it properly after making changes
  • Verify role exists in the server
  • Check browser console for JavaScript errors
  • Try refreshing roles from the dashboard
  • Save guild settings after making button changes

Technical Details

Message Structure

Each message configuration stores:

  • id - Unique identifier (timestamp-based)
  • name - Display name (always "Message")
  • channel - Target channel ID
  • normalText - Boolean: true for plain text, false for embed
  • text - Message content/embed description
  • color - Hex color for embed sidebar
  • thumbnail - Small image URL
  • picture - Large media URL
  • pings - Array of role IDs to mention
  • buttons - Array of button configurations

Button Structure

Each button contains:

  • btnId - Unique button identifier
  • label - Button text (max 80 chars)
  • style - Integer 1-4 (Primary, Secondary, Success, Danger)
  • custom_id - Discord interaction ID (format: REACT + timestamp)
  • emoji - Optional emoji object (id, name, animated)
  • disabled - Boolean to disable button
  • type - Always 2 (Discord button component type)

API Endpoint

Messages are sent via:

GET /api/senmessageembed?guild=GUILD_ID&msgId=MESSAGE_ID

The endpoint retrieves the message configuration and sends it to the configured channel using the Discord API.

Interaction Handling

When a button is clicked, the bot:

  1. Receives interaction with custom_id starting with "REACT"
  2. Extracts role ID from button configuration
  3. Checks if role exists and isn't an admin role
  4. Toggles role assignment (add if missing, remove if present)
  5. Sends ephemeral confirmation message to user
  6. Handles errors gracefully with user-friendly messages

๐ŸŽฏ Quick Reference

Maximum Limits:

  • Messages per server: Unlimited
  • Buttons per message: 25 (Discord limit)
  • Button label length: 80 characters
  • Embed description: 4096 characters
  • Role pings per message: Unlimited (within Discord limits)

Required Permissions:

  • Send Messages (in target channel)
  • Embed Links (for embed messages)
  • Manage Roles (for reaction roles)
  • View Channel (must see the target channel)

Statistics & Analytics

Comprehensive analytics dashboard tracking application submissions, processing times, staff performance, and user demographics. Analyze trends with interactive charts, identify peak activity periods, and optimize your recruitment workflow with data-driven insights.

overview

๐Ÿ“Š Overview

The Statistics system provides deep insights into your application process with real-time data visualization, historical trends, and performance metrics. All statistics are cached locally using IndexedDB for instant loading and automatically update incrementally to minimize data transfer.

  • Global Statistics: Server-wide application metrics across all application types
  • Per-App Analytics: Detailed breakdowns for each application form
  • Time-Based Analysis: Daily, hourly, and historical trend tracking
  • Staff Performance: Track reviewer productivity and decision ratios
  • Geographic Insights: See where your applicants come from by locale
  • Smart Caching: Lightning-fast load times with incremental updates

How It Works

Data Loading System

The statistics system uses an intelligent caching strategy to provide fast, efficient data access:

  1. Initial Load: First access fetches complete dataset from server
  2. Local Caching: Data stored in browser's IndexedDB (persistent storage)
  3. Incremental Updates: Subsequent loads only fetch new applications added since last update
  4. Freshness Check: Cached data considered fresh for 30 minutes
  5. Chunked Transfer: Large datasets split into manageable chunks for stability

Performance Example: A server with 10,000 applications takes ~5-10 seconds for initial load, but subsequent visits load instantly from cache. Only new applications since last visit are fetched, typically completing in under 1 second.

When Data Updates

  • Fresh Data (0-30 minutes): Loaded instantly from IndexedDB cache
  • Recent Data (30 min - 7 days): Incremental update fetches only new applications
  • Stale Data (7+ days): Full refresh fetches complete updated dataset
  • Force Refresh: Manual refresh button clears cache and refetches all data

๐Ÿ’ก Cache Management

  • Data is cached per Discord server (guild) separately
  • Cache survives browser restarts and tab closures
  • Clearing browser data removes cached statistics
  • Cache size displayed in header (e.g., "2.35 MB")
  • No manual cache management needed - system handles everything automatically

Global Statistics

Server-Wide Metrics

The top section displays aggregate statistics across all application types in your server:

  • Total Apps: Complete count of all applications ever submitted
  • Submitted: Applications completed and awaiting review
  • Denied: Applications rejected by staff
  • Accepted: Applications approved by staff
  • Started: Applications begun but not yet submitted

Each statistic shows:

  • Absolute count (e.g., "1,234")
  • Percentage of total (e.g., "45%")
  • Color-coded status indicators

Global Status Pie Chart

Visual representation of application status distribution across your entire server. Instantly see the proportion of submitted vs processed applications.

Timeline Stacked Bar Chart

Shows application submissions over time with each application type represented as a colored layer. Displays last 120 days of activity, allowing you to identify trends and seasonal patterns.

Use Case: Notice a sudden spike in applications? Cross-reference with server events or recruitment campaigns. See which application types are most popular during different periods.

Per-Application Analytics

Selecting an Application

Use the dropdown menu to select a specific application type for detailed analysis. The dropdown shows:

  • Application name (e.g., "Moderator Application")
  • Total submission count (e.g., "(1,234 apps)")
  • Applications sorted by submission count (most popular first)

Application-Specific Stats Cards

Detailed breakdown for the selected application:

๐Ÿ“ˆ Key Metrics

  • Total Apps: All submissions for this application type
  • Submitted: Completed apps awaiting review (hover to see latest 5)
  • Denied: Rejected applications (hover to see latest 5 with staff names)
  • Accepted: Approved applications (hover to see latest 5 with staff names)
  • Started: Incomplete applications (hover to see latest 5)
  • Avg Completion: Average time from start to submit
  • Avg Processing: Average time from submit to staff decision

Interactive Hover Tooltips

Hover over any stat card to see additional details:

  • Status Cards: Show 5 most recent applications with timestamps
  • Staff Actions: Display staff member name and decision time
  • Time Metrics: Explain what the average includes

Example Tooltip: Hovering over "Denied" shows:
Latest 5 Denied
ModeratorJohn - 1/14/26, 2:30 PM
AdminSarah - 1/14/26, 1:15 PM
StaffMike - 1/14/26, 11:00 AM

Time Analysis

Average Completion Time

Measures how long applicants take to complete an application from clicking "Start" to hitting "Submit". This metric helps identify if your application is too long or confusing.

  • Calculated only for submitted applications
  • Excludes outliers (applications taking more than 1 week)
  • Format: Hours (27h), Minutes:Seconds (12:34m), or Seconds (34s)
  • Lower times indicate smoother application flow

Benchmark: Most well-designed applications average 15-45 minutes. If yours shows 2+ hours, consider simplifying questions or reducing required fields.

Average Processing Time

Measures time between application submission and staff decision (accept/deny). Indicates how quickly your team reviews applications.

  • Calculated only for accepted or denied applications
  • Excludes outliers (processing taking more than 1 week)
  • Shows responsiveness of your recruitment team
  • Lower times improve applicant experience

Target: Aim for processing times under 24 hours for active communities. Long processing times (3+ days) can lead to applicants losing interest or joining competitors.

โฑ๏ธ Time Format Explained

  • 0s: No data available or zero duration
  • 34s: Less than 1 minute (seconds only)
  • 12:34m: Less than 1 hour (minutes:seconds)
  • 27h: Exactly N hours with no minutes/seconds
  • 2:12:43: Full format (hours:minutes:seconds)

Visual Charts

Status Distribution Pie Chart

Shows proportion of each status (Submitted, Accepted, Denied, Started) for the selected application. Color-coded for quick status recognition:

  • White/Gray (#eaeaeaff): Submitted
  • Green (#26ea64ff): Accepted
  • Red (#f04747): Denied
  • Dark Gray (#737373ff): Left (abandoned)
  • Blue (#636dd8ff): Started

Applications per Day (Line Chart)

Displays daily submission volume over the last 120 days (~4 months). The smooth line chart reveals trends, patterns, and seasonal fluctuations.

Use this chart to:

  • Identify peak application periods
  • Correlate activity with server events or promotions
  • Predict staffing needs for review teams
  • Detect declining interest (downward trend)
  • Measure impact of recruitment drives

Applications per Hour (Last 4 Days)

Bar chart showing hourly submission rates over the past 96 hours (4 days). Each bar represents one hour, allowing you to identify specific times when applicants are most active.

Strategic Use: If most applications arrive 2-6 PM EST, schedule staff reviews for 3-7 PM to minimize applicant wait times. Discover your community's timezone patterns.

Timeline Stacked Bar Chart (Global)

Shows all applications across all types over the last 120 days. Each application type is a colored layer stacked on top of others, revealing which applications dominate at different times.

  • Up to 5 predefined colors for visual clarity
  • Additional applications get algorithmically generated distinct colors
  • Hover over bars to see exact counts per application type
  • Legend shows application names (not IDs)

Geographic Analytics

Top Locales

Displays the top 10 regions/countries where your applicants are from, based on Discord locale settings. Each entry shows:

  • Country Flag: Visual representation using flag-icons CSS library
  • Unique Users: Count of distinct users from that locale
  • Percentage: Proportion of total applicants

Locale Data Includes:

  • en-US ๐Ÿ‡บ๐Ÿ‡ธ - United States English
  • en-GB ๐Ÿ‡ฌ๐Ÿ‡ง - United Kingdom English
  • es-ES ๐Ÿ‡ช๐Ÿ‡ธ - Spanish
  • pt-BR ๐Ÿ‡ง๐Ÿ‡ท - Brazilian Portuguese
  • ru ๐Ÿ‡ท๐Ÿ‡บ - Russian
  • de ๐Ÿ‡ฉ๐Ÿ‡ช - German
  • fr ๐Ÿ‡ซ๐Ÿ‡ท - French
  • And many more Discord-supported locales

Use Case: Discovering 30% of applicants are from Brazil might indicate need for Portuguese-speaking staff or translated application materials. Geographic data helps plan server events at appropriate times for your primary audience.

๐ŸŒ Locale Limitations

  • Based on Discord account locale setting (not IP geolocation)
  • Users can change locale settings, affecting accuracy
  • Counts unique users, not total applications (one user = one count)
  • Some locales may not have flag icons (shows ๐ŸŒ fallback)
  • Only shows data for the currently selected application type

Staff Performance Tracking

Staff Statistics Table

Comprehensive breakdown of each staff member's application review activity. The table displays:

  • Name: Staff member's Discord username
  • Total: Total applications processed (accepted + denied)
  • Accepted: Number of applications approved
  • Denied: Number of applications rejected
  • Percentage: Share of total applications processed across all staff

Table Features

  • Sortable Columns: Click any column header to sort by that metric
  • Descending Sort: Default sorts by total processed (highest first)
  • Color Coding: Accepted (green) and Denied (red) for quick scanning
  • Name Formatting: Long names truncated with ellipsis (โ€ฆ)
  • Number Formatting: Large numbers include commas (1,234)
  • Smooth Animations: Rows animate when sort order changes

Management Insights:
- Identify top performers for recognition or promotion
- Spot inactive reviewers who need follow-up
- Ensure fair workload distribution across team
- Analyze accept/deny ratios for consistency
- Track new staff member onboarding progress

Workload Distribution

The percentage column shows each staff member's share of total review workload. This helps identify:

  • Overburdened staff carrying disproportionate workload
  • Underutilized team members who could handle more reviews
  • Need to recruit additional reviewers
  • Impact when staff members go inactive

Example Analysis: If one staff member shows 65% of total processing, they're shouldering most of the work. Consider recruiting more reviewers or redistributing responsibilities.

๐Ÿ“Š Staff Metrics Notes

  • Only includes Accept/Deny actions (not submissions or incomplete apps)
  • Staff member must click Accept/Deny button to be tracked
  • Name pulled from staff.name field at time of decision
  • If staff member leaves server, historic stats remain
  • Percentage based on total processed by ALL staff, not total applications
  • Statistics persist even after staff member loses review permissions

Data Caching Technical Details

IndexedDB Storage

Statistics are stored in browser's IndexedDB, a persistent client-side database. This provides:

  • Large Storage Capacity: Can store hundreds of MB of data
  • Persistent Storage: Survives browser restarts and crashes
  • Per-Guild Isolation: Each Discord server has separate cache
  • Automatic Management: No user intervention required

Chunking for Large Datasets

When statistics exceed certain thresholds, data is transferred in chunks to prevent timeouts:

  • Server determines if chunking needed based on data size
  • Data split into manageable pieces (typically 1000-2000 applications per chunk)
  • Progress indicator shows chunk loading (e.g., "Loading... 60%")
  • Chunks merged client-side into complete dataset
  • Final combined data saved to IndexedDB cache

Incremental Updates

For cached data less than 7 days old, only new applications are fetched:

  1. System checks last update timestamp from cache
  2. API called with ?since=TIMESTAMP parameter
  3. Server returns only applications submitted after that timestamp
  4. New applications merged with cached data
  5. Combined dataset saved back to cache

Efficiency: A server with 5,000 total applications but only 50 new ones since yesterday will transfer just 50 applications (~10 KB) instead of all 5,000 (~500 KB). This is 50x faster and uses 98% less bandwidth.

Cache Information Display

The header shows cache details for transparency:

  • Source: "IndexedDB Cache", "Fresh API", "Incremental update (+50 new)"
  • Last Updated: Timestamp of when data was last refreshed
  • Size: Total storage size in MB (e.g., "2.35 MB")
  • Total Apps: Count of applications in cache

Best Practices

Performance Optimization

  • Let Cache Work: Don't force refresh unless absolutely necessary
  • Wait for Load: Large datasets may take 10-30 seconds on first load
  • Use Incremental: System automatically chooses best update strategy
  • Monitor Size: Cache over 50 MB may indicate need for data archival

Data Analysis Tips

  • Compare Periods: Look at different date ranges to identify trends
  • Cross-Reference: Match spikes with server events or campaigns
  • Monitor Ratios: Track accept:deny ratio for quality control
  • Time Awareness: Consider timezones when analyzing hourly patterns

Using Insights for Improvement

Scenario 1 - High Denial Rate: If 70%+ applications are denied, your requirements may be unclear. Add FAQ section or example good applications.

Scenario 2 - Long Completion Times: Average over 1 hour suggests application too complex. Consider removing redundant questions or simplifying language.

Scenario 3 - Slow Processing: 48+ hour processing means applicants waiting too long. Recruit more reviewers or schedule dedicated review sessions.

Scenario 4 - High Started/Low Submitted: Many started but few submitted indicates applicants abandoning process. Simplify or add progress indicators.

๐Ÿ’ก Pro Analysis Tips

  • Export data for external analysis (feature pending) by inspecting browser IndexedDB
  • Compare statistics before/after application changes to measure impact
  • Track weekly submission volumes to predict staffing needs
  • Use locale data to plan language support priorities
  • Monitor staff ratios to prevent reviewer burnout
  • Set internal KPIs (e.g., "process within 24 hours") and track compliance

Troubleshooting

Statistics Won't Load

Common Solutions:

  • Check Network: Ensure stable internet connection
  • Verify Guild Access: Confirm you have permissions for this server
  • Try Force Refresh: Click refresh button to bypass cache
  • Clear Browser Data: Clear site data if cache is corrupted
  • Check Server Status: Bot must be online and responding
  • Large Dataset: First load of 10,000+ applications may take 30+ seconds

Data Seems Inaccurate

If numbers don't match expectations:

  • Cache Staleness: Force refresh to get latest data
  • Incomplete Sync: If loading interrupted, force refresh to restart
  • Status Mismatch: Ensure applications properly marked with status
  • Time Calculations: Check that submitTime and timeStarted fields exist
  • Staff Tracking: Staff actions only count if using Accept/Deny buttons

Charts Not Displaying

If charts appear blank or broken:

  • Ensure Chart.js library loaded (check browser console)
  • Verify data exists for selected application type
  • Try selecting different application from dropdown
  • Check if applications have required timestamp fields
  • Clear cache and reload if charts consistently fail

Slow Performance

If statistics page is sluggish:

  • Clear Old Cache: Force refresh clears and rebuilds cache
  • Browser Resources: Close unnecessary tabs consuming memory
  • Large Datasets: 50,000+ applications may impact performance
  • Chart Rendering: Complex charts with many data points are resource-intensive
  • Consider Archival: Archive old applications to reduce dataset size

Missing Staff Names

If staff statistics show IDs instead of names:

  • Staff names captured at time of decision, not current display names
  • If staff member left server, historic name preserved
  • Ensure bot can see staff member's profile when they make decisions
  • Username changes don't retroactively update historical statistics

๐ŸŽฏ Quick Reference

Key Metrics:

  • Completion Time: Start โ†’ Submit (user perspective)
  • Processing Time: Submit โ†’ Decision (staff perspective)
  • Staff %: Individual's share of total reviews
  • Cache Freshness: 30 minutes for instant loads
  • Chart History: Last 120 days (~4 months)

Performance Targets:

  • Completion Time: 15-45 minutes (optimal)
  • Processing Time: Under 24 hours (responsive)
  • Accept Rate: 30-50% (balanced standards)
  • Staff Distribution: No one over 40% (balanced workload)

System Limits:

  • No maximum applications tracked
  • Cache size scales with data (typically 1-50 MB)
  • Chunking activates automatically for large datasets
  • Incremental updates for data less than 7 days old

Commands Reference

AppBot provides three primary commands for managing and viewing applications. These commands allow users to check bot information, view application history, and manage in-progress applications.

๐Ÿ“‹ Available Commands

  • /info - Display bot information, server statistics, and quick actions
  • Right-click โ†’ Apps โ†’ View User Applications - Context menu to view any user's application history (Premium)
  • /cancel - Cancel an in-progress application (DM only)

Command Locations

Commands are available in different contexts depending on their purpose:

  • Server Commands: /info and context menu commands work within Discord servers
  • DM Commands: /cancel only works in direct messages with the bot
  • Context Menus: Right-click user profiles to access application history

๐Ÿ’ก Quick Tip

Use /info as your central hub for server statistics and quick actions. Administrators see additional options for managing applications and server settings.

/info Command

The /info command is your central hub for AppBot information, server statistics, and quick access to application management features.

๐Ÿ“Š What It Shows

The command displays different information based on your permissions and server configuration:

  • Bot description and quick links (dashboard, support, voting)
  • Server application statistics and limits
  • Quick action buttons for viewing applications
  • Application enable/disable controls (for authorized users)

Server Statistics Display

Based on your server's premium status, you'll see different statistics:

Free Tier Servers

Example:
This Month Apps: 12/15
This Month Votes: 8/40

Shows monthly application usage out of the free tier limit and vote count toward unlocking additional features.

Vote Servers

Example:
This Month Apps: 28/40
This Month Votes: 42/40

Servers that reach 40 votes unlock increased limits (40 apps per month).

Prepaid Servers

Example:
Apps Utilized: 156/500

Shows total application usage out of purchased application cap (no monthly reset).

Premium Servers

Premium subscribers see no usage statistics as they have unlimited applications.

Quick Action Buttons

The command provides immediate access to common tasks:

โณ Show Incomplete Apps

View all applications that users have started but not yet submitted. Useful for following up with applicants who may need assistance.

๐Ÿ“‹ Show Submitted Apps

View all submitted applications awaiting review. This gives you a quick overview of pending applications without opening the dashboard.

๐ŸŽ Gift Premium - Apps

This button appears for non-premium servers and allows you to purchase premium features or application packs. It shows when:

  • Server doesn't have free premium
  • Server doesn't have an active premium subscription, OR
  • Premium subscription last payment was over 32 days ago

Application Enable/Disable Controls

Users with appropriate permissions see additional controls for managing applications:

Who Sees These Controls?

  • Administrators: See controls for ALL applications (up to 25 due to Discord limits)
  • Global Disableable Permission: Users with roles assigned in "Allow Disableable Apps" setting see controls for all applications
  • Per-App Permission: Users with roles assigned to specific applications see controls only for those applications

Display Format

Controls appear as either buttons or a dropdown menu:

  • Buttons: When you have permission for 5 or fewer applications, each appears as a labeled button
  • Dropdown Menu: When you have permission for more than 5 applications, a multi-select menu appears instead

Example Button: [Moderator Application]
Example Dropdown: Select apps to disable/enable... (with checkboxes for each app)

Important Links

The info embed always includes these helpful links:

  • Video Tutorial: Complete setup walkthrough
  • Setup Guide: Step-by-step configuration instructions
  • Dashboard: Access the web-based configuration panel
  • Premium: Learn about premium features and pricing
  • Invite Bot: Add AppBot to another server
  • Support Server: Get help from the community
  • Vote for Bot: Support AppBot on Top.gg (includes guild-specific vote link)

โš ๏ธ Important Notes

  • All responses are ephemeral (only visible to you)
  • Application enable/disable controls require proper role permissions set in the dashboard
  • The command shows guild-specific vote links to help track which servers are voting

๐Ÿ’ก Use Cases

  • Quickly check how many applications your server has processed this month
  • Enable/disable applications during off-peak hours without accessing the dashboard
  • Share vote links with your community to unlock free premium features
  • Monitor incomplete applications to follow up with users who need help

Context Menu: View User Applications

The context menu command allows you to view any user's complete application history by right-clicking their profile. This powerful feature helps moderators track applicant history and identify patterns.

๐Ÿ” Premium Feature

This command requires your server to have one of the following:

  • Active premium subscription
  • Free premium status
  • Prepaid application package

How to Use

  1. Right-click on any user's profile in your server
  2. Navigate to Apps in the context menu
  3. Select View User Applications
  4. The bot displays the user's complete application history

Information Displayed

The command shows a comprehensive overview of the user's history with your server:

User Information

  • Username: Current Discord username
  • User ID: Discord snowflake ID
  • Discord Created: When the Discord account was created
  • Joined: When the user joined your server (or "user left" if no longer a member)

Application History

All applications are listed with status indicators and clickable links:

Status Indicators:
โšช Submitted (awaiting review)
๐ŸŸข Accepted
๐Ÿ”ด Denied/Rejected

Each application shows:

  • Status indicator
  • Submission date (e.g., "Jan 14 2026")
  • Clickable link to the application thread

Example Display:
[๐ŸŸข Dec 15 2025 app] (link)
[โšช Jan 8 2026 app] (link)
[๐Ÿ”ด Jan 10 2026 app] (link)

Incomplete Applications

If the user has started but not completed any applications, these appear at the top in a separate gray embed:

What It Shows

  • Timestamp: When they started the application (relative time, e.g., "2 hours ago")
  • Answers Preview: Their current progress through the application questions
  • Question Numbers: Shows which questions they've answered so far

Example Incomplete App:
User did start an application 3 hours ago, but did not complete it yet

1 I'm interested in joining the moderator team
2 Yes, I have previous experience
3 About 15 hours per week...

Each answer is numbered and truncated if too long. This helps you see if users are struggling with specific questions or abandoning applications midway.

Display Limits

To prevent embed overflow, the command has built-in limits:

  • Character Limit: Application list is truncated at ~3400 characters
  • Answer Preview: Each answer in incomplete applications is limited to prevent spam
  • Maximum Dynamic Limit: Answer length is calculated as (1800 / number of answers) to fit all questions

If a user has an extensive application history, older applications may be truncated with the most recent always shown.

Applications Sorting

Applications are displayed in a specific order for easy review:

  • Incomplete applications: Always shown first in a separate embed
  • Completed applications: Listed in reverse chronological order (newest first)
  • Only applications with threads: Applications without thread IDs are filtered out

โš ๏ธ Important Notes

  • This command only works inside a server, not in DMs
  • The lookup is logged for security purposes (username, lookup performer, guild ID)
  • If the user has left the server, their join date shows as "user left"
  • All responses are ephemeral (only visible to you)
  • Applications from both main bot and any auxiliary bots are combined and sorted by start time

๐Ÿ’ก Use Cases

  • Background Checks: Review a user's application history before granting elevated roles
  • Pattern Detection: Identify users who repeatedly apply and get denied
  • Follow-ups: See if users abandoned applications and reach out to assist them
  • Account Age Verification: Check Discord account creation date to identify potential alt accounts
  • Re-applications: Verify how long ago a user was previously denied before allowing them to reapply
  • Training: Review accepted applications to train new moderators on what good applications look like

Troubleshooting

"Command available with premium subscription"

Your server needs premium status to use this feature. Click the "Gift Premium" button to upgrade or check your subscription status in the dashboard.

"No apps found for this user"

This user has never started an application in your server. They may be a new member or have never attempted to apply.

"No server found"

The bot hasn't been properly configured for this server. Run setup through the dashboard first.

"Command can only be used inside a server"

Context menu commands don't work in DMs. Use this command within your Discord server.

/cancel Command

The /cancel command allows users to delete an in-progress application and start fresh. This is useful when users make mistakes, want to change their approach, or accidentally started the wrong application.

๐Ÿ’ฌ DM-Only Command

This command only works in direct messages with the bot. It cannot be used in server channels.

How It Works

When a user types /cancel in their DMs with AppBot:

  1. If an in-progress application exists, the bot presents a confirmation message
  2. The user chooses to either delete the application or continue with it
  3. Deletion is immediate when confirmed - no additional confirmation required

The Confirmation Message

Users see a clear embed with two options:

๐Ÿ“ CANCEL APP IN PROGRESS?

Do you want to delete the current app and start a new one?

๐Ÿ”ด DELETE APP - Delete your current app
๐ŸŸข CONTINUE APP - Continue your current app

Delete App Button (Red)

Clicking this button immediately and permanently deletes the in-progress application. The user can then start a new application from scratch.

Continue Current App Button (Green)

Clicking this button dismisses the confirmation and allows the user to continue where they left off in their application.

When to Use /cancel

Users typically use this command when:

  • They made significant mistakes in their answers
  • They want to change their application strategy
  • They accidentally started the wrong application type
  • They want to rewrite their responses with a different tone
  • They need to step away and want to start fresh later

Important Behavior

  • One Application at a Time: Users can only have one in-progress application at a time, so /cancel always affects their current active application
  • Immediate Deletion: There is no "undo" option once the delete button is clicked
  • No Response If No Apps: If the user has no in-progress applications, the command does nothing (silent failure)
  • DM Requirement: The command will not work in server channels

โš ๏ธ Critical Warnings

  • No Undo: Deleted applications cannot be recovered. All progress is permanently lost.
  • Completed Apps: This command only affects in-progress applications. Submitted applications cannot be canceled this way.
  • DM Permissions: Users must have DMs enabled from server members. If DMs are disabled, the bot cannot send the confirmation message.

๐Ÿ’ก User Education

Consider informing your applicants about this command:

  • Include it in your application start message
  • Mention it in your server rules or application guidelines
  • Use it as a safety net for users who panic during applications

Example Guidance:
"If you make a mistake or want to start over, simply DM the bot with /cancel to delete your current application and begin fresh."

Troubleshooting

"Nothing happens when I type /cancel"

This means you don't have any in-progress applications. The command only works if you've started but not yet submitted an application.

"The bot cannot start the Direct Message process"

You need to enable Direct Messages in your Discord privacy settings:

  1. Go to User Settings โ†’ Privacy & Safety
  2. Enable "Allow direct messages from server members"
  3. Try the command again

See Discord's official guide: https://support.discord.com/hc/en-us/articles/217916488

"I want to cancel a submitted application"

Once an application is submitted, it enters the review queue and cannot be canceled via /cancel. Contact a server moderator to withdraw your application manually.

Variables Reference

Variables are dynamic placeholders that get replaced with actual data when messages are sent or threads are created. AppBot supports a comprehensive set of variables for personalizing your application workflow.

๐Ÿ”ง How Variables Work

Variables use curly braces {variable} and are replaced with real data when:

  • Application threads are created or renamed
  • Messages are sent to applicants or staff
  • Nicknames are automatically changed
  • Embeds are generated for notifications

You can use variables in thread names, messages, embeds, and automation settings throughout the dashboard.

User Variables

These variables reference the applicant's Discord account information:

{user}

Output: @User

Creates a clickable mention (ping) of the user. This is the most common way to notify applicants in messages.

Example: "Hey {user}, your application has been submitted!"
Result: "Hey @JohnDoe, your application has been submitted!"

{user_id}

Output: 1234567890

The user's unique Discord ID (snowflake). Useful for logging, webhooks, or external integrations.

{username}

Output: JohnDoe

The user's current Discord username (without the @). This is their account-level username.

{nickname}

Output: Johnny (or username if no nickname)

The user's server-specific nickname. If the user doesn't have a nickname set, this falls back to their username.

{globalname}

Output: John Doe (or username if not set)

The user's global display name (Discord's newer naming system). Falls back to username if not set.

๐Ÿ’ก Username Fallback Logic

AppBot intelligently handles empty name fields to prevent blank spaces:

  • If {username} is NOT used in your template, empty fields automatically fall back to username
  • If both {nickname} and {globalname} are empty, only the first one gets the username fallback
  • This prevents duplicate usernames when using multiple name variables

Staff/Acceptor Variables

These variables reference the staff member who accepted or denied an application:

{acceptor}

Output: @Moderator

Creates a clickable mention of the staff member who accepted/denied the application.

Example: "Your application was reviewed by {acceptor}"
Result: "Your application was reviewed by @ModJane"

{acceptor_id}

Output: 9876543210

The Discord ID of the staff member who took action on the application.

{acceptor_name}

Output: ModeratorJane

The username of the staff member (without the @).

โš ๏ธ Context-Specific Variables

Staff/acceptor variables are only available in Accept and Deny actions. They will be empty in Submit messages since no staff member has reviewed the application yet.

Application Variables

These variables provide information about the application itself:

{thread} / {app_link}

Output: https://discord.com/channels/...

Creates a clickable link directly to the application thread or message. Both variables work identically.

Example: "Review your application here: {app_link}"
Result: Generates a Discord message link that jumps to the application

{thread_id}

Output: 1122334455667788

The unique Discord ID of the application thread or the message ID where the application is stored.

{app_count}

Output: 42

A global sequential counter for this specific application type. Each submission increments this number.

Use Case: Thread names like "Application #{app_count} - {username}"
Result: "Application #42 - JohnDoe"

{app_status}

Output: submitted / accepted / denied / started

The current status of the application in plain text.

{appname}

Output: Staff Application

The name of the application as configured in your dashboard.

{app_button}

Output: Apply for Moderator

The button label that the applicant clicked to start this application.

Server Variables

These variables provide information about your Discord server:

{guildname}

Output: My Awesome Server

The name of your Discord server (guild).

{guild_id}

Output: 556677889900112233

The unique Discord ID of your server.

Role Mentions

You can mention Discord roles using their ID:

{<@&ROLE_ID>}

Output: @Staff

Creates a clickable mention of the specified role. Replace ROLE_ID with your actual Discord role ID.

Example: "{<@&123456789>} please review this application"
Result: "@Moderators please review this application" (with ping)

How to get a Role ID:

  1. Enable Developer Mode in Discord (User Settings โ†’ Advanced)
  2. Right-click the role in Server Settings โ†’ Roles
  3. Click "Copy ID"

Special Mentions

{here} / {@here} / @here

Output: @here

Pings all online members in the channel. All three formats work identically.

Question & Answer Variables

These variables pull data from the application questions and user responses:

{answer1}, {answer2}, ... {answer50}

Output: User's response to that question

Displays the user's answer to a specific question number. Numbers correspond to question order (1-50).

Example Thread Name: "{username} - {answer1}"
Result: "JohnDoe - I want to become a moderator"

Multiple Choice Answers: If the question has multiple selections, answers are joined with commas.

{question1}, {question2}, ... {question50}

Output: The question text itself

Displays the actual question text from your application form.

Example Message: "You answered '{answer1}' to '{question1}'"
Result: "You answered 'Yes' to 'Do you have prior experience?'"

๐Ÿ’ก Nested Variables in Questions

Questions can contain other variables that get resolved recursively. For example, if Question 1 is "What is your name, {username}?", the {question1} variable will output the fully resolved text with the username filled in.

Advanced: Rule Variables

Rule variables are used for conditional logic in thread names and nickname changes:

{rule1}, {rule2}, ... {rule50}

Output: Conditional text based on answers

Displays text conditionally based on the user's answer to that question. This is configured in the dashboard per question.

How Rules Work

Rules allow you to create dynamic content based on user choices:

  • For text questions: You set a "match text" (regex or string) and "replace text"
  • For button questions: Each button can have custom text that appears when selected
  • Multiple rules can be combined in a single template

Text Question Rule Example

Question 1: "What is your favorite color?"

Rule Configuration:

  • Match Text: blue|teal|cyan (regex)
  • Replace Text: [Cool Colors]

Thread Template: "{username} - {rule1}"
If user answers "blue": "JohnDoe - [Cool Colors]"
If user answers "red": "JohnDoe -" (empty, no match)

Button Question Rule Example

Question 2: "Select your region"

Buttons:

  • North America (with rule text: "NA")
  • Europe (with rule text: "EU")
  • Asia (with rule text: "ASIA")

Thread Template: "{username} [{rule2}]"
If user selects "Europe": "JohnDoe [EU]"

Complex Rule with Variables

Rules can contain other variables like {answer1}, {username}, etc.

Replace Text: "{username}'s answer: {answer3}"
Result: "JohnDoe's answer: I have 5 years experience"

โš ๏ธ Rule Variable Limitations

  • Rules only work in thread names and nickname changes (not in regular messages)
  • Rules are evaluated during submit/accept/deny actions, not in real-time
  • If no match is found, the rule variable is replaced with an empty string
  • Rules support up to 50 questions (rule1 through rule50)

Character Limits

Some fields have Discord-imposed character limits that affect variable output:

  • Thread Names: Maximum 100 characters (truncated automatically)
  • Nicknames: Maximum 32 characters (truncated automatically)
  • Embed Descriptions: Maximum 4096 characters
  • Message Content: Maximum 2000 characters

AppBot automatically truncates thread names and nicknames to fit Discord's limits. Plan your variable combinations accordingly.

Using Variables in Different Contexts

Thread Names

Available variables: All variables, including rule variables

Example: "App #{app_count} - {username} - {rule1}"

Nickname Changes

Available variables: All variables, including rule variables

Example: "[{rule1}] {answer2}"

Messages & Embeds

Available variables: All variables EXCEPT rule variables

Example: "Hey {user}, your application '{appname}' has been {app_status}!"

Google Sheets

All variables work in Google Sheets column mappings, allowing you to export any application data.

๐Ÿ’ก Best Practices

  • Test your variables: Create a test application to verify variable output before going live
  • Use {user} for pings: Use {user} in messages when you want to notify someone, {username} for display-only
  • Combine wisely: Consider character limits when combining multiple variables in thread names
  • Fallback awareness: Remember that nickname and globalname fall back to username if empty
  • Rule placement: Place rule variables at the end of thread names so truncation doesn't cut off important info

Troubleshooting Variables

Variable Not Replacing

If a variable shows as literal text (e.g., "{username}" instead of "JohnDoe"):

  • Check for typos in the variable name
  • Ensure you're using curly braces, not other brackets
  • Verify you're using the variable in a supported context

Empty Variable Output

Some variables may be empty in certain contexts:

  • {acceptor} variables are empty in Submit actions (no staff involvement yet)
  • {thread_id} is empty for started applications (no thread created yet)
  • Answer variables are empty if the user skipped optional questions

Rule Variables Not Working

Rule variables only work in thread names and nickname changes. They will appear as literal text in messages or embeds.

Truncated Content

If your thread name or nickname appears cut off, you've exceeded Discord's character limit. Simplify your variable template or use shorter answer options.

Complete Example: Application Workflow

Here's how variables work together in a complete application flow:

Submit Action:

  • Thread Name: "App #{app_count} - {username}"
  • DM to User: "Thanks {user}! Your application has been submitted. View it here: {app_link}"
  • Staff Channel: "{<@&123456> New {appname} from {username} (ID: {user_id})"

Accept Action:

  • Rename Thread: "[ACCEPTED] {username} - {rule1}"
  • Change Nickname: "[{rule2}] {username}"
  • DM to User: "Congratulations {user}! Your {appname} was accepted by {acceptor}."