{"id":284502,"date":"2026-03-04T08:24:17","date_gmt":"2026-03-04T08:24:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/in-stock-notifier-for-woocommerce\/"},"modified":"2026-03-16T18:26:05","modified_gmt":"2026-03-16T18:26:05","slug":"beltoft-loyalty-rewards","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/beltoft-loyalty-rewards\/","author":23461136,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.20","stable_tag":"1.2.20","tested":"6.9.4","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"Beltoft Loyalty Rewards for WooCommerce","header_author":"beltoft.net","header_description":"Earn points on purchases and redeem them for cart discounts.","assets_banners_color":"","last_updated":"2026-03-16 18:26:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/beltoft.net","rating":5,"author_block_rating":0,"active_installs":0,"downloads":380,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.13":{"tag":"1.2.13","author":"christian198521","date":"2026-03-04 08:23:47"},"1.2.14":{"tag":"1.2.14","author":"christian198521","date":"2026-03-04 08:33:48"},"1.2.15":{"tag":"1.2.15","author":"christian198521","date":"2026-03-09 07:55:16"},"1.2.16":{"tag":"1.2.16","author":"christian198521","date":"2026-03-09 09:21:44"},"1.2.17":{"tag":"1.2.17","author":"christian198521","date":"2026-03-09 10:26:17"},"1.2.18":{"tag":"1.2.18","author":"christian198521","date":"2026-03-09 11:30:37"},"1.2.19":{"tag":"1.2.19","author":"christian198521","date":"2026-03-09 11:47:26"},"1.2.20":{"tag":"1.2.20","author":"christian198521","date":"2026-03-16 18:26:05"}},"upgrade_notice":{"1.2.0":"<p>Adds new redeem settings. Review the redeem options under WooCommerce &gt; Loyalty Rewards.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.13","1.2.14","1.2.15","1.2.16","1.2.17","1.2.18","1.2.19","1.2.20"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Settings screen with earn rate, redeem controls, and expiry settings.","2":"Cart page with redeem form.","3":"My Account \"My Points\" tab.","4":"Admin points ledger."},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[331,3377,2321,294,286],"plugin_category":[45],"plugin_contributors":[256640,257057],"plugin_business_model":[],"class_list":["post-284502","plugin","type-plugin","status-publish","hentry","plugin_tags-discount","plugin_tags-loyalty","plugin_tags-points","plugin_tags-rewards","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-beltoftnet","plugin_contributors-christian198521","plugin_committers-beltoftnet","plugin_committers-christian198521"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/beltoft-loyalty-rewards.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>A points-based loyalty system for WooCommerce. Customers earn points on orders and redeem them for discounts at cart or checkout.<\/p>\n\n<h3>How It Works<\/h3>\n\n<ol>\n<li><strong>Earn<\/strong> \u2014 Customers get points when their order is completed (or processing). You set the earn rate, e.g. 1 point per $1 spent.<\/li>\n<li><strong>Redeem<\/strong> \u2014 On the cart or checkout page, customers apply points for a discount. No coupon codes involved.<\/li>\n<li><strong>Expire<\/strong> \u2014 Optionally expire unused points after a set number of days.<\/li>\n<\/ol>\n\n<h3>Features<\/h3>\n\n<ul>\n<li>Configurable earn rate (points per currency unit)<\/li>\n<li>Points redemption with configurable redeem rate, minimum points, and max discount percentage<\/li>\n<li>\"My Points\" tab in My Account with balance and transaction history<\/li>\n<li>Points expiry with configurable days<\/li>\n<li>Admin points ledger with filtering and CSV export<\/li>\n<li>Manual point adjustments from user profiles<\/li>\n<li>Points earned shown on product pages and order admin<\/li>\n<li>Automatic reversal on cancellation or refund<\/li>\n<li>Works with classic cart and checkout<\/li>\n<li>HPOS compatible<\/li>\n<li>Shortcodes: <code>[blrw_points_message]<\/code> and <code>[blrw_redeem_form]<\/code><\/li>\n<\/ul>\n\n<h3>Pro Add-on<\/h3>\n\n<p>Need referrals, campaigns, tiers, or bulk tools? The <strong><a href=\"https:\/\/beltoft.net\/plugins\/loyalty-rewards\">Beltoft Loyalty Rewards for WooCommerce - Pro<\/a><\/strong> add-on adds:<\/p>\n\n<ul>\n<li>Referral program with shareable links and anti-fraud hold<\/li>\n<li>Bonus points for signup, reviews, and daily login<\/li>\n<li>Email notifications (points earned, expiry warning, monthly summary)<\/li>\n<li>Multiplier campaigns (double\/triple points events)<\/li>\n<li>VIP tiers (Bronze, Silver, Gold, Platinum) with earn-rate multipliers<\/li>\n<li>Bulk credit\/debit, CSV import, and balance export<\/li>\n<li>Full redeem UI, tier badges, and campaign banners<\/li>\n<li>Compatible with WooCommerce block-based Cart and Checkout<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>beltoft-loyalty-rewards<\/code> folder to <code>\/wp-content\/plugins\/<\/code> or install from the Plugins screen.<\/li>\n<li>Activate through the Plugins menu.<\/li>\n<li>Go to WooCommerce &gt; Loyalty Rewards to configure.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20customers%20redeem%20points%3F\"><h3>How do customers redeem points?<\/h3><\/dt>\n<dd><p>On the cart or checkout page, logged-in customers see their balance and can enter how many points to apply. The discount shows as a line item.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20an%20order%20is%20cancelled%20or%20refunded%3F\"><h3>What happens when an order is cancelled or refunded?<\/h3><\/dt>\n<dd><p>Points earned from that order are automatically reversed.<\/p><\/dd>\n<dt id=\"can%20i%20adjust%20a%20customer%27s%20points%20manually%3F\"><h3>Can I adjust a customer's points manually?<\/h3><\/dt>\n<dd><p>Yes. Go to Users &gt; Edit User and scroll to the Loyalty Points section.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20block-based%20cart%20and%20checkout%3F\"><h3>Does it work with WooCommerce block-based Cart and Checkout?<\/h3><\/dt>\n<dd><p>The Pro add-on adds full support for block-based Cart and Checkout with a redeem form, tier badges, and campaign banners.<\/p><\/dd>\n<dt id=\"is%20it%20compatible%20with%20hpos%3F\"><h3>Is it compatible with HPOS?<\/h3><\/dt>\n<dd><p>Yes.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.20<\/h4>\n\n<ul>\n<li>Fixed: Pro add-on link pointing to incorrect URL.<\/li>\n<\/ul>\n\n<h4>1.2.19<\/h4>\n\n<ul>\n<li>Improved: Shortcode asset loading \u2014 CSS is now enqueued from within the shortcode render callback instead of scanning post content.<\/li>\n<\/ul>\n\n<h4>1.2.18<\/h4>\n\n<ul>\n<li>Fixed: Frontend CSS not loading on pages with shortcodes ([blrw_points_message], [blrw_redeem_form]).<\/li>\n<\/ul>\n\n<h4>1.2.17<\/h4>\n\n<ul>\n<li>Added: Product ID data attribute on earn-points message for dynamic loading support (Pro).<\/li>\n<\/ul>\n\n<h4>1.2.16<\/h4>\n\n<ul>\n<li>Fixed: Max redeemable points calculated on subtotal excluding tax, preventing full cart coverage when prices include tax.<\/li>\n<\/ul>\n\n<h4>1.2.15<\/h4>\n\n<ul>\n<li>Changed: \"Exclude Tax from Points Calculation\" now disabled by default (new installs only).<\/li>\n<li>Changed: \"Points Required\" setting renamed to \"Redemption Rate (Points)\" for clarity.<\/li>\n<\/ul>\n\n<h4>1.2.9<\/h4>\n\n<ul>\n<li>Fixed: Order points could be under-awarded when discounts were subtracted twice.<\/li>\n<li>Changed: Shortcodes now use slug-based names: <code>[blrw_points_message]<\/code> and <code>[blrw_redeem_form]<\/code>.<\/li>\n<\/ul>\n\n<h4>1.2.8<\/h4>\n\n<ul>\n<li>Improved: Redeem form syncs when coupon is removed via WooCommerce cart totals.<\/li>\n<li>Improved: Earn estimate shown on cart\/checkout even when balance is zero.<\/li>\n<li>Fixed: WC \"Coupon has been removed\" notice flash suppressed on page-builder pages.<\/li>\n<li>Added: WC_Logger debug logging with toggle in Advanced settings.<\/li>\n<li>Added: Portuguese (Portugal) translation.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Improved: Redeem form now compatible with page builders (Bricks, Elementor, etc.).<\/li>\n<li>Improved: Apply button shows loading spinner while processing.<\/li>\n<li>Fixed: Expiry cron stopping after first run (uncorrelated NOT EXISTS subquery).<\/li>\n<li>Fixed: Customers earning fewer points than intended when redeeming on the same order (double coupon subtraction).<\/li>\n<li>Fixed: Redeemed points now restored when order status changes to failed.<\/li>\n<li>Fixed: Admin deductions larger than balance no longer desync ledger from stored balance.<\/li>\n<li>Fixed: Store API apply\/remove now checks redeem_enabled setting.<\/li>\n<li>Fixed: Ledger list cache invalidation on insert.<\/li>\n<li>Fixed: Form state updates directly from AJAX response instead of relying on checkout refresh.<\/li>\n<li>Fixed: WooCommerce coupon notices no longer pile up on page-builder checkouts.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Improved: Redeem form redesigned to follow WooCommerce native styling.<\/li>\n<li>Improved: My Points page design consistency.<\/li>\n<li>Fixed: Escape all translatable strings per WordPress coding standards.<\/li>\n<li>Fixed: Sanitize POST data with wp_unslash in admin profile handler.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Improved: Clearer earn and redeem messaging on cart and checkout.<\/li>\n<li>Fixed: Inline notices replace JavaScript alerts on redeem errors.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: Points-to-earn estimate on cart and checkout.<\/li>\n<li>Added: Configurable redeem rate, minimum points, and max discount percentage.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Earn points on purchases and redeem them for cart discounts.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/284502","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=284502"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/beltoftnet"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=284502"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=284502"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=284502"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=284502"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=284502"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=284502"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}