Skip to content
Now live — sign in to your guild dashboard
Guild Butler
EN
Sign in Add to Discord
Killboard

Raids

Raids & signupsAttendance & stats

Economy

Loot & settlementRegearSiphoned energy

Management

Recruitment & applicationsRoles & nicknamesRoster upkeep

Extras

GiveawaysDashboard & white-labelFeatures Pricing Docs
Sign in Add to Discord

Features Giveaways

Draws that can’t be rigged. Silver that can’t bounce.

Post a styled card with an Enter button, or raffle tonight’s roster. The bot draws at the deadline, pays winners straight into their guild balance, and announces them in the channel.

Discord
🎁
Guild Butler ✓ APP Today at 15:00
🎉 Guild bank blowout
Thanks for a solid week of ZvZ. Good luck.
🎁 Prize
3,000,000 silver
💰 Silver
1,000,000 each
🏆 Winners
3
⏳ Draws
in 6 hours · Today at 21:00
🎟️ Entries
41
🎭 Who can enter
@VITRYLA
⚖️ Odds
⚖️ Recent raiders get better odds — 1 ticket each, +1 per attendance point (max 10).
🚧 Needs at least 2 attendance points to enter.
Enter
An open, weighted giveaway card. The field names and their order are what the card builder produces; the ⚖️ Odds field appears only when weighting, a minimum, an in-game-name requirement or a repeat is set.
5 min – 28 days
How long a giveaway can run
Anything outside that is refused, not clamped — a typed 2y that quietly became four weeks would be a lie about when the draw happens.
every 60s
Deadline sweep
Bot down when it came due? The draw still fires on the first tick after boot, and the card records when it was actually drawn.
1 + points, max 10
Tickets on a weighted draw
Attendance points from the last 28 days. The floor of one keeps a newcomer in; the cap stops one raider owning every draw.
1 open
Member-hosted draws, per member
Their silver is locked the moment the card posts, so nobody can promise the same silver twice.
201
Tests on this feature
Across seven files — the draw, the escrow arithmetic, eligibility, tiers, weighting, raffles and card rendering.

01 · Why it exists

A giveaway bot that has never heard of your guild

Most guilds run draws through a second, generic bot. It works — and it knows nothing about the guild it’s drawing for.

What that costs you

A standalone giveaway bot can’t tell whether the person who just won holds your guild role, whether they were on tonight’s roster, or whether they have raided at all this month. It has its own permissions, its own branding and its own idea of who a member is.

And it has no connection to balances. So a silver prize still ends with an officer typing /adjust for each winner, one at a time, with nothing in the books saying why the silver moved.

If a member wants to put up their own prize, nothing stops them promising silver they then spend before the draw. Guild Butler already owns eligibility, the roster, the attendance ledger and the balance ledger — so a giveaway can use all four, and a prize can be locked up front rather than just promised.

Discord

Only you can see this

🎁 Giveaways

Post a prize draw with an Enter button. It draws itself at the deadline.

Running now (2)

• Guild bank blowout — 41 entered · in 6 hours

• Weekly 2m draw — 12 entered · in 2 days

Recently finished

• T8.3 Direwolf — ended

• Avalonian mount — cancelled

New giveaway
The officer hub. The jump links are the point: a giveaway’s post is its only surface, and a busy channel buries it within the hour.

02 · How it works

Five fields and it runs itself

No babysitting. Fill the modal, press Post, and the next thing anyone has to do is read the winners.

  1. Open the hub and start one officer

    /giveaway, or /menu → 🛡️ Officer tools → 🎁 Giveaways, opens a private hub with a ➕ New giveaway button. The hub also lists what is running as jump links, with an entry count and a countdown, and the last few finished ones marked ended or cancelled. That list is not decoration: a giveaway’s post is its only surface, and in a busy channel it is buried within the hour — without a link back to it an officer cannot reach the ⚙️ button to cancel or reroll anything.

  2. Fill the five-field modal officer

    Discord caps a modal at five inputs, so they are spent on the five things a giveaway cannot exist without: Prize, How long? (45m · 6h · 2d), Winners (default 1), Silver per winner (optional) and Description (optional). Duration accepts 45m, 6h, 2d, 1d12h, or bare digits as minutes, and an out-of-range one is refused rather than trimmed to fit — a 2y that quietly became four weeks would be a lie about when the draw happens. Winners go the other way: 200 is clamped down to the maximum of 20, because that typo has exactly one sane reading and the real number is printed on the card before anyone enters. A zero or a negative is refused, having none. Leaving the silver field empty makes it an item prize: no silver moves, and the card says the host hands it over in game.

  3. Set eligibility, styling and odds on the confirm panel officer

    The panel restates everything and adds the pickers a modal cannot hold: a Who can enter? select (Everyone · Guild members only · Specific roles…), a role multi-select when it applies, a channel select, and a button row of 🚀 Post it · 🎨 Style · ⚖️ Odds · 🏆 Prizes · ✖️ Discard. 🏆 Prizes appears only on a multi-winner giveaway, because a prize ladder means nothing with one place to pay. Everything has a working default, so the shortest path is modal straight to Post it.

  4. Post it bot

    The card is sent first, and only then is the row flipped from draft to open and stamped with that message id — a giveaway that opened before its card existed could be drawn by the sweep with nothing to edit. The countdown is re-stamped from the moment of posting, not from when the modal was opened. On a member-hosted giveaway the stake leaves the host’s balance inside that same transaction, so a card that cannot be funded never becomes an open giveaway and the message just sent is deleted again.

  5. Members press Enter member

    The Enter button is a toggle: pressing it enters, pressing it again withdraws, and both get a private reply. Entering names the running entry count and when it draws — on a weighted giveaway it also states how many tickets that member holds. Eligibility is read off the roles Discord sends with the click, never a member fetch, so it stays inside Discord’s three-second deadline on any size of server. The host is refused on their own giveaway, in every mode.

  6. The deadline arrives bot

    A sweep polls every 60 seconds for open giveaways whose deadline has passed. Unlike the gather ping there is no staleness grace: a draw that came due while the bot was down is an obligation, so it fires on the first tick after boot however late. Everything that matters happens in one SQLite transaction — claim the status, resolve entrants, draw, write winner rows, move the silver — so an officer’s ⏱️ Draw now, a cancel and the sweep can all race and exactly one of them wins.

  7. Winners get paid bot

    The card is edited into its ended state (winners listed, Enter button gone, final count), a separate announcement mentions the winners in message content so the ping actually fires, and each winner gets a DM. Silver arrives as a real balance_ledger row attributed to the host, visible in /audit like every other movement. All three of those steps are best-effort and independently caught: the money committed before any of them ran, so a deleted card, a locked channel or closed DMs degrade the announcement, never the outcome.

  8. Fix it afterwards if you need to officer

    ⚙️ on the card opens the manage panel. While it is open you get ⏱️ Draw now, ✏️ Edit, 🔁 Repeat and ✖️ Cancel it; once it has drawn you get 🎲 Reroll a winner. A cancel refunds a member host’s whole stake and pays nobody. A reroll writes a compensating giveaway_undo entry against the replaced winner, credits the replacement with that same place’s prize, and announces the swap publicly — the first announcement named someone, so a silent replacement would leave the channel believing the wrong thing.

What a modal can’t ask for

Discord modals are text-only: no role picker, no channel picker, no file. So the confirm panel carries the pickers, and the modal carries the words. The panel restates the whole giveaway in plain language first, because it is the last screen before something public happens.

🏆 Prizes only appears on a multi-winner giveaway — a prize ladder means nothing with one place to pay — and both ⚖️ Odds and 🏆 Prizes turn blue once they have been set, so the row shows at a glance what is non-default.

On a member-hosted giveaway there is no channel picker at all. A member’s giveaway may only land in the channel the guild designated, and offering a picker that silently refuses would be worse than not offering one.

Discord

Only you can see this

Ready to post

🎁 Prize: 3,000,000 silver

💰 Pays: 1,000,000 silver each (total 3,000,000)

🏆 Winners: 3

Draws: in 6 hours (Today at 21:00)

📍 Posts in: #giveaways

🎭 Only: @VITRYLA

Who can enter?
Pick the roles that may enter
Where should it post?
Post it Style Odds Prizes Discard
The confirm panel on a three-winner, role-restricted draft.

03 · The card

The post is the whole giveaway

No board behind it. One card edits itself in place — open, then ended or cancelled — never three near-duplicate posts.

Open, ended, cancelled

The open card names the prize, what each winner is credited, the winner count, a live entry count, who may enter, and the deadline as both a countdown and an absolute time — Discord renders both from one timestamp, so everybody reads it in their own timezone.

Ending it drops the Enter button, moves the winner list into the card’s own text and adds a 🎲 Drawn field with the moment it actually happened. The “who can enter” line goes away with the button — it is a question nobody can act on any more. Winners are rendered as clickable profile links rather than bare mentions, because a raw mention inside an embed shows as a numeric id on mobile. On a tiered giveaway the places are marked 🥇🥈🥉, since the place is the information people are reading for.

Cancelling strikes the title through and says nothing was drawn or paid. The entry rows are kept either way, so "who had entered?" stays answerable.

An item prize gets a 📦 Delivery line stating that a person hands it over in game and the bot only runs the draw — and on a member-hosted one it names them. The bot can guarantee a silver prize, because it is escrowed. It cannot guarantee that a mount changes hands, and the card should not imply otherwise.

Discord
🎁
Guild Butler ✓ APP Today at 21:00
🎉 Guild bank blowout
Thanks for a solid week of ZvZ. Good luck.

🏆 Winners

🏆 Rukavytsia
🏆 Nadiya
🏆 Kolyada
🎁 Prize
3,000,000 silver
💰 Silver
1,000,000 each
🏆 Winners
3
🎟️ Entries
44
🎲 Drawn
Today at 21:00
⚖️ Odds
⚖️ Recent raiders get better odds — 1 ticket each, +1 per attendance point (max 10).
🚧 Needs at least 2 attendance points to enter.
The same giveaway after the draw. The Enter button is gone — a dead button on an ended card is worse than a stale count.
Discord
🎁
Guild Butler ✓ APP Today at 21:00

🎉 Guild bank blowout — we have a winner!

@Rukavytsia @Nadiya @Kolyada

💰 1,000,000 silver has been added to each winner’s balance.

The announcement, posted next to the edited card. Mentions live in message content because that is the only place they actually notify, and the allowed-mentions list is scoped to the winners — never @everyone, never a name the text did not print.

A twenty-winner draw cannot blow Discord’s 2,000-character message cap: names are dropped from the tail only when they will not fit, and the number dropped is stated in the text. A winner list that silently ended early would leave somebody believing they had not won.

04 · Raid raffles

The roster is the entry list

🎁 Raffle sits on a raid’s officer console, next to Edit and Manage. It opens the same five-field modal, bound to that raid — and the giveaway it creates has no Enter button at all.

Discord
🎁
Guild Butler ✓ APP Today at 22:40
🎉 T8.3 Direwolf
🎁 Prize
T8.3 Direwolf
🏆 Winners
1
⏳ Draws
in 20 minutes · Today at 23:00
⚔️ On the roster
27
🎭 Who can enter
Everyone on the roster of Hideout Defend — roster + bench. Signing up is how you enter.
📦 Delivery
The host hands this prize over in game — the bot runs the draw only.
A raid raffle for an item prize. No Enter button is rendered, the count is labelled as the roster rather than entries, and Delivery states that a person hands the prize over.

Why there’s no button

The binding is set at creation, not on the confirm panel — a raffle is started from a specific raid’s console, so the raid is the reason the raffle exists rather than a setting on it. The eligibility row is not even rendered, and pressing a stale Enter button from an older build is refused in the data layer, with an explanation of how you actually qualify.

Snapshotted at the draw, not at the post

The roster is written into the entry rows inside the draw transaction. Someone who signs up mid-raid after the raffle goes live is in the draw; someone who leaves is not. Those rows then survive as the record of who was actually in it, which is why an ended raffle reports the snapshot rather than the roster as it stands now.

The bench counts

A benched player turned up and made themselves available. The only reason they hold no slot is that the comp was full, which is the caller’s decision rather than theirs. Excluding them would make a raffle punish the people most willing to flex. (They can be excluded from the loot split — that is a different question, about who fought for the loot. This one is about who showed up.)

Two things a raffle won’t do

It is not offered on a called-off raid: nobody raided, so there is nobody to reward. And it is gated to officers even on a raid a non-officer is calling, because a raffle can mint guild silver — which is economics, and economics stays with officers.

05 · Members hosting

A member’s prize is locked, not promised

Once an officer picks a giveaway channel, members can put up their own prizes. The silver leaves their balance the moment the card posts — never at the draw.

Locked at post — and why not at the draw

Taking the silver at the draw would let the host spend it in the meantime, or fund two giveaways from the same balance. The draw would then bounce on a promise already printed on a public card, in front of everyone who entered.

So opening a giveaway is the escrow point: one transaction re-checks the one-at-a-time cap and the balance, flips the row from draft to open, and deducts every place added up. If any of that fails, the card that was just sent is deleted and no giveaway exists.

Anything not won comes back — at the draw as a refund, or in full on a cancel. Per giveaway, the invariant escrow == credits + refunds is asserted against the ledger itself, across a normal draw, a short entrant pool, zero entrants, a cancel and a reroll. Member-funded silver moves between members and is never created or destroyed.

Discord

Only you can see this

🎁 Start a giveaway

Put up your own prize for the guild. It posts in #giveaways and draws itself at the deadline.

💰 Your balance: 12,400,000

🔒 A silver prize is held from your balance the moment you post — so the prize can’t bounce. Anything not won comes back to you.

📦 An item prize moves no silver — the bot runs the draw, you hand the item over in game.

Start one
The member’s own hub. A member is spending their own silver, so the cost and the rule are stated before they start rather than discovered when their balance drops.
A member hosts 5m / 2m / 1m — and only two people enterLedgerHost balance
Before posting 10,000,000
Post — one transaction Places are 5,000,000 · 2,000,000 · 1,000,000, so the stake is 8,000,000, held as giveaway_escrow 2,000,000
Draw — one transaction, 2 entrants 1st place credited 5,000,000, 2nd place credited 2,000,000, both as giveaway with the host as counterparty 2,000,000
3rd place Nobody left to draw — that place pays nothing 2,000,000
Refund, same transaction The unspent 1,000,000 was never anyone’s prize — back as giveaway_escrow_refund 3,000,000
The check escrow 8,000,000 == credits 7,000,000 + refunds 1,000,000
A cancel instead The whole 8,000,000 is refunded inside the status flip and nobody is paid 10,000,000

Winners take places in draw order, so a short pool leaves the last places unpaid — which is also what "1st, 2nd, 3rd" means when only two people entered. Whether a giveaway is member-funded is stored at creation, not derived from who the host is today: roles change, and accounting must not.

06 · Weighted odds

One ticket each, plus one per attendance point

⚖️ Odds turns an even draw into a weighted one — the people who actually raid get better odds, and the rule is printed on the card so nobody has to guess.

The whole rule, in one sentence

One ticket, plus one per attendance point earned in the last 28 days, up to ten. It is stated that plainly because members are told their own ticket count the moment they enter — an opaque weighting is exactly what makes a draw feel rigged.

The floor of one matters: a newcomer with no history can still win, and a weighted giveaway that shut them out would be pointless for exactly the people it should pull in. The cap of ten is what keeps it fair — uncapped, one dedicated raider owns every draw and everyone else stops bothering.

Points rather than a raid count, because points already carry content weight: a ZvZ is worth more than a gank squad, which is the entire reason raid weights exist. An undo’s compensating negative row nets out for free, and still floors at one ticket.

Weights are resolved at the draw, in one grouped query inside the transaction rather than one per entrant, so a raid attended after entering still counts. A reroll on a weighted giveaway stays weighted — otherwise replacing a winner would quietly switch the rules halfway through.

Discord

Only you can see this

Odds & who can enter

⚖️ Weighted by attendance — 1 ticket, plus 1 per attendance point in the last 28 days, up to 10.

🚧 Minimum 2 attendance points in the last 28 days to enter.

🪪 No in-game name needed to enter.

Equal chances Set a minimum Require in-game name Back
The ⚖️ Odds sub-panel. An attendance minimum narrows whoever the eligibility mode already admitted, rather than replacing it — so “guild members who have actually raided lately” needs no fourth mode. On a raid raffle the minimum button is not offered at all, and the panel says why.
Attendance points, last 28 daysTicketsWhy
01A newcomer with no history is still in the draw
0.51Points are floored before the ticket is added
231 + 2
4.951 + 4
910Exactly at the cap
4010Capped — one raider must not own the draw
−3, after an undo1Negative points floor at one ticket, never zero

In a one-winner draw between a nine-point regular (10 tickets) and a newcomer (1 ticket), the regular wins about 91% of the time and the newcomer about 9%. The arithmetic is deliberately integer throughout: the random source yields integers, so a seeded test can pin an exact draw. The usual floating-point weighting trick would make those tests meaningless.

07 · The draw

Claim, draw, pay — or none of it

Three things can end a giveaway: the deadline sweep, an officer’s ⏱️ Draw now, and ✖️ Cancel it. All three race, and the database decides.

The race is settled by SQLite

Each of those three is a conditional update on the status column, not a check-then-act a second click could slip through. Whoever flips the status does the work; everyone else no-ops. Inside the transaction the order is deliberate: claim first, so the loser of the race does no work at all, then read entrants, then draw, then write the winner rows and the credits.

The credits ride inside that same transaction on purpose. A draw that picked winners and then crashed before paying them would be unrecoverable — the claim already happened, so no retry would re-run it.

Nothing outside the database is touched until it has committed. Editing the card, posting the announcement and DMing the winners all happen afterwards and are caught independently, so a Discord failure can lose a post but never leave the money half applied.

The draft is just a row

A half-built giveaway is a row with status draft — invisible to the sweep, impossible to draw, and reaped after 24 hours if it is never posted. There is no in-memory session to go stale when a panel is left open overnight.

Discord

Only you can see this

Manage giveaway

🎁 Guild bank blowout

🎟️ 41 entered

⏳ Draws in 6 hours

Draw now Edit Repeat Cancel it
The manage panel behind ⚙️ on an open card. Once it has drawn, this row is replaced by a single 🎲 Reroll a winner.
SituationWhat the draw does
Fewer entrants than winners Not an error — everybody wins, the remaining places pay nothing, and a member host’s unspent stake is refunded.
Nobody entered at all A legitimate outcome. The card ends saying nobody entered, the announcement says so too, and a member host gets the whole stake back.
The host entered on an older card Excluded again at the draw, not only at the click. The host can never win their own giveaway.
The guild is not currently served by a bot client The giveaway is skipped without being touched and retried on a later tick. Drawing with no way to announce it would strand winners who were paid but never told.
An officer presses Draw now while a sweep tick is in flight One of them claims the status; the other returns nothing and does no work.
A winner is rerolled Their row is stamped rather than deleted, the prize is clawed back with a compensating giveaway_undo entry, and the replacement inherits the same place.

08 · Everything else

The rest of what’s in the box

Officer hub with jump links

/giveaway lists what’s running, with entry counts and links back to each buried card.

Open giveaways are listed soonest-deadline-first with their entry count and countdown, plus the last few finished ones marked ended or cancelled, each as a link straight to its message. The same /giveaway command serves officers the management hub and everyone else the member hosting hub, so nobody has to remember two commands.

Who can enter, three ways

Everyone, a one-click guild-members preset, or a hand-picked list of roles where holding any one qualifies.

The select offers Everyone, Guild members only (which is just the roles mode pre-filled with your configured guild role), and Specific roles… with a multi-select for up to 25 roles. Holding any one of the listed roles qualifies, which is what officers actually mean when they list several. A roles giveaway with an empty list qualifies nobody rather than everyone — an officer who opened the picker and chose nothing was trying to restrict it — and Post is refused outright in that state, so a card nobody can enter never goes up. If your server has no guild role configured, the preset says so in its own label instead of quietly doing nothing.

Gate entry by attendance or IGN

An optional attendance minimum and an optional linked in-game name, stacked on top of whoever the eligibility lets in.

A minimum attendance is checked after whatever the eligibility already allowed, so "guild members who have actually raided lately" is expressible without a fourth mode; the refusal tells the member what they need and what they have. It is deliberately not offered on a raid raffle, where the roster already is the filter and a second floor would exclude the people it just rewarded. The in-game-name requirement is different: it is about being able to hand the prize over, so it IS applied to a raffle, filtering the roster at snapshot time. It is refused last of all, because "go and run /ign set" is a thirty-second fix and should not mask a role gate the member can do nothing about.

Multi-tier prizes

Type 5m, 2m, 1m and each place pays its own amount, in draw order, marked 🥇🥈🥉 on the card.

Tiers are the prize model, not an add-on: a flat giveaway is simply N equal places, so the escrow total, the credit loop, the refund and a reroll all read one list and cannot disagree about who is owed what. A stored ladder also sets the winner count, so the card can never promise three winners over a two-place prize. Winners take places in draw order, which is the only ordering a member can check against the announcement, and the place is recorded, so a reroll on second place draws another second place rather than another first. One unreadable entry refuses the whole ladder rather than guessing which place was meant.

Recurring rounds

Set 🔁 Repeat to a number of days — up to 90 — and a fresh round posts itself each time the current one draws.

The next round is created as a draft and then posted through the ordinary post-then-open path — exactly what a human does — so recurrence adds no second way for a giveaway to become open, and the escrow, the one-at-a-time cap and the message stamp all still run. Each round points at the original of the series rather than at its predecessor, so a long-running weekly is not a thousand-link chain to walk. A member-funded series the host can no longer afford stops itself, clears its own repeat setting and DMs the host with the shortfall, instead of failing silently on every tick. Repeat can be set or cleared on a live giveaway, since it only concerns future rounds.

Card styling and saved looks

Colour, cover image, title override and the Enter button’s label, emoji and colour — reusable as named presets.

A guild running several giveaways a week in one channel needs to tell them apart at a glance, and a giveaway has no board behind it — the post is the whole surface, which makes styling load-bearing rather than decorative. 🎨 Style sets an embed colour, a button colour, a card title, a button label and emoji, and a cover image (a pasted URL, or an upload via /giveaway image: which is re-hosted onto the post so it survives the source URL expiring). Save look stores that appearance under a name, up to 25 per server, and it appears in a picker on future giveaways. A preset carries appearance only — never a prize, deadline or eligibility.

Fund prizes from a guild bank

Off by default: an officer prize is credited to the winner and the banks are untouched unless you opt in.

By default a guild-funded prize is credited to the winner and the merchant and regear banks are left alone — the same ruling regear credits ship with. /settings → Economy can point giveaway prizes at the merchant or the regear bank instead, and each draw then writes a matching bank movement so the guild’s books stay closed. It is deliberately not floored at the bank balance: refusing a draw because a bank is short would break a promise already printed on the card, and a negative bank is visible and correctable where an unpaid winner is not. Member-funded giveaways never touch a bank — that silver came from a member and the escrow already accounts for it.

Cancel and reroll, both on the record

A cancel pays nobody and refunds the stake; a reroll claws the prize back with a compensating entry, never a deletion.

Cancelling flips the same conditional status the draw uses, refunds a member host’s whole stake inside that flip, strikes the card title through, and keeps the entry rows so "who had entered?" is still answerable afterwards. A reroll stamps the replaced winner’s row rather than deleting it, writes a giveaway_undo against their balance, and draws a replacement from entrants minus every winner the giveaway ever had — so repeated rerolls walk down the pool instead of circling back to someone already replaced. If the pool is exhausted the reroll refuses and nobody new is drawn. The confirmation says in words that a credited prize is being taken back, before the click rather than after.

Edit a live giveaway — the safe half only

Change how it looks, retitle it, or give it longer. The prize, winners and eligibility are fixed once people enter.

✏️ Edit on the manage panel reaches the card’s appearance and the deadline. The deadline is extend-only, enforced in SQL: shortening it would be a way to close entry the moment an unwanted entrant appeared, and ⏱️ Draw now already ends one early, openly and with an announcement. The prize, the silver, the winner count, the eligibility and the odds have no setter that can reach an open row at all, and a test asserts that absence — those are the terms people entered on, and on a member-funded giveaway changing them would invalidate an escrow already taken.

09 · Commands

One command, and everything else is a button

The /giveaway command serves officers the management hub and everyone else the member hosting hub, so nobody has to remember which one they are.

/giveaway/giveaway image:/menu → Officer tools → Giveaways/menu → Me → Start a giveaway/settings → Economy/ign set/audit

The image option exists because a slash command is the only place Discord lets a file be uploaded — a modal is text-only and a button carries nothing. So the flow is: start the giveaway, then run /giveaway image: before posting, which attaches the cover to your newest un-posted draft. The reply says so rather than leaving it to be discovered.

10 · What it cannot do

The limits, straight up

This feature moves silver, which is the reason to be blunt about where the guarantees stop.

11 · Questions

Questions officers actually ask

Do we still need a separate giveaway bot?
No. This replaces it, and it knows things a generic bot cannot: who holds your guild role, who was on tonight’s roster, who has raided in the last four weeks, and what everyone’s balance is. A silver prize lands in the winner’s balance as an auditable ledger entry instead of an officer typing /adjust for each winner afterwards.
What happens if the bot is offline when a giveaway is due?
It draws on the first sweep tick after it comes back, however late. This is deliberate and differs from the gather ping, which is skipped when it is stale: an overdue "gather now" is noise, but an overdue draw is an obligation — people entered and are waiting. The card records when it was actually drawn.
Can a member promise silver they do not have?
No. The whole stake leaves their balance the moment the card posts, not when it draws, and the check runs again inside that same transaction. If they cannot cover it, the card is deleted and the giveaway never opens. They also cannot fund two giveaways from the same silver, because a member may only have one running at a time.
Does an officer giveaway drain the guild bank?
Not by default. The winner is credited and the merchant and regear banks are left untouched, which is the same rule regear credits ship with. If you want the books to stay closed, /settings → Economy can point giveaway prizes at the merchant or regear bank and each draw writes a matching bank movement. Member-funded giveaways never touch a bank.
Can we change the prize after people have entered?
No, and that is on purpose. An open giveaway can change colour, image, title and button, and its deadline can be extended — but the prize, the silver, the winner count and who can enter have no setter that reaches a live card at all. People entered on those terms, and on a member-funded giveaway changing them would invalidate the escrow already taken. To end one early, use ⏱️ Draw now, which announces itself.
Who can run a raid raffle, and does the bench count?
Officers only, even on a raid a non-officer is calling — a raffle can move guild silver, and economics stays with officers for the same reason a non-officer caller cannot settle a taxed raid. The bench counts: they turned up and made themselves available, and the only reason they hold no slot is that the comp was full, which is the caller’s decision rather than theirs.
Someone joined the raid after we posted the raffle. Are they in?
Yes. The roster is snapshotted at the moment of the draw, not when the raffle is posted, so a raffle announced mid-raid rewards everyone who actually joined, and anyone who left drops out. Those snapshot rows then persist as the record of who was in the draw, which is why an ended raffle card reports the snapshot rather than the roster as it stands now.
What stops a double click drawing a giveaway twice?
SQLite. Ending a giveaway is a conditional update on its status column, so the deadline sweep, ⏱️ Draw now and ✖️ Cancel it all race for the same flip and exactly one of them can win it — whoever claims the status does the work and everyone else no-ops. The winner rows and the credits ride inside that same transaction, so a draw can never pick winners it fails to pay.
How do we know a draw was fair?
The selection is a pure function of the entrants, the winner count and a random source, using Node’s cryptographic random generator in production and a seeded one in tests so exact draws can be pinned. Entry rows are kept through cancels and rerolls, so who was in the pool is always reconstructable. There is no cryptographic proof-of-fairness machinery — that is out of scope for a guild bot — so the honest answer is that you are trusting the code and the retained records.
Can members host their own without officers losing control?
Yes. Member hosting is off until an officer picks a giveaway channel in /settings → Economy, member giveaways post only in that channel, a member may run one at a time, and the stake is escrowed. Officers can cancel any giveaway, including a member’s. A host may cancel their own, but not reroll it — withdrawing an offer is not the same thing as clawing a prize back from an announced winner.

See it running before you install

The community server runs the bot in the open — a live killboard, real boards to press, and humans who answer questions.

Watch it live

Run your giveaways where the silver already is

One command, five fields, and the bot draws and pays by itself. Free to add.