Discourse Daily Challenges

:information_source: Summary Run time-limited daily check-in challenges with leaderboards, automated posts, and badge awards.
:hammer_and_wrench: Repository Link GitHub - R23DPrinting/discourse-daily-challenge · GitHub
:open_book: Install Guide How to install plugins in Discourse

The Story

I run a health and wellness community that recently made the move from Discord to Discourse. On Discord, I had built a custom bot to run monthly fitness challenges — members would post their daily workouts, the bot tracked check-ins, posted weekly leaderboards, and announced winners at the end of each month. It was one of our most popular features.

After the move to Discourse, members started asking for the challenges back. I looked for an existing plugin and came up empty. So I built one.

What started as a quick solution turned into a full-featured challenge system that honestly works better than the original Discord bot. Since it might be useful to other communities, I’m sharing it here.

Features

  • Hashtag or photo check-ins — members check in by posting the challenge hashtag (e.g. #AprilFitness) or uploading an image to the challenge topic. Both trigger a valid check-in.
  • One check-in per day — enforced at the application and database level. Each user’s daily window is based on their profile timezone.
  • Per-challenge timezone — set the challenge timezone independently from your server timezone so no member gets cut off at midnight UTC.
  • Real-time admin dashboard — shows all active challenges simultaneously with participant count, average check-ins, streak tracking, completion percentage, and a ranked leaderboard.
  • Multiple simultaneous challenges — run several challenges at once, each with its own topic, hashtag, schedule, and badge.
  • Archived challenges — completed challenges preserved in a collapsible archive showing final stats, winners, and completion rates.
  • Automated weekly leaderboard posts — posted to the challenge topic on a configurable day and hour in the challenge’s own timezone.
  • Final results post — automatically posted the day after the challenge ends, listing everyone who met the check-in goal.
  • Custom badge awards — automatically creates a Discourse badge for each challenge and awards it to eligible participants when the challenge ends.
  • Admin check-in management — add or remove check-ins for any user directly from the admin panel.
  • Manual leaderboard trigger — post the leaderboard at any time from the challenge detail page.
  • Inclusive end date — if you set the end date to March 31, check-ins on March 31 count.

Configuration

Creating a Challenge

Go to Admin → Plugins → Daily Challenge → Challenges → New Challenge

Enter a Topic ID to link the challenge to an existing topic. The plugin will display the topic title as confirmation. Fill in the hashtag trigger, start and end dates, and the number of check-ins needed to complete the challenge.

Set the Challenge timezone to your community’s primary timezone to ensure date boundaries are evaluated correctly for your members.

If you want automated weekly leaderboard posts, enable the toggle and set the day and hour. If you want a completion badge, enable the toggle and enter a badge name (e.g. “April Fitness Champion”).

Click Save challenge — if badge awarding is enabled, the badge is created automatically.

Running a Challenge

Once created, the challenge is immediately active. Members post in the linked topic with the hashtag or an image to check in. The admin dashboard (Admin → Plugins → Daily Challenge → Dashboard) shows real-time stats for all active challenges.

Tips

  • Ask members to set their timezone in Profile → Preferences → Interface → Timezone for accurate daily check-in windows.
  • Use the Post Leaderboard Now button on the challenge detail page to trigger a leaderboard post at any time.
  • Use the Check-ins section on the challenge detail page to manually add or remove check-ins for any user.

Settings

Name Description
daily_challenge_enabled Master on/off switch for the plugin
Topic ID The topic where participants post check-ins
Hashtag trigger The hashtag to watch for, without the #
Start date First day check-ins are accepted
End date Last day check-ins are accepted (inclusive)
Check-ins needed Number of check-ins required to complete the challenge and qualify for the badge
Description Optional internal note about the challenge (not shown to participants)
Challenge timezone Timezone used for date boundaries and weekly post schedule
Enable weekly leaderboard post Toggle automated weekly posts on/off
Post day of week Day the weekly post is published
Post hour (0-23) Hour the weekly post is published in the challenge timezone
Award completion badge Toggle automatic badge creation and awarding
Badge name Name of the badge created for this challenge

What’s Next

Planning for v2:

  • DM confirmation after each check-in with current stats
  • Daily reminder DMs for participants who haven’t checked in yet
  • @mention commands for checking personal stats

Support & Feature Requests

If you run into any issues or have ideas for new features, please open an issue on GitHub or reply to this topic.

14 likes

This is great, thank you for sharing. As far as features, I could see it being useful for us if it was possible to specify the challenge interval as something other than daily, ie, choose a weekly challenge check-in rather than daily across the span of the challenge. It would also be great if mods/category mods could create challenges so it’s not just on admin to set things up.

1 like

Let me make sure I understand the requests:

So, you’d want to set the challenge up for say 1 month (April 1-30), but specify that it only counts 1 entry per week instead of 1 entry per day? Would you want it to be a Sun-Sat week or every 7 days?

This is a good idea. I honestly don’t have any Mods in my community, so I don’t know how the admin panel looks for them. Let me create a Mod account in my dev environment and play around with it.

1 like

Yes, exactly. Our community has a 52 in 52 challenge where there’s a weekly challenge for a year, so non-daily checkins would give more flexibility for different kinds of challenges.

Discourse Calendar (and Event) allows admin to set the week starting on Saturday, Sunday, or Monday, so if you want to plan for compatibility with that plugin down the road (like generating calendar events for checkins or start/end date?) I might follow how Calendar sets the week? For my community specifically I don’t think it matters.

Category mods in addition to regular mods would be really great – we have little interest groups that have their own sub categories, and it would be nice to allow those category mods to run separate challenges without making them full mods.

1 like

These are excellent ideas. Thanks for sharing! I’ll see what I can do to implement them.

1 like

Does this plugin require the gamification plugin to be enabled, or did you select the tag because your plugin is for gamification in general?

2 likes

It does not require the plugin. I just selected the tag. Sorry about that.

2 likes

v1.2.0 is now available!

New in this release:

  • Configurable check-in interval — run daily or weekly challenges
  • Week start setting — for weekly challenges, choose whether weeks start on Sunday, Monday, or Saturday
  • Interval-aware streaks — streak labels and calculations now reflect the challenge interval (“week streak” vs “day streak”)
  • Moderator access — full site moderators can now create, edit, and manage challenges via a dedicated sidebar section. This can be enabled or disabled in Admin → Settings → Plugins (daily_challenge_mod_access_enabled), so communities that prefer to keep challenge management admin-only can do so.
  • Renamed to “Discourse Challenges” in the admin UI
Screenshots

Challenge Form — Check-in Interval

Dashboard — Week Starts On

Moderator Sidebar Access

Note: This release requires ./launcher rebuild app to apply database migrations — the in-panel Update button won’t work for this release.


Regarding category mod access — this is something I’m actively working on. The challenge is that Discourse doesn’t grant category moderators staff status, which means they can’t reach /admin routes at all regardless of what the plugin does. I’m exploring a separate non-admin route specifically for category mods that would give them scoped access to challenges in their categories. Expect this in v1.3.0.