Release notes / WB Gamification
BuddyPress Add-on Plugin

WB Gamification

Universal gamification engine for WordPress and BuddyPress. Points, badges, levels, leaderboards, challenges, streaks, kudos. Pick a starter template, members start earning in 60 seconds. Works with BuddyPress, WooCommerce, LearnDash, bbPress.

15 releases
v1.6.4 latest
July 28, 2026 shipped

v1.6.4 Latest

July 28, 2026
New 9 Improve 9 Fix 41 Security 6 Dev 7

New

  • Weekly cap is now settable per action in Settings > Points. The limit was already enforced, but there was no field to set it.
  • A badge can now require more than one condition. Build a rule from any of eight condition types (points, points in a period, action count, level reached, badge earned, streak, tenure, admin awarded) and require all of them or any of them.
  • The four tenure badges and the three site-first badges are now ordinary editable rules. They were awarded by hardcoded engines and the library told you they were manual, so the only way to change what "2-Year Member" meant was to edit PHP.
  • When you save a badge rule you can choose to award it to members who already qualify. It is off by default: leave it off and the badge is earned from now on.
  • Kudos Moderation can be filtered by giver, by receiver, and by date range, and kudo-trading pairs are now detected across the whole table rather than only the page you are looking at.
  • Members decide which of their badges are public. Every earned badge on your own badge board has a Share button, and a badge you have not shared is not visible to anyone else.
  • Settings > Modules has a Background features section: the weekly recap email, leaderboard nudges, status retention, community challenges, tenure badges, site-first badges, badge sharing and cohort leagues can each be switched off. Seven of the eight were already enforced in code and had no screen to set them.
  • Webhooks can subscribe to the redemption event. The engine fired it and the API accepted it, but the page never rendered a checkbox for it.
  • `wp wb-gamification share grandfather` publishes every existing badge in one pass, for owners who deliberately ran an open community, and `wp wb-gamification share reset` makes them private again.

Improve

  • Points, badges, levels, and the Hub follow the active theme's colours in both light and dark mode on BuddyX, BuddyX Pro, and Reign.
  • Awarding points costs fewer database queries. A badge is only evaluated when something that could actually change its answer has happened, so a "publish 10 posts" badge no longer runs a count every time a member reacts to a comment.
  • The Daily Points Trend chart on Analytics has an axis, labels and a baseline, and a quiet day is now visible instead of rounding away to nothing.
  • Empty blocks tell a logged-out visitor how to log in instead of only telling them to.
  • A member who leaves a page open overnight can still give kudos, redeem a reward or submit an achievement. The security token in the page expires after about a day; it is now refreshed and the action retried once, instead of failing with an error that retrying could not fix.
  • Awarding points costs fewer queries on sites with tiered badges. Bronze at 5 comments, Silver at 25 and Gold at 100 each asked the database the same question about the same member on every award; they now ask once.
  • Point decay no longer aggregates every member on the site in order to decay a few hundred of them.
  • Kudos Moderation's abuse detection is indexed. It scanned every kudos ever given on the site each time a moderator opened the page.
  • Community challenges and webhook subscriptions are no longer re-read from the database on every single points award.

Fix

  • Deleting a member left all of their gamification data behind for ever: their points, streaks, badges, cohort rows and queued notifications stayed in the database. Those rows also broke the Analytics dashboard, which could report figures such as "6822% streak health" because it counted rows belonging to members who no longer existed. Deleting a member now removes their data, the dashboard is correct on sites that already have orphaned rows, and `wp wb-gamification member purge-orphans` cleans up the rows an earlier version left behind.
  • Failed webhook deliveries were never retried. The retry looked up a column that does not exist, the database refused the query, and the job quietly did nothing. Retries now fire, and a subscription you have switched off is still respected.
  • The leaderboard could show two different point totals for the same member on the same page: the board row and the "your standing" strip below it read from different places. They now agree.
  • Challenges opened and closed on the site's clock on the page but on the database's clock in the engine that awards progress. On a site ahead of UTC a challenge could appear open and award nothing for hours; on a site behind UTC it kept awarding after it had visibly closed.
  • The Daily Points Trend chart drew an empty column for days that had points on any site not set to UTC.
  • The user status bar rendered on top of the theme's header. It now measures whatever is actually at the top of the page, at any screen size.
  • Revoking kudos took back the points but still congratulated the receiver with a "you got kudos" notification for a kudos that no longer existed.
  • The welcome notice could not be dismissed. Clicking its X hid it for one page view and it returned on the next, on every plugin page, until you ran the setup wizard. There is now a "No thanks" that means it.
  • The redemption confirmation was announced to screen readers as a modal while trapping nothing, and pressing Redeem never moved keyboard focus into it. It is a real dialog now: focus moves in, Escape closes it, and focus returns to the button you pressed.
  • Level-up and streak celebrations were announced as modal dialogs a member could not escape. They are announcements, and they are announced as such.
  • Granting a staff role the "manage rules" or "view analytics" capability had no effect on the actions and recap endpoints, which still demanded full administrator rights.
  • Importing from GamiPress reported success and imported nothing on sites running a version older than 6.9.4, where its points are stored differently. The import now reads whichever shape the site actually has.
  • A reward with limited stock became unlimited the moment it sold out, and could then be redeemed without limit. Stock now has three distinct states: empty means unlimited, 0 means sold out, and any positive number is the quantity remaining. Rewards you currently run with a stock of 0 stay unlimited; they are migrated on upgrade.
  • The per-member kudos cooldown was never applied on sites in a timezone behind UTC, so members could send kudos to the same person repeatedly. The cooldown is now enforced in every timezone.
  • The weekly digest's "this week" window was offset by the site's timezone, so the email could omit recent activity or include activity from the previous week. It now covers the correct seven days on any site.
  • The weekly digest was also sent to the wrong people for the same reason: the query that selects recipients used the database clock instead of the site's, so members active near the edge of the window were dropped from the send.
  • Challenges opened and closed on the database's clock rather than the site's. On a site ahead of UTC, a challenge scheduled to start at 09:00 stayed shut for hours and members could not join one that was already running; one due to close at midnight kept accepting entries. Start and end times now mean what the clock on the wall says, on the page and in the engine that awards the progress.
  • The community-challenge countdown showed the wrong time remaining, and could read "ended" hours before the challenge actually closed.
  • Two kudos sent to the same member at the same instant could both bypass the cooldown and record twice. Only one is now recorded.
  • Toasts set to a top position rendered behind the theme's header. They now sit below it, and below any other bar pinned to the top of the page.
  • Leaderboards now serve from their snapshot table instead of aggregating the full points ledger on every view. The snapshot was disabled by every points award, and a timezone mismatch emptied it at the end of each rebuild on sites ahead of UTC, so leaderboard views fell back to a full-table query.
  • The all-time leaderboard reads the materialised member totals rather than summing the whole ledger.
  • Members no longer receive duplicate weekly emails. An overdue cron re-fire could start a second send while the first was still queued.
  • Notification queue is bounded per member and no longer replays a backlog of stale toasts on every page load.
  • Weekly digest, cohort assignment, and status-retention jobs now process members in batches instead of attempting the whole site in a single run.
  • Personal-data export is paginated, so an export for a member with a long history no longer exhausts memory.
  • Award Points now uses a searchable member picker instead of rendering every member on the site into a dropdown.
  • Added database indexes for badge, kudos, submission, redemption, and member-intelligence queries that previously scanned the full table.
  • Badge rarity is cached, so public badge pages no longer aggregate the badge table on every request.
  • Setup wizard's Coaching Platform and Nonprofit templates no longer seed actions that cannot fire; the wizard now refuses to save an action it does not recognise.
  • Licence assets no longer 404 on hosts where the plugin directory is a symlink or the document root does not prefix-match the plugin path.
  • Blocks stopped working on themes that navigate without a full page reload. It was worse than nothing on the two forms: pressing Give kudos or Submit achievement made the browser submit the old way and navigate the member off the page, with what they wrote in the address bar.
  • A member's own profile visibility toggle, the control that decides whether strangers can see their profile, did nothing at all on those themes.
  • A leaderboard that arrived through a client-side navigation showed its figures once and then never updated again.
  • The redemption confirmation panel sat on top of the Redeem button and swallowed the click, so the button could not be pressed.
  • Deactivating the plugin left a recurring badge job and a half-finished retention job scheduled for ever, firing on a site where the plugin was switched off.
  • Uninstalling now removes everything the plugin created: roughly fifty options including the stored licence key, scheduled jobs in all seven of the plugin's job groups rather than only one, and every one of its user meta keys.
  • Scheduling the plugin's background jobs no longer trips WordPress's "translation loading was triggered too early" notice.
  • Confirm and Cancel in the admin's confirmation dialogs were always in English on a translated site, including the dialog that permanently deletes all member progress.
  • Save, Confirm reset and Cancel on the Streaks page were always in English on a translated site.
  • `wp wb-gamification scale teardown` deleted real members whose user ID happened to be 1,000,000 or above. It now removes only the members it created, and reports any real accounts it found in that range instead of touching them.

Security

  • Anyone could read any member's challenge progress. The public challenges endpoint took a member id and returned that member's progress for it, with nothing checked, so a visitor with no account could walk through the ids and collect it, including for members who had switched their public profile off.
  • Anyone could read any member's badges. The badge share card, the OpenBadges credential and the public badge page were each addressed by a badge id and a member id, both of which are guessable, so a visitor could enumerate them and, for a credential badge, have the site issue a signed verifiable credential about a person who had never shared it. Badges are now private until the member shares them.
  • Unpublished community challenges could be fetched by id, so the titles of drafts and retired challenges were readable by anyone, even though the list they belong to already hid them.
  • A member exercising their right to erasure was not fully erased. The eraser removed data from the tables it knew about, and it did not know about six of them, including queued notifications, cohort membership and redemptions. The personal-data export omitted a member's kudos, cohort history, redemptions and challenge log. Both now cover every table that holds a member's data, and cannot fall behind when a new one is added.
  • The Action Scheduler cleanup no longer deletes other plugins' queued work. It previously removed every pending Action Scheduler job older than the retention window, with no ownership check, which could destroy WooCommerce orders and subscription renewals on any site. Cleanup is now fenced to this plugin's own jobs, and queued work is never aged out as routine housekeeping.
  • Six of a member's stored settings survived a GDPR erasure, were missing from the data export, and were left behind by uninstall. One of them is a staff member's written note about that person.

Dev

  • Staff permissions can be read and set over REST at `GET|PUT /wb-gamification/v1/settings/capabilities` (administrator only).
  • New filter `wb_gam_empty_state_{block}` to change what a block says when it has nothing to show.
  • `wp wb-gamification scale benchmark` now covers the badge, notification, and streak read paths, and a green run against a seeded dataset is required before a release can be packaged.
  • A member publishes or withdraws their own badge over REST at `POST|DELETE /wb-gamification/v1/badges/{badge_id}/share`. There is deliberately no member id in that route: nobody can publish somebody else's badge.
  • New actions `wb_gam_badge_shared` and `wb_gam_badge_unshared` fire when a member publishes or withdraws a badge.
  • `wb_gam_user_badges` gains a `shared_at` column, added on upgrade.
  • `wp wb-gamification scale benchmark` also counts the database queries one points award costs and fails if that number climbs. Every other budget it checks is a timing budget, and a badge asking the same question twenty times is twenty fast queries that no timing budget can see.

v1.6.3

July 10, 2026
New 2 Improve 1 Fix 3 Dev 1

New

  • Learnomy integration: members earn points when they pass a Learnomy quiz, and an Achievements link is added to the account page.
  • Eventonomy integration: members earn points for reserving a place at an event, submitting an event, completing a ticket order, attending an event, and following an organizer.

Improve

  • Award-skip toasts are silent to members by default for every skip reason (cooldown, daily cap, weekly cap); the award is skipped without a "you earned nothing" notice. Use the wb_gam_award_skip_toast_reasons filter to opt specific reasons back in.

Fix

  • Frontend blocks, interactive surfaces (Hub, leaderboard, toasts, celebrations), and the block editor now display in the active site language; several strings previously always rendered in English. Ships German (de_DE) translations.
  • Badge award-window start and end columns are writable and can be cleared back to empty.
  • Reward toast and celebration overlay are readable in dark mode.

Dev

  • Documented the manifest scan-timing constraint for third-party integrations: a wb-gamification.php manifest cannot gate its returned array on function_exists() for a plugin that defines its API inside its own plugins_loaded callback (FluentCRM, for example), or the file returns no triggers; added a late-registration example under examples/.

v1.6.2

July 6, 2026
New 5 Improve 4 Fix 7 Security 1 Dev 3

New

  • Import screen migrates existing points, achievements/badges, and ranks/levels from GamiPress, myCred, and BadgeOS, with source detection, a preview, and reconciliation against each plugin's own balances. The same import runs from WP-CLI.
  • Kudos moderation admin page to review and revoke kudos, backed by a REST endpoint.
  • Streaks moderation admin page and write API to adjust member streaks, backed by a REST endpoint.
  • Staff delegation: grant trusted members the new wb_gam_manage_members capability to manage gamification without a full administrator role.
  • Optional deactivation feedback survey.

Improve

  • The BuddyNext "Profile completed" award follows the Profile Strength checklist members actually see, so it fires exactly when their widget reads "All set" (pairs with BuddyNext 1.0.5; dormant on older BuddyNext).
  • Leaderboard trend arrows now reflect real rank movement by retaining each member's previous rank between refreshes.
  • Overlays respect the prefers-reduced-motion setting and move focus on open for better keyboard and screen-reader accessibility.
  • Network requests now time out cleanly instead of hanging, using an AbortSignal on every fetch.

Fix

  • Fresh installs no longer fatal when the bundled licensing SDK loader is missing from the package.
  • BuddyNext profile-update points award on any completion change; the old under-100 percent exclusion could skip legitimate edits.
  • Toast notifications enqueue their renderer at render time so they survive host themes that isolate plugin assets.
  • The gamification hub block now adopts the site owner's configured accent color.
  • The hidden Community Challenges admin page no longer emits a PHP 8.1+ deprecation notice or renders an empty browser tab title.
  • Members keep their redemption history after the site owner removes a reward from the catalog, instead of the entry silently disappearing.
  • The member gamification Hub now renders in dark mode on themes beyond BuddyX (Reign and other themes that signal dark mode without BuddyX color tokens), instead of showing white cards.

Security

  • Hardened nonce and capability checks across the admin form handlers.

Dev

  • New wb_gam email filters for subject, recipient, and body, plus a template footer hook, for customizing transactional emails.
  • New KudosEngine::get_received() getter for per-member kudos feeds.
  • Import-mode ingestion supports occurred_at timestamps, event suppression, and idempotency.

v1.6.1

June 1, 2026
New 4 Improve 4 Fix 3 Dev 3

New

  • Public points-spend API: wb_gam_spend_points() and wb_gam_can_afford() let other Wbcom plugins redeem points for external purchases (such as BuddyNext membership tiers) through one audited, atomic debit, firing a wb_gam_points_spent action on success.
  • Wbcom Family Kit: a new Integrations tab that guides you to related Wbcom products (WPMediaVerse, Jetonomy, BuddyNext, Learnomy, WP Career Board, WB Listora) with one-click install and activate for free members.
  • Badge share pages now generate a dynamic 1200x630 social share image per badge and earner, with Open Graph and Twitter card meta for rich link previews.
  • Block editor previews now render every block styled inside the editor canvas, and the Give Kudos block gained full editing controls and a styled preview.

Improve

  • Points settings are now grouped by the source plugin instead of by category, so each integration's points are easier to find.
  • The setup wizard is reoriented around the Wbcom family of products.
  • The badge share page is rebuilt as a polished card with copy-link and X, Facebook, and LinkedIn share actions, replacing the old browser prompt popup.
  • Family product logos in the Integrations tab render at a consistent size.

Fix

  • Async points evaluation no longer fails on busy requests. The per-request event queue is split into size-bounded Action Scheduler jobs so it never exceeds the 8000-character args limit, which previously dropped batches when many events fired at once (for example while seeding demo data).
  • Leaderboard and Top Members blocks no longer render as a silently blank block when their display is deferred to Jetonomy. Site editors now see a notice explaining the deferral and how to override it with the wb_gam_defer_leaderboard_to_jetonomy filter; visitors still see nothing.
  • Resolved a WordPress 6.7+ "textdomain loaded too early" notice from the cron schedule label.

Dev

  • Recurring jobs moved to Action Scheduler, dropping the custom WP-Cron interval.
  • Composer is no longer required at runtime; runtime dependencies ship bundled in libs/.
  • New wb_gam_og_accent_color filter to customize the badge share image accent color.

v1.5.6

June 1, 2026
Fix 3 Dev 1

Fix

  • The dashboard nudge and level progress now name the next level by the configured level order, so an out-of-order points threshold no longer points members at the wrong level.
  • Editing a level in the admin now takes effect immediately instead of waiting for the cache to expire.
  • Creating a badge through the REST API now returns the correct 201 Created status.

Dev

  • The release build fails fast when its bundled dependencies are incomplete, so a packaged zip can never ship without Action Scheduler.

v1.5.5

June 1, 2026
New 1 Improve 3 Fix 6 Dev 2

New

  • Settings > Appearance lets site owners set the accent color used across member-facing surfaces, so gamification matches the community brand instead of a fixed default.

Improve

  • Redesigned the BuddyPress activity cards (badge, level, kudos, challenge) to a single theme accent with a flat surface and a subtle edge, replacing the per-type rainbow and heavy top strip so they fit the theme.
  • Gamification activity headlines now read as a short generic verb ("earned a badge") so they no longer repeat the card beneath them.
  • Swept every admin screen for consistency: unified button styling, replaced blank navigation icons, tokenized colors for dark mode, responsive tables, and accessible tap targets.

Fix

  • Realtime points and badge toasts now arrive in about 15 seconds instead of up to a minute; the heartbeat interval was silently falling back to the WordPress default.
  • Badge artwork stays legible in dark mode; the medallion now sits on a light plate on profiles and in the activity stream.
  • Legacy activity items created before the card redesign convert to the modern card automatically on update, across all four event types, with no manual step.
  • Public profiles show "1 badge" (singular) correctly.
  • Accessible names added to the email-notification toggles and the submission reject-reason field.
  • Admin screens on WordPress 6.9+ no longer show repeated "ability category not registered" notices and the "headers already sent" warnings they caused after install.

Dev

  • Gamification abilities now register correctly with the WP Abilities API: category registration, executable callbacks proxied to the documented REST routes, permission gates per auth level, and input schemas.
  • Added a regression journey and unit test covering the activity card and generic-headline contract.

v1.5.4

June 1, 2026
New 4 Improve 1 Fix 2 Security 1 Dev 1 Compat 1

New

  • WPMediaVerse Pro competitions award the XP configured per competition (challenge placing and participation, tournament round win, and champion) instead of a flat default. The integration manifest carries each competition's id in event metadata so Pro resolves the configured amount through the wb_gam_points_for_action filter.
  • Members can set their own profile public or private. A toggle on the public profile page writes the per-user visibility choice through a new self-service REST endpoint; the read paths and GDPR export/erase already honored the setting, this adds the missing member-facing control.
  • Settings > Engagement gives site owners direct control over features that previously only had code defaults: the daily login bonus (enable plus tier ladder), streak grace days and milestone bonus, the weekly recap email (enable plus subject), the leaderboard nudge email, the four BuddyPress activity-stream event toggles, and the public-profile URL slug.
  • Settings > Points adds an event-log retention control (default 12 months) next to points-history retention, and corrects the help text that wrongly stated the event log is never pruned.

Improve

  • Declared WordPress 6.5 as the minimum (the hub block's script modules require it) and marked Tested up to 7.0 so the plugin surfaces correctly in WordPress.org search.

Fix

  • Earned badges display again. Badges awarded on 1.5.0 to 1.5.3 were stored with a broken expiry date that hid them from profiles, the Members page, and badge counts while the data stayed intact. Awards now store the expiry correctly, upgrading repairs every affected row automatically, and wp wb-gamification doctor --fix repairs it on demand.
  • Stop the early-textdomain notice triggered by translated labels in the WPMediaVerse integration manifest.

Security

  • Hardened the realtime SSE stream against event-field injection by stripping CR/LF from the event name before each event-stream record is written.

Dev

  • Removed the dead points_callback from the challenge-winner and streak triggers; the engine never consumed it, so awards already fell through to default_points.

Compat

  • Pairs with WPMediaVerse Pro 1.6.0. Install both updates together for per-competition XP to take effect.

v1.5.3

June 1, 2026
New 8 Dev 1

New

  • Settings > Access: exclude roles or specific accounts from earning points, badges, levels, and streaks (administrators, staff, support agents, bots). Excluded members keep existing points but stop accruing and are hidden from leaderboards. Enforced on every award path; filter wb_gam_user_can_earn for code-level control.
  • Members admin page (Gamification > Members): searchable, paginated roster of every member with points, level, and badges, plus per-member award, exclude/include, and reset-points actions.
  • Bulk award: grant the same points to every member of a role, or to all members at once, from the Award Points page. Excluded accounts are skipped automatically.
  • Settings > Tools: export the plugin configuration to a JSON file and import it on another site. Runtime and schema state are excluded so a config move never corrupts the target site.
  • Settings > Tools: a Rebuild leaderboard button that recomputes the snapshot and clears its caches, for when the leaderboard looks stale after a manual award or import.
  • Settings > Modules: turn off engagement modules your community does not use (kudos, streaks, challenges, community challenges, cohort leagues, redemption store). A disabled module's blocks and shortcodes render nothing and its admin page is hidden; nothing is deleted, so re-enabling restores it. Points, badges, levels, and leaderboards are always on.
  • Settings > Points: optional point expiry. Off by default. When enabled, a daily job decays the balance of members who have not earned for a chosen number of days (applied once per inactive streak), to nudge re-engagement.
  • Settings > Tools: Reset all member progress. Permanently clears accumulated member data (points, badges, streaks, kudos, leaderboards, redemptions, submissions) while keeping all configuration and definitions. Requires explicit confirmation.

Dev

  • New admin REST endpoints under wb-gamification/v1 (members collection, member exclude/reset, points bulk, tools export/import/recompute/reset-progress), all admin-gated and namespaced so they never collide with WordPress core or BuddyPress routes. New hooks: wb_gam_user_can_earn, wb_gam_module_enabled, wb_gam_progress_reset, wb_gam_points_decayed.

v1.5.2

June 1, 2026
New 7 Improve 6 Fix 5 Dev 1 Compat 1

New

  • BuddyPress profile "Achievements" tab with Overview, Badges, Points, and Streak sub-tabs. Renders the displayed member's points, level progress, streak, badges, and points history by reusing the existing blocks - viewable on your own profile and other members'.
  • WooCommerce My Account "Achievements" endpoint (/my-account/achievements/) for stores running WooCommerce without BuddyPress. Renders the member's full gamification dashboard by reusing the Hub block, with a link to the mapped Hub page. Loads only when WooCommerce is active.
  • Optional LearnDash profile "My Achievements" link to the gamification dashboard (the mapped Hub page). OFF by default; enable with add_filter( 'wb_gam_learndash_profile_link', '__return_true' ).
  • Admin setting for notification placement (Settings > Realtime): bottom-right default, plus bottom-left, top-right, and top-center, with corner-aware slide-in.
  • Filter wb_gam_sse_allowed to opt into SSE streaming on hosts provisioned for long-lived connections.
  • Reusable batch cache-prime APIs PointsEngine::prime_totals() and BadgeEngine::prime_earned_badges() for per-row listing surfaces.
  • On Jetonomy sites the leaderboard defers to Jetonomy's reputation ranking, since wb-gam already mirrors reputation 1:1 into points and the two rankings are identical. The wb-gam leaderboard and top-members blocks, shortcodes, and Hub card are hidden so members see one leaderboard. Badges are unaffected (both badge sets are kept). Filter wb_gam_defer_leaderboard_to_jetonomy to override.

Improve

  • Realtime now defaults to WP Heartbeat instead of SSE, removing a long-poll that pinned a PHP worker per logged-in page; SSE is opt-in.
  • Heartbeat polls every 15 seconds at rest (was 5), bursts to 5 seconds for 30 seconds after a member action, and nearly suspends on backgrounded tabs.
  • Member directory, leaderboard, and top-members no longer run per-row queries; query count is now constant regardless of community size.
  • Reward toasts always state what the points were for, using the action label or the admin-entered reason.
  • Frontend surfaces (Hub, blocks, member profile) map their neutral colors to the active theme's tokens, so they follow BuddyX and BuddyX Pro light and dark mode automatically; themes without those tokens keep the original light palette.
  • My Badges flyout shows two columns so each badge's art, title, and description are readable instead of cramped three-up.

Fix

  • Toast stack no longer overlaps the theme header or navigation.
  • Duplicate toasts when both SSE and Heartbeat delivered the same event.
  • Points toast showed a contextless "+N Points (M actions)" count instead of naming the action.
  • Member profile pages at /u/{username} returned 404 for everyone because public visibility required an opt-in that no screen ever set; public profiles are now on by default, and the owner and admins can always view a profile.
  • Removed em-dashes from all user-facing labels and descriptions (frontend blocks, member profile, admin settings) per house style; hyphens only. Existing seeded badge descriptions were migrated in the database too.

Dev

  • Member achievements surfaces share one renderer (WBGam\Engine\MemberSurface) with a wb_gam_member_surface_html filter, so the BuddyPress, WooCommerce, and LearnDash integrations reuse the same blocks and mapped-hub link with no duplicated display logic.

Compat

  • Jetonomy badges and reputation continue to award wb-gam points (Jetonomy badge earned, reputation change, space join, polls, messages); wb-gam adds the levels, streaks, challenges, and redemption layer on top.

v1.5.1

June 1, 2026
Fix 3 Compat 1

Fix

  • Fatal E_COMPILE_ERROR on PHP 8.1 and below. KudosEngine::send() declared a `true|WP_Error` return type; the standalone `true` literal type only exists in PHP 8.2+, so on PHP 8.0/8.1 it was parsed as a class name (WBGam\Engine\true) and crashed the site. Changed to `bool|WP_Error`.
  • Event value object used readonly properties (PHP 8.1+), breaking parsing on PHP 8.0. Properties are now plain public; immutability is enforced by convention (constructor-only writes, copy-on-change).
  • OpenApiCommand::error() used the `never` return type (PHP 8.1+); changed to `void` so the file parses on PHP 8.0.

Compat

  • Minimum supported PHP lowered from 8.1 to 8.0. CI now lints PHP 8.0 through 8.4.

v1.5.0

May 1, 2026
New 5 Improve 6 Fix 18 Security 1 Dev 3

New

  • Manual-award form on the Badge edit screen lets admins grant any rule-driven or manually-awarded badge to a chosen member without writing SQL.
  • MemberUploadCap engine grants the upload_files capability to members only while the Submit Achievement editor is rendering and during the media-upload action, so the Add Media button works for non-admins without exposing the full Media Library. Opt-out filter wb_gam_grant_member_uploads.
  • Action Scheduler circuit-breaker plus drain CLI (wp wb-gamification as drain) for sites whose actionscheduler_actions table has grown past safe limits.
  • Local-CI gate 2.13 boot-invariants detects class_exists guards above top-level class declarations (the root cause of the silent boot failure that hid the admin menu on one install).
  • Local-CI gate 2.14 enforces the seed-default-badge contract so every default badge condition (action_count, point_milestone) matches the badge name's literal action.

Improve

  • Toast notifications now use the WordPress Heartbeat fast interval (5 s) on gamification surfaces so realtime feedback feels immediate.
  • Earning Guide card layout puts the action label below the icon and points row so long action names no longer wrap vertically inside a cramped middle column.
  • Cohort Rank block gets tier-coloured accents (Bronze / Silver / Gold / Diamond) driven by a data-tier attribute and per-tier CSS variables.
  • Community Challenges block ships a proper completed-state visual treatment (green pill plus gradient card) so completed challenges read distinctly from active ones.
  • User Status Bar block uses an SVG-mask chevron toggle and exposes a theme-aware top offset so the sticky panel sits below custom theme admin bars.
  • Activity Stream block alignment tightened to match the Reign-stack social-feed conventions.

Fix

  • Point-type conversion now credits the destination currency. The conversion path previously debited the source point type but never wrote the credit (a broken transaction nesting plus a duplicate-key write), so members lost points on every conversion. Conversions now run as one atomic debit-plus-credit sharing a single audit event.
  • Badge award conditions are saved atomically. A failed save no longer leaves a badge with no condition (which silently stopped it from auto-awarding); the editor now reports an error instead of a false success.
  • API key creation verifies the key was stored before returning it, so admins are never handed a key that was never persisted and can never authenticate.
  • Submission approval only marks a submission approved once its points award succeeds; on failure the submission stays pending instead of approving with zero points awarded.
  • Admin REST writes across challenges, community challenges, levels, rules, webhooks, rewards, and badges now return a 500 on a database failure instead of silently reporting success, and multi-row deletes roll back together.
  • Deactivating the plugin now clears every scheduled cron hook, leaving no orphaned events behind.
  • Setup Wizard now triggers on first activation in CLI and one-click sandbox flows; Installer::maybe_install on plugins_loaded@0 covers restore-from-backup and container clone scenarios that bypassed the activation hook.
  • WooCommerce purchase events fire on woocommerce_payment_complete instead of woocommerce_order_status_completed so members earn points the moment the gateway confirms payment, not whenever an admin manually marks the order complete. First-purchase detection counts processing and completed orders together.
  • Redemption email events are now whitelisted in EmailSettingsController so the per-event toggle actually sends the redemption confirmation email when enabled.
  • Redemption Store block reads stock=0 as Unlimited (not Out of stock) to match the documented admin contract.
  • Hub Challenges card now surfaces in-flight community challenges alongside personal challenges and uses a panel_blocks array so the hub can mount multiple blocks per panel.
  • Community challenge bonus award no longer dead-letters; CommunityChallengeEngine listens on its own wb_gam_community_bonus_award AS hook and routes through PointsEngine::award for every contributor.
  • Completed community challenges remain visible until their expiry instead of vanishing the instant the global goal is hit; CommunityChallengeEngine::get_visible() returns active plus completed-but-not-expired entries.
  • Cohort tier names edited from the Cohort Settings admin page now flow through to the Cohort Rank block via CohortEngine::get_tier_name() which reads wb_gam_cohort_settings before falling back to the TIERS constant.
  • Duplicate toast notifications eliminated via a Set-based dedupe in assets/js/toast.js keyed on toast id or content fingerprint, closing the cursor-race that produced repeated bubbles.
  • Default badge conditions corrected to match their names: First Post, Prolific Writer, and Content Creator track wp_publish_post action_count; First Comment and Engaged Reader track wp_leave_comment action_count. Replaces the 50-points placeholder that previously fired on the wrong trigger.
  • LeaderboardNudge no longer enters infinite Action Scheduler recursion on databases where points_changed broadcasts can re-enter the dispatcher. Closes the 3.5M-row runaway encountered on one production install.
  • Class-hoist guard at the top of wb-gamification.php removed; the guard ran against an already-hoisted top-level class declaration and silently aborted boot, hiding the Gamification admin menu on affected installs. Local-CI 2.13 now prevents the regression.

Security

  • The member upload_files grant is scoped to the achievement-submission flow instead of being granted site-wide to every logged-in user, closing a privilege-escalation and storage-abuse vector on open-registration communities.

Dev

  • Admin CSS is fully tokenized: every color now resolves through the --wbgam-* design-token palette in tokens.css (zero hardcoded hex outside the token block), so a single palette edit re-themes the whole admin UI.
  • Manifest v2.2 refreshed end-to-end; audit/derived/ now caches 16 static-analysis sub-checks including the new boot-hoist-guards finder.
  • plan/ and audit/ folders consolidated; the single plan/MASTER-CHECKLIST.md replaces every dated release plan, bug-sweep spec, and UX-audit markdown that previously accumulated under plan/.

v1.4.0

May 1, 2026
New 5 Improve 7 Fix 8 Dev 2

New

  • Give-kudos block + shortcode (wb-gamification/give-kudos, [wb_gam_give_kudos]) for sending kudos from any frontend page.
  • Per-action cooldown + daily-cap admin override (Points settings table) with autosave to /actions/{id}/overrides REST.
  • ActionSchedulerCleaner daily cron prunes pending, failed, and complete action-scheduler rows older than 7 days (filter wb_gam_as_retention_days).
  • Jetonomy free integration manifest covers four previously-unrewarded events: joining a space, approval into a gated space, trust-level promotion (TL0 to TL5), and paid-membership activation (RCP / PMPro / MemberPress / WooCommerce Subscriptions / Sensei / LearnDash / MasterStudy / Tutor / LifterLMS).
  • Jetonomy Pro DM-received signal (recipient side) now earns gamification points with cooldown plus daily cap to prevent spam-DM gaming.

Improve

  • Settings dashboard container now uses 1600px max-width on wide monitors and consolidates a duplicate .wbgam-wrap rule.
  • Challenges and Community Challenges admin pages unified under a single Challenges menu entry with Individual / Community tabs.
  • Async award flag dropped on five low-volume BuddyPress + WPMediaVerse actions so points update synchronously without Action Scheduler delay.
  • Admin notices now render above the WB Gamification chrome instead of being visually trapped inside .wbgam-wrap.
  • Configure Points and Top Actions dashboard links route to the in-page Points tab via hash anchor instead of broken query-string routing.
  • Leaderboard rows now show points-with-icon and badges-earned count next to each member; member directory entries now display Level, Points, and Badge count instead of just the level name.
  • JetonomyIntegration class no longer registers three filter listeners (jetonomy_reputation_points_map, jetonomy_reputation_pre_change, jetonomy_leaderboard_items) that have no emit sites in upstream Jetonomy 1.4.4. Listeners were dead wiring; removal clears confusion about which contracts the integration actually honors. Sandbox veto via wb_gam_sandboxed user meta now runs on the working jetonomy_reputation_changed mirror path instead.

Fix

  • LeaderboardNudge no longer enqueues duplicate Action Scheduler jobs for the same user; a runaway loop on long-running sites is contained by the new as_has_scheduled_action guard.
  • Challenge time queries use UTC_TIMESTAMP() instead of NOW() so UTC-stored start and end columns activate at the correct moment on servers with a non-UTC MySQL session timezone.
  • datetime-local admin inputs hydrate UTC values into the browsers local time on page load so the Challenges and Community Challenges edit forms no longer drift the saved time by the timezone offset on every edit.
  • Level-up and streak-milestone toasts now include a translated message string so the toast bubble is no longer empty.
  • ChallengeEngine duplicate do_action removed so BP activity rows, webhook deliveries, and emails fire once per challenge completion instead of twice.
  • KudosController create_item resolves recipient_login (username or email) server-side for the new give-kudos block; receiver_id remains supported.
  • BuddyPress activity filter labels now expose four distinct entries (Badge earned, Level up, Kudos sent, Challenge complete) instead of collapsing into one Gamification row; sites can override via the wb_gam_activity_context_label filter.
  • Gamification top-level admin menu icon now renders on every wp-admin page (Lucide font + the icon-paint CSS rule are enqueued globally so the icon does not disappear when viewing Posts, Pages, Tools, etc.).

Dev

  • New wb_gam_as_retention_days filter (default 7) to tune Action Scheduler retention per site.
  • New wb_gam_activity_context_label filter exposes BP activity context labels for per-type customisation.

v1.3.0

May 1, 2026
New 4 Fix 3

New

  • Jetonomy 1.4.3 reputation and leaderboard integration.
  • Jetonomy Pro event triggers for polls, direct messages, badges, and reactions.
  • WPMediaVerse Free and Pro integration manifests shipped in-tree so the host site no longer carries the manifest layer.
  • Engine now fires wb_gam_award_skipped from every silent-skip path so integrations can react to skipped awards.

Fix

  • Points history view renders the manifest label instead of the raw action_id.
  • WPMediaVerse handlers use upstream hook arguments instead of a broken static lookup.
  • Boot path shows an admin notice instead of a fatal error when vendor/ is missing.

v1.2.0

May 1, 2026
New 1 Improve 2 Dev 1

New

  • EDD SDK integration for automatic plugin updates from wbcomdesigns.com.

Improve

  • Consolidated admin stylesheets into a single admin.css.
  • Populated admin dashboard with KPI cards, top actions, top earners, and a daily sparkline.

Dev

  • submit-achievement view.js is translation-ready.

v1.0.0

Note 20

Note

  • First public release.
  • sourced points engine with 30+ auto-detected actions across 10 integrations.
  • 30 pre-built badges with point milestone and action count auto-award conditions.
  • 5-level progression system (Newcomer to Champion) with configurable thresholds.
  • Leaderboard with snapshot caching, group scoping, and 4 time periods.
  • Individual challenges with admin manager, bonus points, and date ranges.
  • Daily streak tracking with grace period, 7 milestones, and bonus rewards.
  • Peer kudos with daily limits, receiver/giver points, and feed display.
  • 17 Gutenberg blocks and 15 shortcodes for frontend display.
  • REST API with 65 endpoints across 24 controllers.
  • site gamification center mode.
  • WP Abilities API registration (12 abilities) for AI agent discovery.
  • 9 first-party integration manifests (BuddyPress, bbPress, WooCommerce, LearnDash, LifterLMS, MemberPress, GiveWP, The Events Calendar).
  • Setup wizard with 5 starter templates (Blog, Community, Course, Coaching, Nonprofit).
  • Modern admin UI with sidebar navigation, card layout, and field descriptions.
  • Analytics dashboard with 6 KPI cards, top actions/earners, daily sparkline.
  • Toast notifications via Interactivity API and REST polling.
  • CLI commands: points, member, actions, logs, export, doctor.
  • compliant data export and erasure.
  • 60+ pages of documentation at docs/website/.