Version 5.0.0
May 14, 2026
First Craft 5 release - complete rewrite from the Craft 2 line (last released at 1.0.3 in 2016). Version jumped to align with Craft 5 itself, the way Craft Commerce and other ecosystem plugins do.
Added
- Plugin editions - Lite (free) and Pro. Lite includes the full gamification feature set (rules, awards, levels, leaderboard, widgets, Entry/Asset/User triggers, Twig + GraphQL APIs). Pro adds Commerce triggers (Orders + Subscriptions), percentage-of-order rewards, Commerce conditions, and order redemptions.
- Visual rule builder (CP) - Zapier-style: WHEN (trigger) → IF (repeatable conditions) → THEN (reward type) → LIMITS (frequency caps) → ACTIVE PERIOD (optional date range).
- Conditions / Limits / Rewards engine - pluggable subsystems, each with a register event so other plugins can ship their own classes.
- Conditions ship: Section, CategoryGroup, Volume, UserGroup, UserLevel, DayOfWeek. Pro adds: OrderTotal, OrderItemCount, OrderHasCoupon, OrderContainsProduct.
- Limits ship: OncePerUser, MaxPerUser (with optional cooldown field).
- Rewards ship: Flat, Deduct. Pro adds: Percent (% of trigger amount).
- Triggers - Entry created/updated, Asset created, User registered/logged in/birthday/anniversary on Lite; Order paid/completed/refunded/first-ever and Subscription created/renewed/cancelled/plan-changed on Pro.
PointAwardelement type - awards are first-class elements with a full index, search, sort, source filters, and bulk actions. Row title is the rule name, points snapshotted at award time so editing a rule later doesn't rewrite history.- Levels - tiered loyalty thresholds with optional colour and badge icon (Bronze/Silver/Gold style).
- Leaderboard - CP page (paginated) and dashboard widget showing top users by total balance.
- Latest Awards dashboard widget - the N most recent awards across all users, with user avatars.
- Three ways to fire a Manual rule from the frontend, all sharing the same login-required, CSRF-protected, current-user-only, Manual-only, Limits-enforcing security model:
- HTML form - POST to
points/awards/add(orpoints/awards/remove) withcsrfInput(),actionInput(),redirectInput(), and aruleHandle. - JS API -
{{ craft.points.script() }}defineswindow.Points.addAward(handle)andremoveAward(handle). Cache-safe (CSRF token fetched at runtime), works inside Blitz /{% cache %}/ static cache. - GraphQL mutation -
pointsAddAward(ruleHandle: String!): PointsAddAwardResultfor headless / decoupled SPAs.
- HTML form - POST to
- Order redemptions (Pro + Commerce) - customers spend points against a Commerce order. The
PointsAdjustershows it like a coupon discount. Points deduct onOrder::EVENT_AFTER_ORDER_PAID; refunds restore points per the configured behaviour (proportional / full-only / none). - Awards stamp the originating order (Pro + Commerce) - awards from
OrderPaidTrigger,OrderCompletedTrigger,OrderRefundedTrigger,FirstOrderTriggercarry anorderIdback-reference. OptionalOrdercolumn on the Awards index renders the order as a Craft chip linking to the order edit URL. - Up to four optional columns on the Users element index -
{Currency Plural}(balance) andLevelon Lite;Available SpendandRedeemedon Pro+Commerce. Opt-in via column settings. - Renameable - plugin name (sidebar / breadcrumbs - e.g. "Rewards System") and Reward unit labels (singular / plural - e.g. "Coin" / "Coins") configurable in Points → Settings → General. Plugin handle, URLs, table names, and Twig API namespaces unchanged - display labels only.
- Conversion rate stored as a paired
conversionPointsCount+conversionCurrencyUnitssetting so admins can express ratios like "5 points = 1 unit". Currency itself tracks the Commerce primary store automatically (no symbol setting). - Plugin settings live in their own DB table, not Project Config - admins can rename things on production without staging deploys clobbering them. Devs can pin per-environment values via
config/points.php. - Tabbed Settings page extending
_layouts/cpwith native Craft tabs - General, Commerce (Pro), Rules. - Settings link in the CP sidebar, gated on
points-manageSettings. Craft's gear-menu route redirects to the same page. - Granular permissions - View + Create + Edit + Delete per resource (Awards, Rules, Levels), plus
points-viewLeaderboard(read-only) andpoints-manageSettings. Child permissions only grantable once the parent is granted. The Points sidebar item and each sub-page hide entirely when the user has no relevant permissions. - Dashboard widget visibility - widgets check the user's
view-*permission before appearing in the widget picker. - Plugin events for extensibility:
Awards::EVENT_BEFORE_ADD_AWARD(cancellable; handlers can modify points)Awards::EVENT_AFTER_ADD_AWARDAwards::EVENT_BEFORE_REMOVE_AWARD(cancellable)Awards::EVENT_AFTER_REMOVE_AWARDLevels::EVENT_LEVEL_CHANGED
- Pluggable subsystem events:
Triggers::EVENT_REGISTER_TRIGGERS,Conditions::EVENT_REGISTER_CONDITION_RULES,Limits::EVENT_REGISTER_LIMITS,Rewards::EVENT_REGISTER_REWARDS. - GraphQL - queries
pointsRules,pointsRule,pointsLevels,pointsLevelForUser,pointsAwards,pointsSumForUser,pointsCountForUser,pointsLeaderboard. MutationpointsAddAward. Types:PointsRule,PointsLevel,PointsAward,PointsLeaderboardRow,PointsAddAwardResult. - Twig API -
craft.points.*with helpers for rules, awards, levels, leaderboard, money conversion, and the cache-safescript()helper. Pluscurrency,currencyPlural,symbol,currencyCode,pluginName,isPro. - Plugin / service helpers:
Points::hasCommerce(),getStoreCurrencyCode(),getStoreCurrencySymbol(),formatStoreMoney(), staticpointsToMoney().Awards::getRedeemedPointsForUser().OrderRedemptionsservice (apply,remove,getForOrder,processPaidOrder,processRefund). - Trigger API:
TriggerInterface::isAvailable()(hide triggers from the picker until their dependencies are met - e.g.UserBirthdayTriggerwaits until a Date field handle is set on the user layout) andTriggerInterface::getOrderIdFromEvent()(lets order triggers stamp their award with the source order ID).
Changed (breaking from the Craft 2 plugin)
- "Event" renamed to "Rule" throughout - the word "event" was overloaded with Craft's PHP
Eventconcept. Affects DB tables, class names, service properties, Twig/GraphQL APIs, CP URLs, and permissions. - "Entry" renamed to "Award" throughout to avoid clashing with Craft's own Entry element. Affects DB tables, element class (
PointEntry→PointAward), service (Entries→Awards), Twig/GraphQL APIs, plugin events, permissions, and CP URLs. - Currency is no longer configured in the plugin - tracks Craft Commerce's primary store automatically.
- Money helpers are Pro + Commerce only -
craft.points.toMoney(),formatMoney(),symbol,currencyCode,orderRedemption,appliedToOrder, theAvailable Spend/Redeemedcolumns, and the order-redemption flow all require Commerce installed. - Twig
craft.points.addAward()/removeAward()removed - they bypassed CSRF and accepted arbitraryuserIds. Use the form / JS API / GraphQL mutation from public pages, orPoints::getInstance()->awards->addAward($userId, $handle)from server-side PHP. - Twig
craft.points.addEventremoved - rules are CMS-managed only now. - Permissions overhauled - the Craft 2 plugin's single
points-manageEvents/points-manageEntries/points-manageLevelstier is replaced with View + Create + Edit + Delete per resource, pluspoints-viewLeaderboardandpoints-manageSettings. - Minimum requirements - Craft 5.6+, PHP 8.2+.
- Namespace -
Craft\PointsPlugin→bymayo\points\Points.