OddCord system plan
This page holds the whole plan in one place. You do not need to read all of it. Every section starts with a one-line summary, so you can read only the summaries and open the parts you need.
Do this first
Three things, in this order. Nothing else on this page matters until these are done.
- Install seven bots. About two hours. Section 9 lists them. After that you never touch them again.
- Build the account link. A member types one command in Discord and one code in Twitch chat. Section 6, job 1.
- Build one reward. One voucher, sent by you by hand. Section 6, job 3.
Words used here
Each word below means exactly one thing on this page and is never swapped for a similar word.
| Word | What it means here |
|---|---|
| Your system | The website, database, API and Discord bot that you build and own. |
| Bought bot | A Discord bot made by someone else that you invite to your server. You never connect it to your system. |
| API | The one program that reads and writes your database. Nothing else touches the database. |
| Bridge | A small program that listens to one platform and passes what it hears to the API. |
| Person | One human being. One row in the person table. |
| Identity | One account a person owns on one platform. One person can have four identities. |
| Credits | Earned by watching and taking part. Can be exchanged for real vouchers. Can never be gambled. |
| Coins | Used only in minigames. Cannot buy anything real. Can never become credits. |
| Ledger | A list of every credit and coin change ever made. Rows are added, never edited or deleted. |
| Event | One thing that happened on a platform. For example one minute of watching, or one subscription. |
The rule
You build anything a member experiences. You install anything that keeps the server safe and tidy. The two groups never connect.
You build it if a member experiences it
Identity, credits, levels, rewards, games. These are the thing you are making. They live in your database.
You install it if it is server admin
Moderation, message filtering, logging, raid defence. A member only notices these when something goes wrong. Other people have already built them well.
You were stuck because you were asking which bots your system should connect to. The answer is none of them. They run beside your system, not inside it. No bot reads your database, and your system never calls a bot.
The map
Activity happens on four platforms, bridges collect it, the API stores it, and members see the result in Discord and on the website.
Twitch sends events to a bridge. The bridge sends them to the API. The API writes to the database. The website and Discord ask the API for answers. The bought bots are separate and connect to nothing.
What connects to what
Every arrow in the map, and the exact method each one uses.
| From | To | Method | What it sends |
|---|---|---|---|
| Twitch | Twitch bridge | EventSub webhook | Chat messages, subscriptions, cheers, stream going live |
| YouTube not yet | YouTube bridge | PubSubHubbub push | New uploads, memberships |
| Minecraft not yet | Minecraft bridge | Server plugin sends HTTPS | Session start and stop, milestones |
| Discord | Your Discord bot | Gateway websocket | Slash commands, button clicks |
| Any bridge or bot | The API | POST /events with a shared secret | One event, plus a key that stops duplicates |
| The API | The database | SQL | New ledger rows, lookups |
| Website | The API | REST, Discord login | Balance, history, shop |
| Bought bots | Nothing | No connection exists | Nothing |
A bridge never decides how many credits something is worth. It only passes the event along. All value rules live in the API, so changing a rate is one edit in one place.
The three jobs
Your system only does three things. Everything else is a variation of one of them.
Job 1. Connect a Discord account to a Twitch account
One human has several platform accounts. This job joins them so both count towards the same balance.
- The member types
/link twitchin Discord.Your bot sends their Discord ID to the API. - The API makes a six-character code.It saves the code with their person ID and an expiry time ten minutes ahead.
- The bot sends the code by direct message.The message says to type
!link ABC123in your Twitch chat within ten minutes. - The member types the code in Twitch chat.Your Twitch bridge is already reading chat, so it sees the code and the Twitch account together.
- The bridge sends both to the API.The API checks the code is valid and not expired, then saves a new identity row for Twitch pointing at the same person.
- The bot confirms in Discord.Both accounts now lead to one person. Every future event from either platform lands on the same balance.
These same six steps work for YouTube and Minecraft later with no change to the database. That is the whole reason the identity table is separate.
Job 2. Turn watching into credits
- Twitch sends an event to your bridge.Check the signature first. Reject anything unsigned, because this address is public.
- The bridge passes it to the API.It sends the platform, the account ID, the event type, the size, and a key that stops duplicates.
- The API finds the person.It looks up the identity. If there is no match, the account is not linked yet, so it saves the event and pays nothing for now.
- The API decides what it is worth.One table holds the rates. One watched minute is one credit. One subscription is five hundred.
- The API adds a ledger row.It never edits a balance. The balance is the sum of all ledger rows.
Job 3. Exchange credits for a real voucher
- The member opens
/huband clicks a reward.A button, not a typed command. - The API checks three things together.Enough credits, the reward is in stock, and no identical request is already waiting.
- The API writes two rows together.A ledger row that subtracts credits, and a redemption row marked waiting. If either fails, both are undone.
- You get a message.In a private staff channel: who, which reward, and the redemption ID.
- You send the voucher by hand and mark it done.The status changes to sent.
Writing code to send vouchers automatically, before you know whether anyone wants a voucher, is work that feels useful and produces nothing. Add it when doing it by hand becomes annoying.
The database
Eight tables. The two that matter most are identity and ledger.
-- one row for each human being
person id, display_name, created_at
-- one row for each platform account a person owns
identity id, person_id, platform, platform_user_id, linked_at
platform is one of: discord, twitch, youtube, minecraft
-- short codes used while connecting two accounts
link_code code, person_id, platform, expires_at, used_at
-- every event received, saved before it is valued
event id, idempotency_key, platform, platform_user_id,
type, magnitude, payload_json, received_at, processed_at
-- how an event becomes currency. change rates only here.
rule id, event_type, currency, amount_per_unit, daily_cap, active
-- rows are only ever added. balance is the sum of delta.
ledger id, person_id, currency, delta, reason,
source_event_id, created_at
-- what can be bought
reward id, name, cost_credits, stock, active, fulfilment_type
-- and who bought it
redemption id, person_id, reward_id, status,
ledger_id, created_at, fulfilled_at, note
Three rules for the database
Never point at a Discord ID. When you add Minecraft, this is the difference between one afternoon of work and rebuilding everything.
Add a ledger row instead. When someone says their credits are missing, you will have a dated record. With real vouchers involved you will need one eventually.
Credits are earned, can buy real things, and can never be gambled. Coins are for minigames and can never become credits. This stops one lucky game from emptying your voucher budget. It also keeps you away from the point where a currency won by chance, that has real-world value, starts to count as gambling. That matters if anyone in your audience is under 18. Rules differ by country and I am not a lawyer, so check this properly before you launch minigames.
Two known problems
Both are cheap to prevent now and expensive to fix later.
Problem 1. The same event pays twice
Twitch sends an event again if your server is slow to reply, or replies with an error. Without protection, one subscription pays out twice.
The fix. Every event carries a key, which is the message ID Twitch already provides. That column has a unique constraint. The second attempt to save it fails, nothing is paid, and you still reply with a success code so Twitch stops resending.
Problem 2. Events from people who have not linked yet
Most of your Twitch chat will not have connected Discord. Do not throw those events away.
The fix. Save them with the raw Twitch account ID and leave the processed time empty. When that person links later, go back through their saved events and pay them. Paying someone for everything they did before they linked is the strongest reason to link that you will ever have.
Which bots to install
Seven bots. Six are free. Five dollars per month in total. Only two need real setup.
Each box below is one job. Open a box to see the choice and the alternatives. If you only want the answer, install the seven marked install and skip the rest.
Block bad messages before they post
Built into Discord, so it stops a message before anyone sees it. No bot can do that. Turn on the ready-made lists for profanity, sexual content and slurs, then add your own words. Set this up first, because it changes what you need from everything else.
There is a maximum number of rules. When you reach it, the next job covers the gap.
Moderation, logging, self-assign roles
Adds extra actions on top of Discord AutoMod instead of running a second filter. It is the only bot here that does this. It has case management, more than eighty log types with ignore lists, self-assign roles, and alerts for Twitch, YouTube and TikTok. Used by 1,738,800 servers. Made by one independent developer. Completely free.
Choose this instead if you want TagScript, which lets you write commands with variables and conditions. Sapphire has nothing similar. Carl-bot also has 250 reaction-role pairs. Used by 14,847,972 servers. Two downsides: it runs its own filter alongside Discord AutoMod, and it is owned by a company called Bot Labs, which belongs to BlueStacks.
4.99 dollars per month. Choose it if other people will configure the server and want one on-off switch per feature.
Maki, Discortics, ProBot and MEE6. Their best features are levels, economy and tickets, which you are building yourself.
Stop someone destroying the server
The only thing here that helps when a staff account is stolen and starts deleting channels. It watches for mass deletion, webhook spam and permission changes, removes the roles of whoever is doing it, and can undo the damage. It also backs up your server structure. The free version covers the basics. The five dollar version adds backups, undo, and panic mode.
You already bought this for life. It covers the same six kinds of attack, and can give staff moderation powers without giving them dangerous Discord permissions. Using it here instead of Wick brings your bot cost to zero. Two catches: it is a large multipurpose bot, so you must keep its levels, economy and music switched off, and its invite link asks for full Administrator by default, which you should reduce on the permission screen.
Free and open source, but you run it on your own server and maintain it yourself.
Stop mass raids
Detects large coordinated raids by fake accounts and bans them. It shares information across more than 100,000 servers, so a raid that hit another server first is blocked on yours before it starts. Setup is almost nothing: invite it and give it permission to ban. Its own site says raid protection is free permanently.
It only does this one thing. It will not stop a single troublemaker or a staff member behaving badly. Those are the two jobs above. There is no real competitor.
Check who is joining
Spots second accounts belonging to banned people, and blocks VPNs, proxies, Tor and virtual machines. It gives a score from zero to one hundred rather than a yes or no, and takes about three seconds. This matters more for you than for most servers: once credits become real vouchers, someone making extra accounts is committing fraud, not just being annoying.
If you already pay for Wick, its own verification screen may be enough, and that is one fewer bot. It is weaker at spotting second accounts.
This identifies people by their device and network. Tell your members it is running. Start it in warning-only mode before letting it ban automatically, because shared houses and normal VPN users do get flagged.
Music
Four separate free copies can sit in one server, so four voice channels can play different things. It plays from Spotify, Apple Music, Tidal, Deezer, Bandcamp, Vimeo, Mixcloud, direct files, more than 20,000 radio stations, and Twitch streams. A queue holds up to 10,000 tracks. It includes a guess-the-song game. Playing 24 hours a day needs five server boosts.
This is not a fault. In 2021 Google sent legal notices that shut down Groovy and Rythm completely, and in 2023 forced Hydra to remove music entirely. No large music bot plays YouTube any more. Assume any music bot can disappear, and never make it essential.
Chip or Vexera if Jockie stops working. Save the link rather than installing them now.
Activity numbers
Shows member and channel activity, and can display numbers as channel names, including clocks and countdowns. Install it early, because it cannot fill in the past. The day you want to compare this year to last year, you needed it a year ago.
You will already be saving every event in your database. After step 2 you can show better numbers than any bot, because yours can compare Discord activity against Twitch watch time and credits spent. Statbot fills the gap until then.
Levels
Levels and credits both come from the same thing: taking part. Two separate systems means two sets of numbers that must be kept in step forever. Use one ledger and one progression.
Gives roles based on how active someone has been recently, and removes the role when they stop. It is not a level system, so there is nothing to untangle later. Statbot is already installed for the job above.
Welcome message
Sapphire has no welcome feature, which turns out to help. Your welcome message is where account linking starts, so the link button belongs in the bot that owns identity. One message, one button, straight into job 1.
Built into server settings. Rules agreement and channel choices. Free, no bot needed.
Automatic replies to keywords
Already installed. It sends a set message when it sees a word. Enough for common questions.
Both let you use variables and conditions without hosting anything. YAGPDB goes furthest but takes real effort to learn.
Anything that needs to read a balance has to live in your bot anyway. Do not build a general system for making triggers. Build the three specific triggers you actually want.
Credits, shop and rewards
This is the point of the whole project and the part you have already built. No bot can do it, because no bot knows what a minute of watching your stream is worth, or how to send a real gift card.
It has a real public interface for reading and changing balances, so you could have used it instead of your own database and written only a connector. Not chosen, because you want full control, and its currency cannot properly represent something worth real money. Worth knowing it exists.
Minigames
You asked for custom games, so nothing ready-made fits. These pay out in coins only, never credits. See rule 3 in section 7.
Jockie's guess-the-song game comes with the music bot and costs nothing extra.
Support tickets
Sapphire has no ticket system, so this needs its own bot. Both are free at normal volume. I have not checked either against their own websites, so confirm the details before relying on them.
You have a website with logins. Support requests could be a form there, saving into the same database, with no extra bot.
Scheduled events
Shows every event in each member's own time zone, understands times written normally, and collects who is coming. It overlaps with nothing else here.
Discord Scheduled Events are free and fine if everyone is in one time zone.
Which bots not to install
These are good bots. They are wrong for you because their best features are the ones you are building.
| Bot | Why not for you |
|---|---|
| Maki 7 euro per month | You are replacing its levels, economy and statistics. You would pay seven euro a month for features you built yourself. Cancel this one. |
| Discortics 23 dollars per year | Its two strongest areas are economy and levels, which are yours. Keep it only if you want its application forms. |
| MEE6 | Charges per server, and levels is the feature you least need from a bot. |
| UnbelievaBoat | A second currency competing with yours. Have one currency system, not two. |
| Arcane, Tatsu, Amari | Level bots. Any level system not connected to your credits is a second set of numbers you will regret. |
| Dank Memer, OwO, Mudae | They bring their own currency and produce very large numbers of messages. If you ever add one, lock it to a single channel and never connect it to your system. |
| Carl-bot and Sapphire together | They share 51 features. Two moderation bots means two sets of logs, and you will stop trusting both. Choose one. |
What it costs
Five dollars per month, or zero if you use bleed instead of Wick.
| Item | Cost | Note |
|---|---|---|
| Discord AutoMod | Free | Built into Discord |
| Sapphire | Free | No paid version exists |
| Beemo | Free | Raid protection free permanently |
| Double Counter | Free | Paid tier optional |
| Jockie Music | Free | Four copies included |
| Statbot | Free | Paid version keeps history longer |
| Wick | 5.00 dollars | Or zero, if bleed does this job |
| Total for bots | 5.00 dollars | Was 14.52. Your hosting is separate. |
Cancelling Maki and letting Discortics expire saves more than Wick costs.
The order to build in
Step 0 takes two hours. Step 1 is the only thing that matters after that. Everything else waits.
These boxes remember what you tick, on this device.
Step 0. Install the bots
About two hours, once, then never again.
Step 1. One complete loop
Finished means: someone watches your stream and ends up holding a real voucher.
Steps 2 to 5
Step 2. Make it real
- The website shows history and the shop using the same API
- More rewards, stock counts, refunds
- Automatic voucher sending, only if doing it by hand annoys you
- Pay people for events from before they linked
Step 3. Second platform
- A YouTube bridge for uploads and memberships
- Reuse job 1 with no changes. This is the reward for building the identity table properly
Step 4. The fun parts
- Coins, kept completely separate from credits
- Custom minigames paying out in coins
- Your own levels, replacing Statroles
Step 5. Minecraft
- A server plugin sending sessions and milestones to the same events address
- By this point it is a small job, because the hard parts were solved in step 1
Ideas for later
Real ideas, wrong time. Written here so you can stop holding them in your head.
Building a tool that builds bots is a separate product. It stays interesting forever and finishes nothing. You need one bot, your own, and it is already half written.
Where this came from
Some facts here were checked directly. Some were not. This section says which is which.
Checked on the maker's own website in August 2026
Sapphire, Carl-bot, Jockie Music, Statbot, Wick, Beemo, Double Counter, Maki, Discortics, bleed, ProBot, Dyno, VoiceMaster, Sesh, UnbelievaBoat.
Not checked, so treat with doubt
Ticket Tool, Tickets, Arcane, GiveawayBot, Craig, Zeppelin, Chip, Vexera. These come from memory, which is the method that produced an earlier mistake about Sapphire. Check them before depending on any detail.
A correction
An earlier version of this plan said Sapphire had levels, tickets, economy, music and voice features. It has none of those. It is a moderation bot. Any comparison table built on that earlier description is wrong.