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.
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).
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
On Submit Actions Execute
Configurable actions run immediately: role assignments, nickname changes, channel messages, thread creation, and optional scheduled tasks.
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.
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.
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.

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.

๐ Quick Comparison
| Feature | DM Application | Modal Ticket |
|---|---|---|
| Format | Conversational (one question at a time) | Form-based (all fields at once) |
| Location | Bot DMs | Pop-up modal in server |
| Question Limit | Unlimited | 5 fields maximum |
| Buttons/Selections | Yes (buttons & dropdowns) | No (text input only) |
| Media Support | Images, videos, embeds | Text only |
| Best For | Detailed applications, screening | Quick 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:
- User clicks application button in server
- Bot sends first question via DM
- User answers (text, file upload, or button selection)
- Bot validates answer and sends next question
- Process repeats until all questions answered
- 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:
- "What's your in-game name?" (text)
- "Which role are you applying for?" (dropdown: Tank, DPS, Support, Healer)
- "Link your Steam Profile URL" (validated URL)
- "Upload a screenshot of your stats" (media required)
- "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:
- User clicks ticket button in server
- Modal form pops up instantly (no DM required)
- User fills out all fields in the form
- User clicks "Submit" button
- 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}
- Supports placeholders:
- 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:
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 Need | Recommended Type |
|---|---|
| 6+ questions | DM Application |
| 1-5 simple questions | Modal Ticket |
| Multiple choice questions | DM Application |
| File uploads needed | DM Application |
| Instant submission priority | Modal Ticket |
| Answer validation needed | DM Application |
| High submission volume | Modal Ticket |
| Rich media in questions | DM 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
/canceland 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:
- Identify your 5 most critical questions
- Remove media, buttons, and validation requirements
- Simplify question wording for quick reading
- Create new ticket configuration with these 5 questions
- Update your application button to trigger ticket instead
- 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:
- List all current ticket fields
- Identify where you need buttons, validation, or media
- Create DM application questions in dashboard
- Add button options for multiple choice fields
- Add validation rules (number-only, regex, etc.)
- Include welcome/outro messages for better UX
- Update button to trigger DM application
- 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
- Q1: "What position are you applying for?" (Buttons: Moderator, Admin, Developer, Support)
- Q2: "What's your Discord username?" (Text - auto-filled with {user_tag})
- Q3: "How old are you?" (Number validation)
- Q4: "Link your Steam Profile URL" (Steam validation)
- Q5: "Which time zones are you available?" (Multi-select dropdown: EST, PST, GMT, etc.)
- Q6: "How many hours per week can you dedicate?" (Number validation)
- Q7: "Why do you want to be staff?" (Long text response)
- Q8: "Do you have prior moderation experience?" (Buttons: Yes, No)
- Q9: "If yes, describe your experience" (Conditional - appears only if Q8 = Yes)
- 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
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
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
- Q1: "What type of content creator are you?" (Buttons: YouTuber, Twitch Streamer, TikToker, Instagram, Other)
- Q2: "What's your channel/profile URL?" (Text with URL validation)
- Q3: "How many subscribers/followers do you have?" (Number validation)
- Q4: "What's your average view count?" (Number validation)
- Q5: "What content niche?" (Dropdown: Gaming, Tech, Lifestyle, Education, etc.)
- Q6: "Upload your media kit or analytics screenshot" (Media required)
- Q7: "Why do you want to partner with us?" (Long text)
- 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
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:
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:
- Simple questions (name, age, timezone)
- Medium difficulty (experience, availability)
- Complex questions (essays, scenarios, examples)
- Time-consuming tasks (file uploads, external links)
Users who answer all questions demonstrate genuine interest.
Steam Integration Workflow
โ 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 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:
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
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:
- Check database for
status: 'started'applications - Count how many answers each abandoned app has
- Identify the question where most users quit
- 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.

๐ 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:
๐ก 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
| Feature | Single-Select | Multi-Select |
|---|---|---|
| User Action | Click one option | Select 1+ options, then submit |
| Display (1-5 options) | Buttons | Dropdown (forced) |
| Display (6-25 options) | Dropdown | Dropdown |
| Answer Storage | Single value | Comma-separated list |
| Best For | Exclusive choices | Multiple 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:
Select 1-3 options
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)"
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?"
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)"
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
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 |
|---|---|---|---|
| Trigger | Automatic | Manual (staff) | Manual (staff) |
| Button Roles | Stored only | โ Applied | โ Ignored |
| Staff Modal | No | Yes | Yes |
| Thread Creation | Yes | Modifies | Modifies |
| 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:
- Staff modal comment (internal log)
- Staff modal DM field (if provided)
- Standard Accept DM (if configured)
- Role-specific DMs (one per role selected)
- 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:
- Start with applicant's current roles
- Remove roles from "Remove Role" list
- Add roles from "Add Role" list
- Add roles from question buttons (applicant's selections)
- Add roles from thread message buttons (staff's selections)
- Add Steam-verified roles (if Steam integration enabled)
- Remove duplicates
- Filter out admin-permission roles
- 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
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
/infoto 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:
- Check if user has required roles (if any configured)
- Check if user has prevented roles (blocks access if they do)
- Check membership time requirement
- Check cooldown period
- 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:
- 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"
- 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]"
- 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"
- 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"
- 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:
- Staff Role Check: Does user have staff role or Administrator permission?
- If fails: "Not enough permissions"
- Application Status Check: Is application still pending?
- If fails: "Application already processed"
- 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
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
- User clicks application start button
- Bot redirects to Discord OAuth2 authorization page
- User grants "View your connections" permission
- Bot retrieves list of linked platforms
- 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
- You add server IDs to the list (explained below)
- User clicks application start button
- Bot redirects to Discord OAuth2 authorization page
- User grants "View your servers" permission
- Bot checks if user is member of ANY of the listed servers
- If user is in at least one listed server, application proceeds
- If user is in none of the listed servers, application is blocked
Adding Server IDs
Method 1: Manual Entry
- Click the "+ Server ID" button to add a new field
- Enter the Discord server ID (18-19 digit number)
- Optionally add a note/label in the second field (for your reference)
- Click X to remove a server from the list
- 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:
- Open Discord (desktop or browser, not mobile)
- Click your profile picture โ User Settings (โ๏ธ gear icon)
- Go to "Advanced" tab
- Enable "Developer Mode"
- Close settings
- Right-click on any server icon in your server list
- Click "Copy Server ID" at the bottom of the menu
- 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
- Click start button: Instead of opening DMs or modal, redirected to Discord website
- Authorization page: Discord shows official authorization prompt with:
- Bot name and avatar
- Requested permissions ("connections", "guilds")
- "Authorize" and "Cancel" buttons
- Grant permission: User clicks "Authorize"
- Redirect back: Discord redirects user back to your application
- 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
- Role requirements (from Permissions tab)
- Prevent roles (from Permissions tab)
- Membership time (from Permissions tab)
- Cooldown (from Permissions tab)
- Discord OAuth2 authorization (if enabled)
- Linked accounts check (if enabled)
- Server membership check (if enabled)
- 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
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
- Applicant submits application with Steam profile URL answer
- Bot extracts Steam ID from the provided URL
- Bot queries Steam API for public profile data
- Bot checks game library, playtime, and recent activity
- Bot compares data against your configured criteria
- 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:
- User submits application with Steam URL
- Bot validates Steam profile is public and accessible
- Bot retrieves game data from Steam API
- Bot evaluates all configured criteria
- Matching roles are stored in database
- When staff clicks Accept, Steam roles are assigned along with other roles
- 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:
- Open Steam โ Profile โ Edit Profile
- Go to Privacy Settings
- Set "My profile" to Public
- Set "Game details" to Public
- Set "Friends list" to Public or Friends Only (not required but helpful)
- 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
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
- Click "Sign in with Google" button
- Google OAuth2 authorization popup appears
- Grant AppBot permission to create and edit spreadsheets
- Bot creates a new Google Sheet in your Google Drive
- Sheet is automatically populated with your application structure
- New applications sync to the sheet within 24 hours
- 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
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
- New member joins your Discord server
- Bot sends verification message in designated channel
- Member clicks "Verify" button
- Bot automatically assigns configured roles
- 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:
- Toggle Send Logs to enable logging
- Select a log channel from the dropdown
- 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
- New member joins your Discord server
- Bot automatically sends welcome message to designated channel
- Message displays custom text, optional image, and selected app buttons
- 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:
- After designing your message, scroll down to the app selection area
- Click any app to add its button to the welcome message
- Added apps appear as buttons below the message editor
- 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
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
- User creates a Discord Event in a monitored channel
- Bot checks global creator requirements (if configured)
- Bot finds matching triggers based on channel and settings
- Bot creates a thread (public or private) in specified channel
- Bot pings configured roles in the thread
- Bot sends custom announcements to designated channels
- When users click "Interested", they're automatically added to the thread
- 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:
- Click the + button next to "Required roles to fire Trigger"
- Select role(s) from the modal
- Only users with one or more of these roles can trigger automation
- 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:
- Click the + button next to "Prevent roles from firing Trigger"
- Select role(s) from the modal
- 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
- Click the "EVENT TRIGGER" button in the left sidebar
- A new trigger appears as "Trigger 1", "Trigger 2", etc.
- Click the trigger to configure it
- Toggle Enabled to activate/deactivate the trigger
2. Select Monitored Channels
Choose which channels to monitor for event creation:
- Under "If event created in", click Select Channel(s)
- Choose one or multiple channels from the dropdown
- Selected channels appear as tags with or between them
- 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:
- Under "Thread Is created in", click the dropdown
- 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:
- Click the + button next to "Ping roles"
- Select role(s) to ping when the thread is created
- 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.
- Click "Custom Message" at the bottom
- 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
- Add multiple announcements to post in different channels
Available Variables
| Variable | Output |
|---|---|
{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
- Bot monitors configured channels for message activity
- Every 5 seconds, bot counts messages in the last 5-second window
- If message count exceeds threshold, bot applies slowmode
- Slowmode restricts users to 1 message per configured interval
- With auto-increment enabled, slowmode escalates for sustained spam
- 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:
- Click Select Channel(s) under "Chats to monitor"
- Select one or multiple channels
- Selected channels appear as tags with or between them
- 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:
- Enter a number in "If messages in the last 5s are more than"
- Bot checks every 5 seconds
- 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:
- Click the dropdown under "โพ apply slowmode"
- Select duration from 5 seconds to 6 hours
- This becomes the base slowmode duration
Available Durations
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 secondsslowmode - 2x threshold:
24 msgsโ10 secondsslowmode - 4x threshold:
48 msgsโ15 secondsslowmode - 8x threshold:
96 msgsโ30 secondsslowmode
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
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
- Create a new message from the dashboard sidebar
- Configure message settings (channel, color, content type)
- Add text content and optional media (thumbnails, images, videos, GIFs)
- Optionally add role pings and reaction role buttons
- 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
xto 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
- Click the
+button in the "add react role button" section - A new button appears with default label "Button"
- Click the button to open the configuration modal
- Configure the button settings (see below)
- 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:
- The bot checks if the member already has the role
- If they have it: Role is removed, bot replies "โ Removed role **RoleName**"
- If they don't have it: Role is added, bot replies "โ Assigned role **RoleName**"
- 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
- Complete all message configuration
- Click the arrow button (โ) in the top-right corner
- The button shows a loading spinner while sending
- Message appears in the selected Discord channel
- 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 IDnormalText- Boolean: true for plain text, false for embedtext- Message content/embed descriptioncolor- Hex color for embed sidebarthumbnail- Small image URLpicture- Large media URLpings- Array of role IDs to mentionbuttons- Array of button configurations
Button Structure
Each button contains:
btnId- Unique button identifierlabel- 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 buttontype- Always 2 (Discord button component type)
API Endpoint
Messages are sent via:
GET /api/senmessageembed?guild=GUILD_ID&msgId=MESSAGE_IDThe 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:
- Receives interaction with
custom_idstarting with "REACT" - Extracts role ID from button configuration
- Checks if role exists and isn't an admin role
- Toggles role assignment (add if missing, remove if present)
- Sends ephemeral confirmation message to user
- 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
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:
- Initial Load: First access fetches complete dataset from server
- Local Caching: Data stored in browser's IndexedDB (persistent storage)
- Incremental Updates: Subsequent loads only fetch new applications added since last update
- Freshness Check: Cached data considered fresh for 30 minutes
- 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:
- System checks last update timestamp from cache
- API called with
?since=TIMESTAMPparameter - Server returns only applications submitted after that timestamp
- New applications merged with cached data
- 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:
/infoand context menu commands work within Discord servers - DM Commands:
/cancelonly 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
- Right-click on any user's profile in your server
- Navigate to Apps in the context menu
- Select View User Applications
- 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:
- If an in-progress application exists, the bot presents a confirmation message
- The user chooses to either delete the application or continue with it
- 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:
- Go to User Settings โ Privacy & Safety
- Enable "Allow direct messages from server members"
- 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:
- Enable Developer Mode in Discord (User Settings โ Advanced)
- Right-click the role in Server Settings โ Roles
- 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}."