Skip to content

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 /verify any 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:ss times 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.