Quick start¶
Setting up email verification on a Discord server takes about three minutes. Watch it happen, or follow the written steps below.
Before you start¶
You need Administrator permission on the Discord server. You don't need a role yet: /setup can create a Verified role for you, and an optional Unverified role for new members.
Using roles you already have? Put the bot's role above them
Discord refuses to let a bot assign a role that sits above its own. Open Server Settings → Roles and drag EmailVerify above your verified and unverified roles. Skipping this is the single most common cause of the Can't find roles. Please contact the admin! error. Roles that /setup creates are placed below the bot's role automatically, so they never have this problem.
The three steps¶
Invite the bot. Use the invite link and pick your server. The bot posts a short welcome message with a link back to this guide.
Run /setup.
A short wizard: let it create the role verified members get (or pick your own), optionally create an Unverified role for new members, add the email domains you accept, and pick the channel the verification button goes in. It writes the configuration and posts the button for you.
Run /testmail [email protected].
Sends a real verification mail so you can see whether it lands in the inbox or in spam — before you announce the server to anyone. Worth doing every time.
That's the whole setup. Members now click the button, enter their address, receive a 6-digit code, type it back, and get the role.
Prefer to configure it manually?¶
/setup is a shortcut for these commands, which you can also run individually:
| Step | Command | Notes |
|---|---|---|
| Default role | /role add @Verified |
Given to everyone who verifies, whatever their domain. |
| Allowed domains | /domain add @university.edu |
Use @*.edu for every .edu address. Omit entirely to accept any valid email. |
| Verification button | /button #verification "Click to verify" |
Posts the embed members interact with. |
| Test delivery | /testmail [email protected] |
Confirms SMTP works and shows spam placement. |
| Check config | /status |
Lists your settings and flags problems it can detect. |
Common refinements¶
Different roles for different domains¶
Map a domain to its own role and members receive it in addition to your default role:
Lock the server down until someone verifies¶
A role on its own doesn't hide anything. Verification only keeps people out once your channels are visible to verified members and hidden from everyone else. The bot can't change channel permissions for you, so do this once, per category:
- Right-click a members-only category (or channel) → Edit Category → Permissions.
- On
@everyone, turn View Channel off (✕). - Add your verified role (for example Verified) and turn View Channel on (✓).
- Keep the channel with the verification button visible to
@everyone, or nobody can start verifying.
Channels inside a category follow it unless they have their own overrides, so a handful of categories usually covers the whole server. This works for members who joined before you set it up, too.
Two options make it stricter, and they combine:
- An Unverified role —
/setupcan create one and give it to every new member (or use/role unverifiedwith/settings auto-unverified enable). Deny that role View Channel where you want it kept out. It only reaches members who join after you turn it on. /settings auto-verify enable— new members are prompted to verify the moment they join, instead of having to find the button themselves.
Block throwaway addresses¶
Wildcards work on both sides of the @, so *spam* blocks any address containing "spam".
Keep a record of who verified¶
/settings log-channel #verification-log posts every successful verification to a channel. On Pro, /export logs writes the whole history to CSV.
Troubleshooting¶
Can't find roles. Please contact the admin! / roles aren't being assigned
The EmailVerify role is below the role it's trying to assign. Open Server Settings → Roles and drag EmailVerify above every role it hands out. Discord enforces this and no permission setting overrides it.
You don't have to guess: run /status, which checks live whether the bot holds the permissions it needs and whether each configured role is actually assignable, and names the ones that aren't. The bot also warns you the moment you set an unassignable role with /role, /domainrole or /setup, and messages your admins when a real verification fails because of it.
A role that belongs to another bot, an integration, or Nitro boosting can never be assigned, by any bot, at any position — pick a different role for those.
The bot is missing permissions
Run /status — the Bot Permissions & Role Order section lists exactly what's missing and why each one is needed.
The quickest fix is to re-invite the bot. Re-inviting a bot that's already in the server doesn't remove it or reset anything — Discord just updates its permissions — so nothing is lost. Alternatively, enable the permissions by hand in Server Settings → Roles → EmailVerify.
| Permission | Needed for |
|---|---|
| Manage Roles | Assigning and removing the verified / unverified roles |
| View Channels | Seeing the channel with the verification button |
| Send Messages | Posting the verification button and log lines |
| Embed Links | Posting the verification button message, admin alerts and the welcome post. Slash-command replies and DMs work without it, so members can still verify — but /button and /setup can't post the button they click |
| Read Message History | Reading the log channel for /export |
| Attach Files | Attaching the CSV produced by /export |
| View Audit Log | DMing whoever added the bot with the setup guide |
The last three are optional: without them the bot still verifies members, but those specific features degrade.
Nobody is receiving the verification emails
Run /testmail with an address you control. If that arrives but members' don't, the recipients' mail provider is filtering — universities in particular run aggressive filters. Paid plans route through Zoho ZeptoMail (EU, transactional-only) which has substantially better inbox placement than shared SMTP.
The member says the code doesn't work
Codes are valid for 15 minutes and allow 5 attempts. The "Code Sent" message carries a Resend code button with a 60-second cooldown. After 5 failed attempts they need a fresh code.
I hit the monthly limit
The free tier is 25 verification emails per server per month, resetting on the 1st. You'll have been warned at 80% and 95%. Credit packs or a subscription lift the cap; credits never expire.
I want to run it on my own infrastructure
It's AGPL-3.0 with a published Docker image. Point it at your own SMTP server and the quota system doesn't apply to you at all. See the self-hosting section of the README.