Skip to content
Now live — sign in to your guild dashboard
Guild Butler
EN
Sign in Add to Discord
Killboard

Raids

Raids & signupsAttendance & stats

Economy

Loot & settlementRegearSiphoned energy

Management

Recruitment & applicationsRoles & nicknamesRoster upkeep

Extras

GiveawaysDashboard & white-labelFeatures Pricing Docs
Sign in Add to Discord

Features Recruitment & membership

Bring members in, then keep the roster honest.

A public board with up to five Apply buttons, each with its own form, roles and review forum. Applications file into a staff-only forum, and one press of Approve grants the roles, links the IGN and sets the nickname. Prefixes, role menus and roster upkeep have their own pages — this one is the front door.

Discord
🛡️
Guild Butler ✓ APP Today at 18:02
Join the guild
Click Apply to send an application. An officer will review it and get back to you.
your banner — or a transparent 600×1 spacer, which pins the card to Discord's maximum width
Join the guild Alliance member Ask a question
The public Apply board — one embed plus one button per enabled application type. With no types configured it falls back to a single green 📝 Apply button, so a guild that never set types up still works.
5
Application types per board
Discord allows exactly five buttons in one action row, so the editor refuses a sixth rather than letting you build a board Discord will reject.
4 or 5
Questions per type
Discord caps a modal at 5 rows. The in-game-name field takes one of them, leaving four. Turn the name field off and you get five.
10 min
Until an empty interview room deletes itself
Continuous emptiness, not time since opening — the clock resets whenever anyone is inside. Swept every 2 minutes.
367
Tests across this area
In 40 files across the whole membership area — this page plus Roles & nicknames and Roster upkeep: intake types, name claims, the policy ledger, prefixes, departures, absence, menus, forum and voice bookkeeping.

01 · Why it exists

Recruiting is done by hand, and it shows

Applications arrive as free-text messages in a public channel. Character names live in someone's head or a spreadsheet. The new member is renamed, given roles and linked to their in-game name in three separate manual steps that get half-done.

What that costs you

Every applicant reads every other applicant's answers, which is not a privacy nicety — it is why people write what they think you want to hear.

The rename, the roles and the character link arrive in three separate manual steps that get half-done — and once they are in, keeping the roster honest is a different job with its own page.

The answer is not a form service and a spreadsheet. It is one console in the server you already run, where the same press that admits someone also gives them their roles, their nickname and their character link — and where the roster check is a paste and a confirm rather than an afternoon.

None of it is on by default. Every piece is inert until you configure it, and most guilds start with one Apply button and nothing else.

Discord

Only you can see this

Recruiter console
/roster sync compares the game roster · /roster absence shows who’s gone quiet · applications are reviewed on their cards.
📋 Applications
3 awaiting review
🧑‍🤝‍🧑 Quiet members
11 currently absent
Module settings
/recruiter — the ephemeral console. Ephemeral means per-viewer: recruiters and admins open the same panel, and each sees only the controls they can actually use.

02 · How it works

From an empty server to an archived decision

Two admin steps to set it up, then the same loop every time somebody applies. The only thing an officer has to remember is that Approve is one button.

  1. Point recruitment at the right channels admin

    Open /settings → Recruitment. This screen is only about where things go: the applications forum (create a fresh staff-only one, or pick a forum you already have), the board channel where the public Apply board should live, and the board accent colour. The board-channel picker is set-only — choosing a channel records the destination and posts nothing. Nothing is published until you press Post the board.

  2. Build the board and its Apply buttons admin

    Manage board opens an ephemeral editor for what the board *looks like*: title, text, and up to five application types. Each type gets its own button label, emoji and colour, its own questions, its own list of granted roles, optionally its own review forum, an in-game-name setting, a stats-screenshot toggle and a 📜 Rules… panel. A type that grants no role is an inquiry — answered and archived, no role. Splitting "where things go" from "what it looks like" lets an admin design the board from a private channel while it lives in a public one.

  3. A member presses Apply member

    They click the button for the type they want. If that type gates on rules, they get the rules link with ✅ I Agree / Cancel first — agreeing is recorded at the current version and the same form opens immediately. (A button click is its own interaction, which is what lets a gate sit in front of a modal; a modal itself is text-only and cannot hold a checkbox.) The form opens with Your in-game name, then the type’s questions.

  4. A private thread and a staff post open bot

    The bot opens a private thread in the apply channel with the applicant in it, and files the review card as one post in the staff-only applications forum, tagged 🆕 New. Staff are added to the thread so it appears in their sidebar. If the type asks for an in-game stats screenshot, the prompt — with your example image and guide link — goes into the thread, and the next image they upload is captured. If the type uses in-thread rules, the rules and an I Agree button go there too.

  5. Staff talk to them, and about them officer

    Two rooms, one job each. The thread is the conversation — staff and applicant both talk there, and the applicant’s messages are mirrored into the staff post so nobody has to open every thread. The forum post is the staff’s private discussion; its footer says so outright, because an officer once typed into the post expecting the applicant to read it. 🎙 Invite to voice opens a temporary interview room, pings the thread and DMs the applicant, then tells the recruiter which of the two actually landed.

  6. Approve, and four things happen at once officer

    Approve grants the type’s roles, links the in-game name to their Discord account using the registry’s canonical spelling, renames them to [Recruit] TheirIGN if a role→prefix mapping applies, and posts the type’s self-service role menu into their thread if it carries one. Any role that could not be granted is named with its reason, and the approval still stands. Deny takes a reason, which the applicant sees in their thread.

  7. The post archives itself as the record bot

    The forum post is retitled and retagged ✅ Accepted or ⛔ Declined, the thread conversation is copied into it as a transcript, and the post is archived — out of the active list, still browsable and searchable. Staff leave the applicant’s thread; the applicant keeps it. The transcript runs *after* the officer has been answered, because none of it is worth making someone watch a spinner for — and an archived decision with no record of the conversation that produced it is half a record.

03 · The board

Five Apply buttons, five different forms

Guild member, ally, “just a question” — each Apply button gets its own label, colour, questions, granted roles and review forum. Adding another is a click in the editor, whenever you need it.

Discord

Only you can see this

Application board

Title: Join the guild
Text: Click Apply to send an application. An officer will…

Application types (3/5)
1. 🛡️ Join the guild
   3 question(s) · grants @Recruit · default forum
2. 🤝 Alliance member
   2 question(s) · grants @Ally, @ARCH · #alliance-apps
3. ❓ Ask a question
   1 question(s) · inquiry — no role · default forum

Pick a type to edit:

Edit a type…
Title & text Add request type Done
Manage board — the ephemeral editor. Each control gets its own label line above it, which is why this one screen uses Discord's newer component format; everything else in the bot stays classic.

Why five, and why the questions are capped

Five is not a product decision. Discord allows exactly five buttons in one action row, so the editor refuses a sixth type rather than letting you build a board that Discord will reject when it renders.

The question budget is the same kind of hard limit, one level down. A modal is capped at five rows. When the in-game-name field is shown it occupies one of them — which is why the cap is a function of the name setting rather than a constant, and why turning the name field on can be refused.

A type that grants no role is an inquiry: answered, archived, no role. That is how "Ask a question" and "Join the guild" can sit on the same board and mean completely different things.

The modal budgetRows used by the name fieldQuestions you may ask
Name field: Required or Optional 1 of 5 4
Name field: Off 0 of 5 5
A type sitting at 5 questions, switching the name field on New cap is 4, current count is 5 Refused, with the cap named — drop a question first
Zero questions with the name field shown 1 of 5 Valid — a name-only application is a legitimate minimal form
No questions and no name field 0 of 5 The only refusal: there would be nothing to ask

If a stored board has drifted out of step by the time it renders — a type written by an older build, a half-applied migration — the extra row is dropped, not refused. Dropping it keeps Apply working. Refusing would leave the guild a dead pinned button with no explanation, which is exactly what happened the first time the gate demanded at least one question and a guild reconfigured mid-flight.

04 · Two rooms

The applicant's thread, and the staff's post

They cannot share a channel: being added to a private Discord thread means seeing its parent channel, so the applicant's thread forces a channel the applicant can read — and for a while, the review card followed it there.

What went wrong, and what fixed it

A guild had reasonably pointed their review channel at a public #recruitment. The decision buttons were never an escalation — every handler gates on staff first — but the answers were readable by the people applying, and nothing warned the admin.

The fix is two homes. The applicant's thread hangs off the apply channel. The review card is filed as one post in a staff-only forum, which the bot creates or adopts, and which is forced private at the one place every path passes through — so adopting a forum you already have makes it private rather than reopening the leak.

The applicant's messages are relayed into the staff post so officers do not have to open every thread. Staff messages are deliberately not mirrored back, because that notified officers about their own posts.

If a private thread cannot be created, the bot fails closed and says so. It will not quietly open a public thread while telling the applicant it is private.

Discord
🛡️
Guild Butler ✓ APP Today at 18:14
⏳ Application #42
@Rukavytsia
💬 Talk with them → #application-42
Application type
Join the guild
Rules
⏳ Not yet agreed — approval blocked
How long have you played Albion?
About two years, mostly ZvZ.
What content do you want to run?
Hellgates and ZvZ.
the captured in-game stats screenshot, re-hosted onto this post — each capture gets a unique filename
🎙 Invite to voice 📸 Request screenshot Approve Deny
The review card, as a forum post in the staff-only applications forum. The post itself is titled ⏳ Rukavytsia — the in-game name, so the sidebar reads as a list of people. The thread link sits in the description at the very top, because a forum post is read top-down and the first thing staff need is the door to the applicant.
Forum tagWhen it is appliedWhy it is only four
🆕 New On filing, and again automatically when an applicant replies The tag is a coarse sidebar filter, not the record. Denied and cancelled deliberately share Declined — the precise outcome lives in the post title's emoji, and a fifth tag was offered and declined. Adopting a busy forum that is already near Discord's 20-tag cap is pre-checked, so "adoption failed" always says how many tags to remove.
👀 Waiting on applicantDefined and handled, but see the limits below
✅ AcceptedOn approve — post retitled and archived
⛔ DeclinedOn deny or cancel — post retitled and archived

Archiving is what "archive folder" has to mean on Discord. Threads cannot be moved into a category, and a channel per applicant would burn the 500-channel limit permanently. An archived forum post drops out of the active list and stays browsable and searchable forever — with the conversation transcript copied into it, so the decision and the discussion that produced it live in the same place.

05 · What Approve does

One press, four things — and one that waits for an officer

Approve grants the type's roles, links the in-game name, renames the member, and drops in their role menu. If the claimed name already carries silver, the member still gets in and only the link waits.

The four things

Roles are granted one at a time, never as an array. That is not a missed optimisation: discord.js's array branch rebuilds the member's whole role set from a cache that may be incomplete and PUTs it back, so a member with a partial role cache can silently have roles stripped. Any role that fails is named to the deciding officer with its reason — no permission, above my highest role, or role deleted — and the approval itself still stands.

The name is linked using the registry's canonical casing, so a variant cannot fork a player's history onto a second row. It is re-classified at the moment of decision, not at submit — the registry can move in between.

The nickname is seeded with that name and applied right there, deterministically, rather than waiting on a gateway event. A missing intent, a tenant client or a partial member each silently dropped the rename, and the applicant kept their Discord handle instead of their character name.

The role menu, if the type carries one, is posted into their thread — on approve, not on apply, so a declined applicant can never self-assign anything.

Discord
🛡️
Guild Butler ✓ APP Today at 18:20

🪪 In-game name claim

@Rukavytsia claims Rukavytsia, which has 4,120,000 silver on record. Approving transfers that history to them.

Came from a recruitment application — the member was admitted, only the name link is waiting.
Check in game that this is really their character before approving.

Approve claim Deny
A name claim that would move silver. Names harvested from a pasted siphoned-energy log exist in the registry with no Discord owner — and those are exactly the names that carry a balance.

Claiming an unowned log name is also the intended flow — it is how a real player attaches their own history — so it cannot simply be blocked. Free and zero-balance names link instantly; only value moving stops for a human. The member is admitted either way and their nickname is still set, because a display name must not be held hostage to a ledger transfer. Approving a claim is officer-gated, not recruiter-gated: a recruiter may admit a member, but only an officer hands them a balance. Two officers clicking at the same moment cannot transfer twice, and rival claims on the same name are auto-denied.

06 · The recruiter rank

Every action, none of the money

Appoint a recruiter role and it runs admissions, sweeps and check-ins — with no settlement, payout, tax or party powers anywhere in the bot. The rule in one line: a recruiter owns every action, an admin owns every setting.

Can they…RecruiterOfficerAdmin
Approve or deny an application
Open an interview voice room
Request a stats screenshot
Run and confirm /roster sync
Undo a departure sweep
View /roster absence, notes, 🛡️ protect
Send check-in DMs (preview → confirm)
Tune the absence board display filter
Approve a name claim that moves silver
/ign clear — detach someone else's names
Settlement, payouts, tax, party powers
Absence thresholds, cooldown, check-in DM opt-in
Set the recruiter role itself
Set the granted recruit role
/settings → Recruitment, Nicknames
/settings → Roles (self-service menus) The editor's own guard is officer, not admin — but its only entry point is a button inside the admin-gated /settings hub, so in practice it is admin-only.

Why the split is drawn there

The tier is a superset: admin ∪ officer ∪ recruiter role. Appointing recruiters never takes anything away from anyone, and with no recruiter role set the whole tier is inert and every gate collapses to officer-only — so existing servers are unaffected. A test asserts exactly that.

A recruiter must not satisfy the officer check. That is what keeps settlement and payouts out of reach across the whole bot, and it is pinned by its own test. It is also why approving a name claim — which moves silver — sits with officers even though a recruiter can admit the member whose claim it is.

Three settings stay admin-only for named reasons found in review. The recruiter role setter mints recruiters. The granted recruit role is checked for role hierarchy, not identity, so repointing it would let a recruiter grant any role below the bot. And the absence threshold mints the check-in DM target list — a recruiter who could set it to 1 and paste a roster could DM the entire guild.

Discord

Only you can see this

Membership settings
Absence care (admin) 🔒
• Counts as absent after (days): 7
• Long absence after (days): 21
• Days between check-ins: 7
• Check-in DMs: off
Your board view
• Only show members absent at least (days): 7
Filters your board and your check-in list. It can only ever show fewer people — never more.
Board filter
Module settings, as a recruiter sees them. Every value is shown — a recruiter needs to know the rules they operate under — but the controls that size the DM pipeline render only for admins.

07 · Everything else

The rest of it

One interview room per application

🎙 Invite to voice opens a temporary room, and it deletes itself after ten continuous minutes empty.

A room per application rather than one shared interview channel, so two recruiters can interview at the same time without colliding. The room is hidden from @everyone; the applicant, the recruiter who opened it, and the guild’s officer and recruiter roles can see, join and speak — a second officer sitting in is normal, and locking the room to exactly two people would make that impossible. A sweep runs every two minutes and deletes any room that has been empty for ten minutes; the clock resets whenever anyone is inside. Occupancy is read from raw voice states rather than the member cache, because a cold cache would undercount and delete a live room.

Ask for a stats screenshot

A type can ask for one; the bot captures the next image posted in the applicant’s thread and pins it to the review post.

Discord modals are text-only, so a screenshot can never be a form field. Instead the bot posts a prompt in the applicant’s thread and captures the first image they upload, up to 8 MB. The bytes are re-hosted onto the review post rather than linked, because Discord attachment URLs expire and the archive has to survive. Each type carries its own optional guide link and example image (falling back to a guild-wide default), and the example is shown right where the applicant uploads so they can see what good looks like. Officers can ask again from the 📸 Request screenshot button. Every captured file gets a unique name including the message id — reusing a filename made Discord serve the stale first image even after the bytes were swapped.

One registry for every IGN

An application, /ign set and an officer link all go through the same rules.

Members claim their own character name with /ign set, or the 🎮 Set my in-game name button on their My-status card (which appears when the guild uses the siphoned-energy module). A member can detach one of their own names with /ign unlink; an officer can clear all of a member’s names with /ign clear. Both member paths run through one shared resolver, because the button used to call the link function directly and skipped the officer-approval rule entirely — anyone who used the button instead of the command inherited a balance-carrying name on the spot. Case variants are handled explicitly: names are stored case-sensitively but every lookup is case-insensitive, so a name resolving to more than one row or more than one owner is refused rather than guessed, and links always use the registry’s canonical casing.

08 · Commands

One staff command, one member command, and the hubs you already use

Everything staff-facing lives behind /recruiter or a button on a card, and the member-facing half is /ign. Roster subcommands live on the Roster upkeep page. Nothing here has to be memorised.

/recruiter/settings/menu/ign set/ign show/ign unlink/ign clear

/recruiter replies with the ephemeral console directly. An admin can also post a static pinned launcher board whose one button opens that same ephemeral console — the board is deliberately data-free, so it never goes stale and never leaks member data into a public channel. /ign unlink is member self-service (it detaches one of your own names); /ign clear is the officer one.

09 · What it cannot do

The limits, stated plainly

The newest, least battle-tested block in the bot — and several of its guarantees are workarounds for Discord quirks. Better to know that before you point your whole recruitment at it.

10 · Questions

Questions officers actually ask

Do I have to use the application board? We already have a recruitment channel.
No. Everything in this area is optional and inert until you configure it. If you never set a rules link, no rules gate appears. If you never appoint a recruiter role, the tier does not exist and every gate stays officer-only. If you never post the board, nobody can apply. Plenty of guilds run only the nickname prefixes and departure sync.
Can applicants read each other’s answers?
No, and that is the reason the design looks the way it does. It used to be possible: one channel served both the applicant’s thread and the staff review card, and a guild had reasonably pointed their review channel at a public #recruitment. Being added to a private Discord thread requires being able to see the parent channel, so the applicant’s thread *forces* a channel they can read — and the card followed it there. The two homes are now split: thread in the apply channel, card in a staff-only forum. The forum is forced private at the one place every path passes through, so adopting a public forum makes it private rather than reopening the leak. /settings → Recruitment also warns, in the panel itself, when no forum is set.
Can a recruiter give themselves or a friend more power?
The tier is deliberately built so they cannot. A recruiter never satisfies the officer check, which is what keeps settlement, payouts, tax and party powers out of reach — a test asserts it. Three settings stay admin-only for named reasons: the recruiter role setter (whoever sets it mints recruiters), the granted recruit role (the grant checks role hierarchy, not identity, so repointing it would let a recruiter grant any role below the bot), and the absence thresholds (they mint the unsolicited-DM target list). One honest cost is stated rather than hidden: the recruiter role is auto-exempt from departure sweeps so the tool cannot delete its own operator, which means a recruiter could shield an ally by handing them the recruiter role. That is tolerable only because minting recruiters is admin-gated.
Someone claimed a character name that already has silver on it. What happens?
The member is admitted, their nickname is still set, and the name link goes into a queue for an officer. Names imported from a pasted siphoned-energy log exist in the registry with no Discord owner, and those are exactly the names that carry a balance — claiming one transfers that whole history. That is the *intended* flow when it is your own character, so it cannot simply be blocked; it just must not happen silently. The claim card names the member, the name and the exact silver amount, and the queue is reachable at /menu → Officer tools → 🪪 Name claims, which appears only when claims are waiting. A claim settles exactly once, so two officers clicking together cannot transfer twice, and rival claims on the same name are auto-denied.
What does this need from the bot in Discord?
Manage Roles (grant roles on approval, strip the guild role on a sweep), Manage Nicknames (prefix sync), Manage Threads and Create Private Threads (applicant threads, archiving), Manage Channels (create the applications forum and interview voice rooms — adopting a forum you already have needs permission only on that forum), and the Server Members privileged intent for the nickname sweep and roster work. Three of these were missing from the original invite link. If you installed the bot before that was fixed, re-invite it or grant them by hand.
Why is the in-game name a separate field instead of just the first question?
Because it used to be the first question, and that broke. The old code auto-flagged whichever question was added first as "the in-game name". One real guild’s first question was "Why you want to join us." — so the answer, "because", was being stored as the applicant’s character name and was ready to be written into the identity registry on approval. The name now has its own labelled first-row input with three modes per type: Required, Optional, or Off. The shape check is a floor, not the fix: a test asserts that "because" still passes it, on purpose, so nobody reads the pattern and believes it caught the bug.

See it running before you install

The community server runs the bot in the open — a live killboard, real boards to press, and humans who answer questions.

Watch it live

Recruit in the server you already run

One board, one staff forum, one press of Approve — free, like the rest of the bot.