Plugins

Scheduled Messages

Premium
Post a message once, on an interval or on a cron schedule — to up to 25 channels at a time, with a start and end window.

A scheduled message is text, an embed, or both, posted on a rhythm you define — a weekly event reminder, a daily bump nag, a one-off announcement at midnight on New Year's Eve.

LicensePremium
Configureddashboard only — there are no slash commands
Schedules per serverup to 25
Channels per scheduleup to 25
Resolutionone minute

Content

Each schedule has a name (up to 100 characters, shown only in the dashboard) and carries a text message (up to 2000 characters), an embed, or both together. The embed is built with the same embed builder used everywhere else in Cloudy. An embed you leave without a title stays without one — the name only steps in as the title of an embed that would otherwise be completely empty, which Discord would refuse.

Server placeholders such as {server} and {server.memberCount} work in both. There is no member to refer to, so user placeholders stay as written.

Channels

A schedule posts to one or many channels — pick up to 25. The same message goes to every one of them in the same minute.

If Cloudy gets a hard "this channel no longer exists" from Discord, it removes that channel from the schedule by itself — and the same for a channel that belongs to a different server, since a schedule only ever posts into its own. A channel it merely cannot post in — missing permissions — is never removed, because that is something you fix with a permission tick rather than something that is gone. When the last channel disappears, the schedule switches itself off.

Recurrence

Three modes. Picking one blanks the settings of the other two, so switching back and forth cannot resurrect an old rhythm.

Once

Fires a single time at the date and time you set, then switches itself off. The time has to be in the future when you create the schedule.

Interval

Fires every n minutes — at least 15, at most 60 days — counted from the previous run. The first run is one interval after the schedule was created (or after its start date, if set). Simple and drift-free, but it does not line up with the clock — an interval of 1440 minutes started at 09:13 keeps firing at 09:13.

Cron

A five-field cron expression, evaluated in the timezone you pick from the list (IANA names such as Europe/Berlin). This is the mode to use for anything that should sit at a real time of day.

0 20 * * 5      Fridays at 20:00
30 9 * * 1-5    Weekdays at 09:30
0 0 1 * *       First day of every month, midnight
*/15 * * * *    Every fifteen minutes
Pick your own timezone, not UTC. Cloudy handles daylight saving for you — a cron set to 20:00 in Europe/Berlin stays at 20:00 in both summer and winter, which an equivalent UTC expression would not.

The dashboard shows the next run for every schedule. A paused schedule shows "paused"; right after an edit it reads "calculating" until the bot has picked the change up, which takes at most a minute.

Window

Three optional limits on top of the recurrence:

SettingEffect
Starts atNothing fires before this moment
Ends atNothing fires after it; the schedule then switches itself off. Must lie after the start
Max runsStop after this many sends, 1–1000

A schedule that can never fire again is disabled automatically rather than being checked forever.

Options

Allow @everyone

Off by default. When off, the message can still ping roles and users — only @everyone and @here are stripped.

The asymmetry is deliberate. A human who mass-pings by accident does it once; a schedule does it on every single run until somebody notices. Turn this on only for a schedule you have watched fire at least once.

Delete previous

When on, Cloudy posts the new copy and then deletes the previous one in that channel. Ideal for a recurring reminder that should exist exactly once in a channel — rules, bump nags, "read the pins".

It is best-effort: a copy Cloudy can no longer see or delete is left in place rather than blocking the new message. Deleting the schedule itself does not remove the last posted copy.

Missed occurrences

If Cloudy is restarted or briefly offline, a missed occurrence is caught up for up to one hour. Anything older is recorded as handled but not sent, so the schedule rejoins its rhythm instead of suddenly firing yesterday's announcement.

This is why a late delivery does not shift the schedule: Cloudy remembers which occurrence it handled, not the moment it happened to send.

When no channel accepts the message

If Discord refuses the message in every channel — missing permissions, for example — the run does not count. Cloudy tries again after 1, 2, 4, 8 … minutes, never less often than once an hour, and like any missed occurrence gives it up once it is an hour old. A one-off schedule is therefore only marked as done after a copy has actually been posted, or that hour has passed.

If Discord itself has trouble and gives no answer at all, Cloudy cannot know whether the message arrived. It tries once more on the next minute — Discord recognises the repeat and never shows the message twice. If that attempt gets no answer either, the occurrence is given up rather than risking a duplicate.

As soon as one channel has received the message, the occurrence counts as delivered: channels that failed this time do not get a late copy, they simply receive the next one.

Permissions

In every target channel Cloudy needs View Channel, Send Messages and — for embeds — Embed Links. Mention Everyone is only needed if you enabled the @everyone option, and Manage Messages only for Delete previous.