Discord bot best practices
Most projects run three or four separate bots (verification, giveaways, sales, tickets) that each need hosting, each break independently, and each ask your holders to authorize a new app. VectorLabz runs all of it on one shared bot you invite once. This guide is how to set it up well.
1. Invite the bot with the right scopes¶
From studio → Integrations → Discord, use the generated invite link. It requests exactly the permissions the enabled modules need — nothing more:
| Permission | Why |
|---|---|
| Manage Roles | Grant/remove holder + tier roles |
| Send Messages, Embed Links | Post verification, giveaways, sales |
| Create Private Threads | Open claim/support tickets natively |
| Use Slash Commands | /verify, /giveaway, /predict, /resolve |
Warning
Put the bot's role above every role it grants in Server Settings → Roles. Discord won't let a bot assign a role that sits higher than its own. This is the single most common setup mistake.
2. Design your roles before you wire them¶
Decide the role map first, then configure. A clean, tier-driven map ages well:
@Holder → owns ≥ 1
@Stacker → owns ≥ 10
@Whale → owns ≥ 50
@Verified-Staker → has staked ≥ 1 (optional)
Keep verification roles separate from social/vanity roles so a holder dropping below a tier never strips a role you granted by hand.
3. Turn on live verification¶
In the Integrations tab, map each tier to a role and save. Behind the scenes the bot verifies holdings on a schedule and on demand, so:
- New buyers get their role within minutes of holding.
- Sellers lose the role automatically — no manual sweeps.
- A holder can re-run
/verifyany time to force a re-check.
Point your server's welcome channel at /p/{slug}/verify. Holders sign a
message (no gas, no transaction) and they're in.
4. Authorize who can run events¶
Giveaways and prediction pools are powerful, so lock down who can start them.
/giveaway, /predict and /resolve are gated to Manage Server by
default, and you can additionally name an "initiator" role so trusted mods and
founders run events with zero overhead and nobody else can.
Tip
Give your founders and head mods the initiator role and nothing more. They never touch a dashboard to run an event — it's all in-channel slash commands.
5. Run engagement that resolves fairly¶
- Giveaways — pick prize + duration or an exact end time (with timezone). The card counts down live, flips to ended, draws a winner on record, and the winner clicks Claim to open a private thread that pings your claims role.
- Predictions — exact-match (button options) or closest-wins (holders enter
a number, decimals and
mm:sstimes supported). Entry pools can be capped, and ties break on a published fair seed so nobody can argue the result.
Give every pool an ID so /resolve works even with several running at once —
/resolve offers a picker of your open pools.
See Giveaways & predictions for the full command recipes.
6. Wire the sales feed (mpl-core aware)¶
Turn on the sales feed and the bot posts every secondary sale and listing to a channel you pick, across marketplaces, including whether the royalty was paid on each sale — a signal most feeds miss entirely. No extra config; it polls reliably on a short interval.
Anti-patterns to avoid¶
One bot per feature
Every extra bot is another app your holders authorize and another thing that can go down. Consolidate onto one.
Verification roles that double as vanity roles
When a holder sells, the sync strips the role — taking your hand-granted perks with it. Keep them separate.
Letting anyone start a giveaway
Always gate /giveaway behind Manage Server or a named initiator role.
A sales feed that can't tell a listing from a sale
mpl-core trades confuse naive parsers. Use the built-in feed, which is marketplace-agnostic and royalty-aware.