# Run a giveaway in chat

Create a giveaway, let chat enter with a keyword, then close it, draw a winner, confirm the prize and put it on stream.

Updated 22 September 2026

## Before you start

A giveaway is a record with its own rules: the prize, the word that enters it, how many winners there are, and how a winner claims it. You set it up once, open it when you are ready, and every line chat sees comes from a flow — so the wording is yours to change.

- Bloopbot connected to your channel so it can read and answer chat: [Get started with Bloopbot](https://bloopbot.com/docs/getting-started) walks through it.
- The **Giveaway** pack, from **Flows → Explore packs**. It brings the flows a giveaway runs on: the `!giveaway` mod commands (one flow per command — **Open a giveaway**, **Close a giveaway** and the rest), `!enter`, keyword entry, the confirm word, and the winner announcement. If the Flows list already holds flows such as **Giveaway status** or **Enter the giveaway**, yours came with the pack earlier — check what is there instead of installing a second copy.
- Points, if a ticket is to cost anything: [loyalty points](https://bloopbot.com/docs/loyalty-and-regulars) are what a ticket spends. A giveaway whose ticket cost is 0 needs nothing here.
- The bot account as a moderator, as for any flow that reads and answers chat — the Setup guide’s **Give the bot mod** step.

Giveaways are included for every channel. Drawing more than one winner needs a plan that includes it, and the editor says so when your channel does not hold it: [your plan](https://bloopbot.com/docs/what-your-plan-includes) shows what you have.

> **Entry is from chat**
>
> Chat is the entry channel today: the keyword and `!enter`. The editor also shows a **Web** row, switched off, for the public giveaways page that is still to come.

> **Had the older Giveaway controls?**
>
> One flow used to answer every `!giveaway` command. It still works. Installing the pack now brings you the seven newer command flows alongside it, and the pack page tells you before you install if `!giveaway` is already claimed. Once you have switched the new ones on, pause or delete **Giveaway controls** — with both running, a bare `!giveaway` or an unknown word after it gets answered twice.

![The Giveaway pack’s install review, headed Command already in use: “Command !giveaway is claimed by this flow and by Giveaway controls (paused). While both flows are live, each answers a !giveaway in chat. Change one of the command words, or keep one of the flows paused.” and “You can install anyway — this is a warning, not a blocker. Rename one of the command words afterwards, or leave one of the flows paused.”](https://bloopbot.com/docs/screenshots/giveaway-command-conflict.jpg)

_The Giveaway pack’s install review warns Command already in use: !giveaway is claimed by this flow and by “Giveaway controls” (paused) — a warning, not a blocker._

## 1. Set the rules

Open **Giveaways** in the sidebar, under Live, and press **New giveaway**. A new giveaway starts as a **Draft**: nothing in chat can see it yet.

![The Giveaways page: a Drafts section with Blind box giveaway, an Open section with Saturday sub-a-thon, a Finished section with Friday key drop showing the Drawing badge, 5 entries, says “lucky” and 2 winners, and a collapsed Archived shelf.](https://bloopbot.com/docs/screenshots/giveaway-list.jpg)

_The list groups giveaways the way you work through them: Drafts, Open, Finished and a collapsed Archived shelf, with the entry count and the keyword on every row._

1. Give it a **Title** — the prize as chat reads it, such as “Friday key drop” — and a **Description** for your own notes.
2. Set **Winners**. One is the usual case.
3. Set the **Keyword**: the one word that enters the giveaway, such as `lucky`. Only one open giveaway can hold a keyword at a time, and it is not a command, so it takes no prefix.
4. Decide what a ticket costs. **Ticket cost (points)** is spent per ticket, **Max tickets each** is how many one viewer may hold, and **First ticket is free** takes the cost off the first one they take.
5. Give subscribers, VIPs and regulars **luck** if their tickets should weigh more. The best multiplier a viewer qualifies for is the one used; multipliers never stack.
6. Under **Who may enter**, tick **Must be following**, pick roles, or set a watch-time minimum. Nothing ticked means anyone.
7. Under **Claiming the prize**, choose whether a winner says a word to confirm (**In chat**) or is final the moment they are drawn (**None**). With chat confirmation, set the **Confirm word** (one word, `!claim` by default), the **Seconds to confirm**, and whether a new winner is drawn when that window runs out.
8. Leave **Opens** and **Closes** empty to open and close it yourself, or fill them in to run it to a schedule.

Press **Save**. The giveaway is still a draft, so nothing reaches chat yet.

> **Rules are fixed once it starts**
>
> After a giveaway opens, its rules cannot be changed and the editor says so. A closed giveaway that drew nothing is the exception — correct it and open it again. For a second run of the same idea, create a new giveaway with the same rules.

## 2. Let chat enter

1. Press **Open** in the **Run** panel. The badge changes to **Open**, and the pack’s flow says so in chat: _🎉 Friday key drop is open! Type lucky to enter._
2. Type the keyword in chat as a viewer would: `lucky`. That line enters them. The pack’s defaults keep a successful entry quiet, so watch the **Entries** list on the page rather than chat.
3. A viewer who wants more than one ticket types `!enter 3`, or `!ticket 3`, and is charged for each ticket. `!enter max` takes the most they can hold.
4. Watch the run panel: the entry count and points spent refresh on their own, and the entries list shows each viewer with their tickets, badges and watch time.

A refusal is said back to the viewer in the giveaway’s own words — not following, the wrong role, too little watch time, not enough points, or already holding every ticket they can. If chat says nothing at all, the keyword flow is usually paused or was never installed; the last section covers that.

## 3. Close it and draw a winner

Everything about the giveaway is on one page: the rules on the left, what it is doing right now in the **Run** panel on the right.

![One giveaway’s page: the Rules column with Title “Friday key drop”, Cover art set to key-drop.png above its picture, Winners 2, the chat entry row, Keyword “lucky”, Ticket cost (points) 100 and Max tickets each 5, First ticket is free ticked, Must be following clear, and Claiming the prize reading In chat, !claim and 60 seconds; and the Run column with 5 entries and keyword “lucky”, a Draw and Call off button, a Slot 1 winner marked Claimed, a Slot 2 winner Waiting to confirm with 55s left, and the five entrants with their tickets and badges.](https://bloopbot.com/docs/screenshots/giveaway-run.jpg)

_The worked example’s record after the draw: Cover art picked, Winners 2, Ticket cost 100, Max tickets each 5, 60 seconds to confirm, one winner slot Claimed and one Waiting to confirm 55s left. One difference from the example below: Must be following is clear here, because checking follows needs a channel whose Twitch connection allows it._

1. Press **Close** to stop entries, or **Close and draw** to do both at once. Entries stop the moment either is pressed.
2. The Draw button fills the empty winner slots at random. It closes an open giveaway first, so it is always safe to press.
3. Each winner appears as a **Winner slot** card with their avatar, tickets and a countdown for the confirm window. Chat hears who won from the pack’s announcement flow.
4. A winner types the confirm word to claim. You can also press **Confirm** on the slot yourself — that is what to do when the prize was handed over on stream.
5. Press **Reroll** on a slot to replace that winner with a fresh draw from everyone who has not won yet. The slot card shows the replacement.
6. When every slot is confirmed the giveaway reads **Finished**. Press **Archive** to file it away under the collapsed **Archived** shelf.

When a confirm window runs out and the giveaway is set to draw a new winner when it does, that slot is redrawn on its own and the card shows the new winner.

> **Calling a giveaway off**
>
> Press **Call off** to end a giveaway that should not finish. Every point spent on tickets goes back to its viewer, and the record ends as **Called off**. It cannot be reopened, so create a new one if you want to try again.

## 4. Run it from chat

Moderators can drive the whole giveaway from chat. Each command is its own flow, named for what it does — **Open a giveaway**, **Close a giveaway**, **Draw a winner**, **Reroll a winner**, **Confirm a winner**, **Cancel a giveaway** and **Giveaway status** — so you can change one, or switch it off, without touching the rest.

| Command | What it does |
| --- | --- |
| `!giveaway open [keyword]` | Opens a giveaway, taking the keyword typed after the command |
| `!giveaway close` | Stops entries; `end` and `stop` work too |
| `!giveaway draw` | Draws the winners; `roll` and `pick` work too |
| `!giveaway reroll [slot]` | Redraws one slot; without a number it is slot 1 |
| `!giveaway confirm <name>` | Confirms that winner for them |
| `!giveaway cancel` | Calls the giveaway off and refunds the points — the broadcaster only |
| `!giveaway` | Anything else says where the giveaway stands |

An operation on a giveaway that is not in the right state says why in chat. `!giveaway cancel` is quieter: only the broadcaster can call a giveaway off, and it does nothing at all for anyone else — no chat line, so it reads the same as a typo to a moderator who tries it.

> **An easy extension**
>
> Want VIPs to draw winners too, without giving them every other command? Open the **Draw a winner** flow and change its level check from Moderator to VIP — the other six commands are untouched.

## 5. Put the moments on stream

The **Giveaway** pack also shows three giveaway moments on your overlay as alerts: the giveaway opening, a winner being drawn, and a winner confirming. Each is its own flow, and each plays the alert design it names: **Giveaway opened alert** plays your `giveaway-open` alert design, **Giveaway winner alert** plays `giveaway-winner`, and **Giveaway claimed alert** plays `giveaway-claimed`.

1. Install the **Giveaway** pack from **Flows → Explore packs** if it is not in your Flows list yet.
2. On an overlay, add a **Custom alert** layer for each moment and rename its design to the name that flow uses — or point each flow’s **Design** field at a design you already have.
3. Open **Giveaway opened alert**, **Giveaway winner alert** and **Giveaway claimed alert** and enable the ones you want.

A missing design is not an error: the run continues, nothing is shown for that moment, and the run log says which design name it wanted. [Arranging your overlay](https://bloopbot.com/docs/arrange-your-overlay) covers placing alert layers, and [Add a widget to OBS](https://bloopbot.com/docs/widgets-in-obs) covers putting the overlay in OBS.

## 6. Put the giveaway panel on stream

Chat runs the giveaway; the **Giveaway** widget is where viewers watch it. One panel follows the giveaway you are running and shows the prize and its cover art, the keyword, how many entries are in, the last few people who entered, and the draw itself.

![The overlay editor for an overlay called Giveaway: the Layers tab with one Giveaway layer, the panel drawn at the bottom left of the canvas and selected with its toolbar above it, and the settings panel saying the layer has no content controls here, with its Style section and its place on the canvas at the bottom.](https://bloopbot.com/docs/screenshots/giveaway-panel-editor.jpg)

_A Giveaway layer selected in the overlay editor: Layers on the left, the panel on the 1920 × 1080 canvas, and the layer’s panel on the right._

1. Open **Widgets**, press **New overlay**, choose **Giveaway** under **Start with** and give it a name. **Start with** offers two starting points: **Giveaway panel**, a corner card, and **Big reveal**, a wider one that draws the draw out longer and lists more entrants.
2. Press **Create overlay**. Adding a **Giveaway** layer to an overlay you already have works the same way, from **Add** on the left of the editor. Press **Publish** to put it on stream.
3. Give the prize a picture on the Giveaways page: **Cover art** sits beside the title and is picked from your media library. It is optional, and setting it needs no Twitch permission.
4. Copy the widget’s **OBS URL** and paste it into an **OBS Browser Source**, 1920 × 1080 with a transparent background — [the same as any other widget](https://bloopbot.com/docs/widgets-in-obs).
5. Open the giveaway. Everything else on the panel follows from the record: the keyword, the entry count and the last few entrants appear as chat enters.

![The giveaway panel while entries are open: the heading GIVEAWAY, the cover art above the prize “Friday key drop”, the keyword “lucky”, “5 entries”, the line “Entries open”, and the last five entrants — pixelpal, bytebaron, quietmouse, neonnina and maplemonk — each with the time they entered.](https://bloopbot.com/docs/screenshots/giveaway-panel-entries.jpg)

_The panel while entries are open: the prize, its cover art, the keyword, how many have entered, and the last few entrants with the time each one entered._

While entries are open the panel counts down to the close time you set, or reads **Entries open** when the giveaway has no scheduled close. A giveaway that is still a draft draws its card with **Not open yet**, and nothing at all is drawn once one finishes or is called off.

Then the draw. Press **Draw** on the giveaway (or **Close and draw**, or `!giveaway draw` in chat) and the panel takes over: each winner slot spins in turn and lands with that winner’s name and their confirm window counting down beside it. Redrawing a slot spins that slot again with the fresh draw.

![The giveaway panel just after the draw: the same prize and cover art, then two winner slots reading “PixelPal” and “QuietMouse”, each with “59m 55s to confirm” beside it, above the list of the five entrants.](https://bloopbot.com/docs/screenshots/giveaway-panel-overlay.jpg)

_After the draw: two winner slots landed, each with its own confirm window counting down, above the entrants list._

> **Refreshing OBS is safe**
>
> Reload the Browser Source at any point and the panel comes back with the giveaway as it stands — the prize, the keyword, how many have entered, the entrants, and the winners with their confirm windows. Nothing about the draw happens in the page: the panel only draws what the giveaway is already doing, so a draw that has already been made shows its winners straight away. A draw that is still animating when the page reloads carries on from where it is rather than starting again: the reloaded page picks the reveal up at the point it has already reached and lands on the same winners at the same moment.

> **One giveaway panel per channel**
>
> Your channel has one panel, and it follows the giveaway you are running. Open two giveaways at once and it shows the one you opened most recently, so run one at a time when you want to be certain which giveaway is on screen. When the giveaway it is showing finishes or is called off, the panel clears.

**What you should see**

- The heading **Giveaway** above the prize, with your cover art above it when the giveaway has one.
- The keyword, the entry count and the last few entrants, updating as chat enters.
- A countdown to the close time while entries are open, or **Entries open** when there is none.
- At the draw: the reel spinning per slot, then each winner with their own confirm countdown.
- Nothing at all once the giveaway finishes or is called off — the panel clears rather than freezing on the last winner.

**If something looks wrong**

- The card reads **Not open yet**: the giveaway is still a draft. Open it on the Giveaways page.
- The card reads **No giveaway right now**: there is nothing to show, because no giveaway has been created on the channel yet.
- The card reads **Entries closed — drawing next**: entries have stopped and the draw has not run yet. Press **Draw** on the giveaway.
- No cover art: the giveaway has none, or the file it used has been deleted from your media library. A missing file draws no art rather than a broken picture — pick another under **Cover art**.
- The panel is showing a different giveaway: two are running, and it follows the one you opened most recently. Run one at a time.
- The panel cleared in the middle of a stream: the giveaway finished, or someone called it off. Points spent on tickets go back to their viewers — see the note under step 3.
- Nothing is drawn at all: the layer may be hidden in the widget editor, or the Browser Source may not be in a visible scene.
- A cover image will not delete from the media library: a giveaway still points at it, and the message names the giveaway. Change or clear its **Cover art** first, then delete the file.

## A worked example: Friday key drop

Two winners, a follow lock, tickets that cost points, and a minute to claim.

1. Create the giveaway: Title `Friday key drop`, Keyword `lucky`, Winners `2`, Ticket cost `100`, Max tickets each `5`, and **First ticket is free** on.
2. Tick **Must be following** and leave the roles clear. Leave the claim rules on chat confirmation, word `!claim`, 60 seconds, with **Draw a new winner when the window runs out** on.
3. Save, then press **Open**. Chat reads _🎉 Friday key drop is open! Type lucky to enter._
4. A viewer types `lucky`: their first ticket is free and they are in. A second viewer types `!enter 5` and is charged for five tickets. A viewer who does not follow you is told they need to follow to enter.
5. Press **Close and draw**. Two winner cards appear, chat says who won and asks each of them to type the confirm word, and the cards count their windows down.
6. One winner types `!claim` inside their window; chat confirms them. The other lets the window run out, so that slot is redrawn and the card shows the replacement, who then types the word.
7. When both are confirmed the giveaway reads **Finished**. Press **Archive**.

> **Where every chat line comes from**
>
> The opening line, the winner announcement and the confirmation line are all the **Giveaway** pack’s flows. To change the wording, open the flow and edit its chat message — the **Insert…** menu offers the tokens those flows already carry, such as `$(winner)`, `$(prize)`, `$(keyword)` and `$(entries)`.

## What you should see

- On **Giveaways**: a **Drafts** section holding the giveaway before you open it, then **Open** with the entry count and the keyword it answers to, then **Finished**, and **Archived** as a shelf you can show and hide.
- In chat while it is open: the opening line from the pack, one entry per viewer who types the keyword, and a refusal said back to anyone who cannot enter.
- On the run panel: the entry count and the points spent, every entry with its viewer’s tickets and badges, and one card per winner slot with its countdown.
- On **Flows → Run log**: a run for the keyword or `!enter` — carrying the refusal reason when one happened — and a run for each `!giveaway` command a moderator typed.
- Nothing at all in chat until you press **Open**: a draft is invisible to viewers.

## Troubleshooting

- The keyword enters nobody: the giveaway is still a draft, its keyword flow is paused, or the word typed is not the one on the record. Check the badge and keyword on the page, then the flow’s live switch.
- Nothing happens for one particular word: only one open giveaway can hold a keyword, so another open giveaway in the channel may own that word.
- A viewer cannot enter and chat does not say why: the refusal line is a connection in the flow. Open the keyword entry flow and check that the enter node’s **rejected** output is wired to a chat message.
- Drawing reports nothing to draw from: nobody entered while it was open. A redraw only replaces a winner who already exists, so create a new giveaway for another draw.
- A viewer types the confirm word and nothing happens: the word has to match the record’s **Confirm word** exactly, be typed inside the countdown, and come from the winner the slot is waiting on. The slot card shows which state that winner is in.
- Drawing more than one winner is refused: that needs a plan that includes it. Set **Winners** to one, or check [your plan](https://bloopbot.com/docs/what-your-plan-includes).
- The overlay shows nothing at a giveaway moment: no alert layer on your overlays shows the design the flow asks for, or that design does not exist. The run log says which name it wanted.
- Chat never says who won: the winner announcement and the confirm-word flow are separate flows of their own — the announcement runs on the draw, and the confirmation line only after a winner types the word. Check both are installed and live.
