---
title: 'How to Make a Discord Giveaway Bot with Clear Entry Rules'
published date: '2026-10-23'
author: 'Illiana Reed'
title-image: 'https://camelai.com/blog/assets/images/covers/discord-giveaway-bot.png'
---

This guide shows how to make a Discord giveaway bot that posts each giveaway with Join and Leave buttons, keeps a live entry count, draws a winner when time runs out, and lets only organizers end one early or reroll. You describe it to camel-builder, run test giveaways as pretend members in a private test channel, and add it to your server. You don't write any code.

## What a good Discord giveaway bot does

Most giveaway arguments come from a rule nobody wrote down: a double-click, a late entry, or what a reroll is for. A good giveaway bot shows its rules where people enter and follows them:

- **Rules on the post.** One entry each, leave any time before the end, and the host can't enter.
- **A Join button that counts once.** A second press changes nothing, and Leave removes the entry.
- **A hard end time.** Presses after it are refused, even before the draw.
- **A draw from the final entries.** Winners come only from members still entered, and nobody wins twice.
- **Organizer-only controls.** Only members with a permission you choose can start, end early, or reroll.
- **A logged reroll.** It adds one winner from entrants who haven't won, and saves who asked, when, and why.

It doesn't hand out prizes, ping `@everyone`, `@here` or a role, or spot one person with two accounts. Nobody can audit its random pick afterwards, and it doesn't make a giveaway meet any law or platform rule. A ready-made giveaway bot is quicker if its standard rules fit.

## What you need

- A Discord account, to sign in at [bots.camelai.com](https://bots.camelai.com).
- **Manage Server** in your server. In this build, the same permission decides who runs giveaways.
- A channel for giveaways, where you'll add the bot.
- A second Discord account without Manage Server, to see a live winner and check the organizer rule.
- No credit card and no code. camelBot is free while in beta.

## Step 1: Describe the giveaway rules to camel-builder

Sign in. The first screen asks **What should your bot do?** Paste this:

```text
Build a giveaway bot. Prizes are only text; the host hands them out.
/start takes a prize, a duration like 10m, 2h or 3d (30d at most)
and 1 to 10 winners. It posts a numbered giveaway in this channel:
prize, winners, host, end time in UTC, entry count, and the rules
(one entry each, leave any time before the end, the host can't
enter), with Join and Leave buttons. A second Join changes nothing;
Leave removes the entry. Answer presses privately and update the
count on the post. Refuse presses after the end time, even before
the draw. At the end, draw winners at random from the saved entries,
no one twice. Mention them in an announcement, and edit the post to
show them and turn its buttons off.
/end draws a running giveaway now; refuse it once one has ended.
/reroll (number, reason) works only after the end: it draws one new
winner from entrants who haven't won that giveaway, announces it,
and logs who, when and why. If nobody is left, say so.
Only members with Manage Server can use /start, /end and /reroll.
```

The prompt spells out every rule a member could argue about, plus edge cases like a reroll with nobody left. A Manage Server check on each command decides who organizes, and it works the same in the test channel and in Discord.

camel-builder writes the code, checks it, and tries each command while **camel-builder is working…** shows. Ours asked no questions and finished with **Built giveaway · checks passed**, after fixing an alarm error in its own first try. It assumed the three commands reply privately; the giveaway post and announcements are public.

It also settled something the prompt left open: `/end` takes no number. It draws the newest open giveaway in the channel where you run it, and refuses when none is open there. camel-builder reported that a channel can hold two open giveaways, and then a second `/end` ends the older one. Keep one running giveaway per channel.

## Step 2: Choose how it shows up in Discord

- **Camel's app** (marked Recommended): nothing to set up. Commands start with the bot's name: name it `giveaway` and organizers use `/giveaway start`, `/giveaway end` and `/giveaway reroll`.
- **Your own app**: about 5 minutes on Discord's developer site, for the bot's own name, picture, and top-level commands such as `/start`, which you may want to rename in a busy server. Its token goes in camelBot's token field, never the chat.

Both support the same features, and you can switch later. camel-builder reported only command, button and alarm handlers, so the bot reads no ordinary messages. We named ours `giveaway` and selected **Create giveaway**.

## Step 3: Run a test giveaway as Alex and Sam

Every bot has a private test channel, here `#try-giveaway`; nothing in it goes to Discord. The first button in the message box sets who you are: yourself (the owner), or **Alex** or **Sam**, pretend members with no permissions. Quote values with spaces. Mentions and timestamps show here as raw codes.

Each giveaway ends with its own alarm, listed in the alarm clock in the channel header. In the test channel, whether an alarm goes off by itself is decided when it's set: only one due within 15 minutes does, marked "goes off". Longer ones wait for **Run now**, even after their end time. So give the test giveaway 10 minutes.

camel-builder's tries and an earlier attempt of ours used the first numbers, so our full run was giveaway #6. camel-builder ran step 1 for us; we did the rest.

1. As Alex, run `/giveaway start prize:"500 fictional server points" duration:10m winners:1`. It shows under **Your bot hit an error on**: "Alex can't use /start: it needs Manage Server." That's expected, not a bug.
2. Run it as yourself. The post shows the prize, winners, host, end time in UTC, "Entries: 0", the rules, and **Join** and **Leave**. Our alarm clock listed "gw:6 alarm, goes off in 10 min".
3. As Alex, press **Join** twice: "You're in giveaway #6! Entries: 1.", then "You're already entered in giveaway #6."
4. As Sam, press **Join**, **Leave**, **Leave** again, then **Join**. The count goes 2, 1, 1, 2; the second Leave gets "You weren't entered in giveaway #6."
5. As yourself, press **Join**: "The host can't enter their own giveaway."
6. **Look at test data** in the **⋯** menu shows two entries, Alex and Sam, and no winner.
7. Press nothing until the end time.

![Test channel, saved code: Alex's repeat Join refused, Sam joins, leaves twice and rejoins, and the host's Join is refused](/blog/assets/images/inline/discord-giveaway-bot/test-channel-join-leave-and-host-refusal.jpg)

At the end time, with nobody pressing anything, the alarm "gw:6" went off. The announcement named Sam, and the post changed to show Sam, 2 entries, and both buttons off. Test data held Sam's winner row, marked as a draw. One draw from two entrants shows that the winner came from the entries, not how even the odds are.

### Test the rules after the draw

camel-builder ran these for us:

- A second `/giveaway end` in that channel: "Giveaway #6 has already ended." Nothing was drawn again.
- `/giveaway reroll number:6 reason:"winner didn't reply"` drew Alex, the only entrant who hadn't won, in a separate announcement with the reason. The original post still shows Sam. Test data kept Sam's draw and added Alex's reroll with the organizer, time, and reason.
- Another reroll: "Nobody is left to reroll for giveaway #6: everyone who entered has already won it." It saved nothing.

### Check the gap between the end time and the draw

To test late presses before the draw, we started a 20-minute giveaway, #8, and Alex joined. The clock showed "gw:8 alarm, in 20 min" with no "goes off", so after the end time it was still waiting, with the post's buttons on. Then, with our own presses:

- Sam's **Join** and Alex's **Leave** both got "Giveaway #8 has ended, so entries are closed." Alex stayed entered.
- `/giveaway reroll` got "Giveaway #8 hasn't ended yet.", since nothing had been drawn.
- `/giveaway end`, about 4 minutes after the end time, drew Alex and removed the alarm. We didn't use **Run now**.

The end time closes entries; the draw waits for the alarm or `/giveaway end`.

camel-builder also ended a 3-winner giveaway that only Alex had joined, and Alex alone won. One nobody joined ended with "has ended with no entries, so there are no winners."

If something fails, select **Show details** and tell camel-builder "fix that". It works when a second Join leaves one entry, the host, Alex, and late presses all get refused, and a 10-minute giveaway draws a saved entrant by itself.

## Step 4: Publish it and add it to your giveaway channel

After camel-builder's first save, its chat showed **Publish @giveaway as version 1?** camel-builder never publishes on its own. We used **Add to Discord** at the top of the test channel instead, picked the server and channel, and selected **Add giveaway to #camel-bots**, which also publishes the saved code. Camel's app was already in our server, so no Discord permission screen appeared.

![camelBot's dialog after the add: giveaway is live in #camel-bots, with Open in Discord, Back to builder and See its activity](/blog/assets/images/inline/discord-giveaway-bot/giveaway-live-in-channel.jpg)

The bot page then showed **Up to date** and Activity "Nothing yet". Live data is kept apart from test data: **Download its data** in Settings held no giveaways.

Run giveaways only in channels the bot is added to: the announcement is a new post, and a bot can post only in its channels and their threads, not in forum or voice channels.

### Try a live giveaway with a second account

We left ours installed and idle, with no giveaway running, because a real one mentions whoever joins and wins. To check yours in a quiet channel:

1. Run `/giveaway start prize:"Test only, no prize" duration:2m winners:1` and press **Join**. As the host, you're refused.
2. From a second account without Manage Server, press **Join**, and check that it can't run `/giveaway end`.
3. Wait. The post should show that account as the winner with its buttons off, and the announcement should mention it.

If nobody else joins, your host-only test ends with nobody entered.

### Change it while a giveaway is running

While giveaway #10, 12 minutes long, was running in the test channel with Sam entered, we sent:

```text
In winner announcements, also say how many entries there were.
While you work, don't start, end or reroll giveaways or press any
buttons in the test channel: giveaway #10 is running there.
Check the change and save it.
```

We added lines asking it to save only, with no test runs, data changes, or alarm actions. It finished with **Updated giveaway · checks passed**, reporting a change to the normal winner announcement only. Giveaway #10's test data matched before and after, and the clock still said "gw:10 alarm, goes off in 10 min".

At the original end time, the alarm went off by itself and ran the new saved code: the announcement named Sam and ended "(1 entry)".

![Test channel, saved code: giveaway #10 ended with Sam as winner and buttons off, then the alarm's announcement ending (1 entry)](/blog/assets/images/inline/discord-giveaway-bot/test-channel-automatic-draw-with-entry-count.jpg)

That was a test-channel save, not a publish; camel-builder reported that our version 1 includes it. Every publish is a version you can roll back to, and a rollback changes only the code, so saved entries and winners stay.

## Set up organizer permissions in Discord

1. **Check the permissions.** camel-builder reported no extra capabilities, so expect View Channel, Send Messages, Send Messages in Threads, Embed Links, Read Message History and Add Reactions, plus Change Nickname on Camel's app. It gives no roles, so its role doesn't need moving. It never asks for Administrator; don't add it.
2. **Decide who organizes.** All three commands require Manage Server, so by default Discord hides them from members without it: the whole `/giveaway` on Camel's app, each command on your own app. Server integration settings can change that, and the bot still refuses those members. We checked refusals only in the test channel, so check from your second account.
3. **Mind organizers who enter.** The prompt bars only the host, so another organizer can enter and could later reroll.

## Troubleshooting

**`/start` isn't in the command menu.** On Camel's app, type `/giveaway` and pick `start`.

**A member says Join did nothing.** Answers are private, so only they see theirs. Check the post's count; after the end time, every press is refused.

**The test giveaway never ends.** Its alarm was due more than 15 minutes ahead, so it waits for **Run now**, which fires it at the current time. Or run `/giveaway end` in that channel, as we did for #8.

**No winner was announced.** Check **Details** in the bot page's Activity, and make sure the bot is added to that channel. camel-builder reported that the draw is saved even if the announcement fails; we didn't test that. The winners are in **Download its data** in Settings. Fixing the code doesn't rerun a draw.

## Limits to know

| What | Limit |
| --- | --- |
| Winners | 1 to 10 per giveaway |
| Giveaway length | Up to 30 days |
| Giveaways waiting to end | 200 per bot, one alarm each |
| Test-channel alarms | Go off by themselves only if due within 15 minutes of being set |
| Saved data | 100 MB per bot |

In Discord, a 3-day giveaway takes 3 real days to draw. Schedules don't run while a bot is paused, so don't pause it during a giveaway; if an end time passes without a draw, run `/giveaway end` in its channel. The full list is in [Permissions and limits](https://camelai.com/docs/camelbot/limits).

## FAQ

**Can a Discord giveaway bot stop people from entering twice?**
Yes, for one account: one entry per member per giveaway. It can't tell whether two accounts belong to one person.

**How does the bot choose winners, and what does a reroll change?**
camel-builder reported that the code picks at random from the saved entries, no one twice; our tests show only that winners came from entrants. A reroll adds one winner and logs who asked and why. The original post keeps the first winner, and the log doesn't limit how many rerolls an organizer runs.

**Can I run a giveaway for a real prize?**
Yes, but the bot only records entries and draws winners. Delivering the prize, and any legal or platform rules that apply, stay with you.

## Next steps

Start at [bots.camelai.com](https://bots.camelai.com) with the prompt above. For a points prize, pair it with the [Discord economy bot](https://camelai.com/blog/discord-economy-bot). Our [Discord bot maker](https://camelai.com/discord) page has more ideas. camelBot is free while in beta, with no credit card. AI use in your bots draws on a daily allowance; camel-builder reported this one uses none.
