---
title: 'How to Make a Discord Reminder Bot with List and Cancel'
published date: '2026-10-25'
author: 'Illiana Reed'
title-image: 'https://camelai.com/blog/assets/images/covers/discord-reminder-bot.png'
---

A Discord reminder bot lets members say "remind me in 2 hours" or "remind me on December 1 at 9:00", then posts the reminder in the channel when it's due. In this tutorial, I'll walk you through how to make one with camelBot, without writing any code.

Members set reminders with `/remind`, check them with `/reminders`, and stop one with `/cancel`, all in private replies. When a reminder is due, the bot posts it in the channel and mentions the member who set it. We made this exact bot, called nudge, and tested it privately and in our own server. The replies, screenshots, and one bug below come from that build.

## What a good Discord reminder bot does

A reminder bot earns trust by posting what it promised, once, at the time the member meant.

- **Plain time input.** "in 10m", "in 2h", "in 3d", or a date and time like "2026-12-01 09:00".
- **Times everyone can read.** Discord timestamps show in each reader's own time zone.
- **Posts where it was set.** The reminder appears in the same channel, mentioning whoever set it.
- **A private list and cancel.** Each member sees and cancels only their own reminders.
- **Text that can't ping anyone.** A mention typed into a reminder stays plain text.
- **Clear refusals.** Bad times, overlong text, and an 11th waiting reminder save nothing.

### How the bot handles time zones

"In 2h" needs no time zone, but a date and time does. Each member saves an IANA name, such as America/Chicago or Europe/London, and the bot reads their dates in that zone, daylight saving included: 09:00 in New York is 14:00 UTC in December and 13:00 UTC in June. A member with no saved zone is asked to set one.

Replies show times as Discord timestamps, codes like `<t:1796133600:f>`. [Discord's message formatting reference](https://docs.discord.com/developers/reference#message-formatting-timestamp-styles) says Discord displays them in each reader's own time zone and locale.

## Make a reminder bot: the steps at a glance

1. **Describe your bot.** Sign in at [bots.camelai.com](https://bots.camelai.com/) with Discord and paste the prompt from Step 1.
2. **Choose Camel's app and a name.** Ours is nudge.
3. **Try it in the test channel.** Set, list, and cancel reminders as three people.
4. **Check the tricky cases.** Time zones, bad dates, long text, and a full list.
5. **Decide where reminders can be set.** We limited ours to one channel.
6. **Publish and add it to Discord.** Then set a real reminder.
7. **Change it while a reminder waits.** Updates should keep waiting reminders.

## What you need

- A Discord account, to sign in at bots.camelai.com.
- The **Manage Server** permission in the server where the bot will live.
- A channel for reminders, such as `#reminders`.
- No code and no credit card. camelBot is free while in beta, and this bot uses no AI.

## Step 1: Describe your reminder bot

Once you're signed in, camelBot asks **What should your bot do?** Copy the prompt below, paste it into the box, and select **Continue**. It's the prompt we used, word for word.

```text
Build a reminder bot. Every command reply is private.

/timezone zone saves a member's IANA time zone, like America/Chicago.

/remind takes when and text. when is relative ("in 10m", "in 2h", "in 3d") or a date and time ("2026-12-01 09:00") in their saved zone. Refuse unknown zones, a date and time with no zone saved, times that can't be read or don't exist, and times under a minute or over 365 days ahead. Text: 300 characters; 10 waiting per member.

Number each reminder. When one is due, post it in the channel where it was set: a plain message mentioning the member, then the text.

/reminders lists your waiting reminders and numbers, soonest first, marking any past due as overdue.

/cancel number deletes one of yours so it never posts; refuse others' numbers without saying whose.

Show every time as a Discord timestamp, date and relative, so each reader sees their own time zone.
```

Time handling is where reminder bots go wrong, so the prompt spells out every refusal; camel-builder fills any gap with its own guess. The per-member caps keep one person from filling the bot, and 365 days matches camelBot's limit for one-time alarms.

camel-builder built the bot without asking us any questions. Its summary said what it hadn't tried: the limit of 10 waiting reminders, which is where Step 4 found a bug. It also noted that each member's numbers count up on their own, so your #1 and Alex's #1 are different reminders.

## Step 2: Choose Camel's app and name your bot

Next, choose how your bot shows up in Discord. For a first bot, I'd go with **Camel's app**, marked **Recommended**: there's nothing to set up on Discord's developer site.

On Camel's app, the bot's name comes first in every command. We named ours **nudge**, so members type `/nudge remind`, `/nudge reminders`, `/nudge cancel`, and `/nudge timezone`. Select **Create nudge**.

Want top-level commands like `/remind`, or a separate name and picture? Choose **Your own app** and follow our [own app guide](https://camelai.com/docs/camelbot/own-app). Paste its bot token only into camelBot's token field, never into the chat.

## Step 3: Try it in the test channel

You'll land in a chat with camel-builder, with the bot's private [test channel](https://camelai.com/docs/camelbot/test-channel), `#try-nudge`, beside it. Nothing there reaches Discord, and your commands run the code camel-builder saved. Under **Talk as**, you can switch between yourself and two pretend members, **Alex** and **Sam**.

Quote values with spaces, like `when:"in 1m"`; Discord gives each option its own box instead. Times show in your own zone, as in Discord. Alarms due within 15 minutes go off by themselves. Later ones wait in the alarm clock at the top, where **Run now** posts one right away, ahead of its time.

Now let's set some reminders:

1. **Set one.** As yourself, run `/nudge remind when:"in 1m" text:"Stretch test one"`. Ours replied "Reminder #3 set for October 20, 2026 at 3:50 PM (in 58 seconds)." and "It will post in #try." (camel-builder's own tries had used #1 and #2.)
2. **List it.** Run `/nudge reminders`. You should see "Your waiting reminders (1)" with the number, date, relative time, and channel.
3. **Let it go off.** About a minute later, the test channel notes that the alarm went off, and the bot posts a mention of you, then "Stretch test one". Ours posted once and left our list.
4. **Cancel one as Alex.** Switch to **Alex**, set a reminder for `in 5m`, then run `/nudge cancel` with its number. Ours replied "Cancelled reminder #2 (October 20, 2026 at 3:56 PM (in 5 minutes)). It won't post." A second cancel got "You have no reminder #2. Nothing was changed." More than six minutes later, nothing had posted.
5. **Try someone else's number.** As yourself, set one for `in 3h`. Ours was #4, a number Alex didn't have. As Alex, `/nudge reminders` shows only Alex's own, and `/nudge cancel number:4` gets "You have no reminder #4. Nothing was changed.", the same reply as for 9999. Your #4 stays listed.
6. **Set one in another channel.** As **Sam** in **#general**, set one for `in 2m`. Ours posted in #general, mentioning Sam. (We tried this before the channel rule in Step 5.)

**Look at test data** in the **⋯** menu shows each waiting reminder's member, channel, text, and due time in UTC. It's working when a short reminder posts once where it was set, a cancelled one never posts, and nobody can see or cancel anyone else's reminders.

## Step 4: Check time zones, bad input, and a full list

Now try the cases most likely to go wrong. We ran each of these in the test channel. Every refusal came back privately, saying nothing was set or saved.

| What we tried | What happened |
| --- | --- |
| Alex saves the zone `Mars/Olympus` | Refused: "Use an IANA name like America/Chicago or Europe/London." |
| Sam sets `2026-12-01 09:00` with no zone saved | Refused: "Run /timezone first." |
| Alex, Europe/London, `2026-12-01 09:00` | Saved for 09:00 UTC |
| Sam, America/New_York, `2026-12-01 09:00` | Saved for 14:00 UTC |
| Sam, America/New_York, `2027-06-01 09:00` | Saved for 13:00 UTC, in daylight saving time |
| Sam, `2027-03-14 02:30` | Refused: New York's clocks skip that time |
| Sam, `2026-11-01 01:30`, an hour New York repeats | Accepted as the first 01:30 (05:30 UTC) |
| `2027-02-30 09:00` | Refused: "isn't a real date and time" |
| `tomorrowish` | Refused, with examples that work |
| `in 0m`, a past date, or `in 400d` | Refused: under a minute or over 365 days ahead |
| 301 characters of text | Refused: "the text can be 300 at most" (300 was accepted) |
| An 11th waiting reminder | Refused: "You already have 10 waiting reminders." |

Confirmations show the time in your own zone, which makes conversions easy to check. Ours showed Chicago time, so Sam's 9:00 New York reminder read 8:00 AM.

### A lesson from making this bot: test a full list

Here's a bug we found in the generated reminder code. We filled our list to the limit: one short reminder plus nine of 300 characters. `/nudge reminders` said "Your waiting reminders (10)", then stopped partway through #9. Reminders #10 to #13 were still saved, but the list hid them and their numbers.

camel-builder's report explained why: its code cut the whole list off at about 1,900 characters, under Discord's 2,000-character message limit. We sent a fix, trimmed here:

```text
/reminders says 10 but cuts off partway through #9, hiding #10 to #13. Fix only the list formatting so every waiting reminder's number, date and relative time, overdue marker, and channel stay visible. Shorten each reminder's text preview, never the whole list, or split the list into pages. Keep every message under Discord's limits, even after mentions are neutralized. Change nothing else.
```

Now each reminder shows a short text preview, and a long list continues in a second private message, "Your waiting reminders (continued)". We retested with 10 reminders of 300 characters, mostly `@` signs, which take extra room once the bot breaks them up. All 10 numbers came back across two private messages.

The lesson: test the biggest case your rules allow, especially one camel-builder says it hasn't tried.

## Step 5: Decide where reminders can be set

A camelBot bot posts only in channels you add it to, and their threads, but slash commands work in any channel. So a member could set a reminder somewhere the bot can't post it.

Our bot lives in one shared channel of our community server, so we made two choices for it in one follow-up. You might not need either: if the bot is in every channel where members set reminders, the original prompt works. Here's the core of what we sent, with our channel's name swapped for `#reminders`:

```text
Keep all reminder commands open to members. Accept new reminders only in #reminders, and refuse other channels privately before saving or scheduling anything. Keep /reminders, /cancel and /timezone limited to each member's own data. Treat reminder text as plain text that pings no one wherever it's shown, and add only the creator's own mention to the due reminder. The private confirmation should say the reminder will post publicly in #reminders.
```

Ours named the exact channel, plus the test channel so we could keep testing privately.

Why the text rule? camelBot lets a bot's messages mention members, so someone's mention typed into a reminder could ping them. Now the bot breaks up mention codes in the text and adds the creator's mention itself, our choice for a channel anyone can use. We checked both in the test channel:

- **Another channel.** In **#general**, `/nudge remind` got "I can only set reminders in #try for this demo. Nothing was set.", and our list stayed empty.
- **Mentions in the text.** We set a reminder whose text held a member mention, a role, a channel, `@everyone`, and `@here`. The confirmation showed them as plain text and said "When it is due it will post publicly in #try, where everyone there can see it." When it went off, the only mention was ours.

The test channel can't show who gets notified, but it shows that only one real mention is left.

## Step 6: Publish it and add it to your server

When your tests pass, select **Publish v1** on the builder's **Publish @nudge as version 1?** card. To attach it where Camel's app is already installed, open the bot page's **Channels** tab, select **Add to a channel**, then choose your server and channel. For a new installation, **Add to Discord** opens Discord's permission screen; review what it asks for before approving.

In our run, **Add to Discord** opened a broader permission screen even though Camel's app was already installed. We backed out without authorizing it, then used **Channels**, **Add to a channel** to attach nudge to our existing channel. The bot page showed **Live in #camel-bots**.

Now try it for real. We saved our zone with `/nudge timezone`, then set a reminder for `in 2m`:

[![Discord: nudge's private confirmation for reminder #1 at 3:58 PM, saying it will post publicly in #camel-bots](/blog/assets/images/inline/discord-reminder-bot/discord-private-reminder-confirmation.jpg)](/blog/assets/images/inline/discord-reminder-bot/discord-private-reminder-confirmation.jpg "Open full-size screenshot")

The confirmation is private and says plainly that the reminder will be public. Two minutes later, the reminder posted once in the channel, mentioning us.

Then we set one for `in 5m` and cancelled it right away. More than six minutes after we set it, nothing had posted.

[![Discord: nudge's private reply cancelling reminder #3, due at 4:01 PM, saying it won't post](/blog/assets/images/inline/discord-reminder-bot/discord-cancel-confirmation.jpg)](/blog/assets/images/inline/discord-reminder-bot/discord-cancel-confirmation.jpg "Open full-size screenshot")

Our Discord replies showed **cases**, the shared app identity used by our [moderation tutorial](https://camelai.com/blog/discord-moderation-bot). Your app or server can show a different name.

We tested in Discord with one account, so ask a friend to check the rest: their list shouldn't show yours, their `/nudge cancel` with a number only you have should be refused, and you shouldn't see their private replies.

## Step 7: Change the bot while a reminder is waiting

Reminders can wait for days, so an update shouldn't lose them. We checked this in both places.

**In the test channel.** As Alex, we set a reminder for `in 10m` with the text "Across code change". While it waited, we saved three changes: the channel rule from Step 5, a "Reminder:" label with an alarm clock, and "It's time:" before the text. When the 10 minutes were up, it went off by itself in the new wording. This is the test channel and pretend member Alex, not a real Discord message:

[![Test channel: the alarm went off and nudge posted Reminder: @Alex, then It's time: Across code change, from saved code](/blog/assets/images/inline/discord-reminder-bot/test-channel-reminder-after-save.jpg)](/blog/assets/images/inline/discord-reminder-bot/test-channel-reminder-after-save.jpg "Open full-size screenshot")

**In Discord.** We set a real reminder for `in 10m`, "Across versions". While it waited, we asked camel-builder to start the second line of each due reminder with "It's time:", change nothing else, and keep every waiting reminder. It saved the change and noted that version 2 was still live. The card asked **Publish @nudge as version 3?** and said "Version 2 is live right now. Version 3 updates its code." We selected **Publish v3**. The reminder stayed in our list, and at 4:06 PM, its due time, it posted with "It's time: Across versions".

[![nudge's Versions tab: version 3 live in #camel-bots, above versions 2 and 1 with Roll back buttons](/blog/assets/images/inline/discord-reminder-bot/versions-tab-version-3-live.jpg)](/blog/assets/images/inline/discord-reminder-bot/versions-tab-version-3-live.jpg "Open full-size screenshot")

Why version 3? Adding the bot to Discord from a dialog we'd opened before publishing version 1 produced version 2, so don't worry if your numbers jump too. If an update goes wrong, **Roll back** to an earlier version. A rollback changes the bot's code, not the reminders it has saved.

## Permissions a reminder bot needs

This tutorial bot answers commands and posts reminders; it doesn't moderate, give roles, or make channels. Its published version requested no extra capabilities. Discord's screen for Camel's app can also include permissions needed by other bots using that app, so it needn't match this bot alone. We used the app's existing permissions and didn't test a fresh install with only the basic permissions. camelBot doesn't ask for Administrator; don't add it.

## Troubleshooting

| Symptom | Why | Fix |
| --- | --- | --- |
| `/remind` isn't in the menu | On Camel's app, commands start with the bot's name | Type `/nudge`, then pick `remind` |
| A time is an hour or more off | The member saved the wrong zone | Run `/nudge timezone` with a Region/City name, like America/New_York |
| A reminder set elsewhere never posted | The bot isn't in that channel | Add it there, or limit new reminders to its channel (Step 5) |
| It works in `#try-nudge`, not in Discord | The change isn't published | Publish it |

The bot's own replies say `/remind` and `/cancel` without the name, so tell members to type `/nudge` first. camel-builder reported that a reminder that can't be posted stays in `/nudge reminders`, marked overdue, without a retry; cancel it and set it again in the right channel.

## Limits to know

| Limit | Value |
| --- | --- |
| Waiting alarms | 200 per bot, from 1 second to a year ahead |
| This bot's own rules | 1 minute to 365 days ahead, 10 waiting per member, 300 characters |
| Schedule times inside camelBot | UTC, so the bot converts each member's zone |
| Slash commands | 25 per bot |

Treat a reminder's time as when it comes due, not a promised delivery second. The full list is in [Permissions and limits](https://camelai.com/docs/camelbot/limits).

## FAQ

**Can a Discord reminder bot send reminders by DM?**
Not this one. It posts in the channel and mentions the member, so nobody needs DMs open. A camelBot bot can DM members only with its messages capability, which asks your server for Manage Messages, and Discord refuses DMs to members who turned them off.

**Can other members see or cancel my reminders?**
No. `/nudge reminders` and `/nudge cancel` only look at your own, and the replies are private. In the test channel, Alex couldn't see or cancel ours. We didn't test this with a second real account, so try it with a friend.

**Is making a Discord reminder bot free?**
camelBot is free while in beta, with no credit card required. Making and testing use your camel-builder allowance. This bot doesn't use AI, so reminders don't draw on a bot's daily AI allowance.

## Next steps

Ready to make your own reminder bot? Start from this example, then describe what you'd like to change.

[Build this bot](https://bots.camelai.com/new?prompt=Build%20a%20reminder%20bot.%20Every%20command%20reply%20is%20private.%0A%0A%2Ftimezone%20zone%20saves%20a%20member's%20IANA%20time%20zone%2C%20like%20America%2FChicago.%0A%0A%2Fremind%20takes%20when%20and%20text.%20when%20is%20relative%20(%22in%2010m%22%2C%20%22in%202h%22%2C%20%22in%203d%22)%20or%20a%20date%20and%20time%20(%222026-12-01%2009%3A00%22)%20in%20their%20saved%20zone.%20Refuse%20unknown%20zones%2C%20a%20date%20and%20time%20with%20no%20zone%20saved%2C%20times%20that%20can't%20be%20read%20or%20don't%20exist%2C%20and%20times%20under%20a%20minute%20or%20over%20365%20days%20ahead.%20Text%3A%20300%20characters%3B%2010%20waiting%20per%20member.%0A%0ANumber%20each%20reminder.%20When%20one%20is%20due%2C%20post%20it%20in%20the%20channel%20where%20it%20was%20set%3A%20a%20plain%20message%20mentioning%20the%20member%2C%20then%20the%20text.%0A%0A%2Freminders%20lists%20your%20waiting%20reminders%20and%20numbers%2C%20soonest%20first%2C%20marking%20any%20past%20due%20as%20overdue.%0A%0A%2Fcancel%20number%20deletes%20one%20of%20yours%20so%20it%20never%20posts%3B%20refuse%20others'%20numbers%20without%20saying%20whose.%0A%0AShow%20every%20time%20as%20a%20Discord%20timestamp%2C%20date%20and%20relative%2C%20so%20each%20reader%20sees%20their%20own%20time%20zone.&ref=blog "cta:build-example-end")

Want to start with a different idea?

[Build your own bot](https://bots.camelai.com/new?ref=blog "cta:build-own-bot")

For posts on a fixed day, see the [birthday bot tutorial](https://camelai.com/blog/discord-birthday-bot). For sign-ups with a reminder before the start, try the event RSVP bot guide. For more ideas, visit our [Discord bot maker](https://camelai.com/discord) page.
