{"id":338557,"date":"2026-07-18T14:09:48","date_gmt":"2026-07-18T14:09:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/vivid-sale-quantity-limiter-for-woocommerce\/"},"modified":"2026-07-18T14:09:12","modified_gmt":"2026-07-18T14:09:12","slug":"vivid-sale-quantity-limiter-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/vivid-sale-quantity-limiter-for-woocommerce\/","author":20890934,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.4","stable_tag":"1.2.4","tested":"7.0.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Vivid - Sale Quantity Limiter for WooCommerce","header_author":"Drickles","header_description":"Cap how many units of a product sell at the WooCommerce sale price. Set an allocation (e.g. 3), and once that many units have been sold \u2014 via a WooCommerce order OR an external stock sync (inventory tools, POS systems, etc.) \u2014 the sale price is automatically removed and the product reverts to regular price, even if more physical stock remains.","assets_banners_color":"ffffff","last_updated":"2026-07-18 14:09:12","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/Drickles1\/wc-limited-sale-quantity","header_author_uri":"https:\/\/github.com\/Drickles1","rating":0,"author_block_rating":0,"active_installs":0,"downloads":50,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.4":{"tag":"1.2.4","author":"drickles","date":"2026-07-18 14:09:12"}},"upgrade_notice":{"1.2.1":"<p>Renamed from &quot;Limited Sale Quantity for WooCommerce&quot; for wordpress.org&#039;s plugin naming guidelines. No functional changes.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3613104,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3613104,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3613104,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3613104,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.4"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The Sale Quantity Allocation field and \"Start new limited-sale batch now\" checkbox in the WooCommerce product Pricing tab."}},"plugin_section":[],"plugin_tags":[331,6601,5447,12448,286],"plugin_category":[45],"plugin_contributors":[272200],"plugin_business_model":[],"class_list":["post-338557","plugin","type-plugin","status-publish","hentry","plugin_tags-discount","plugin_tags-inventory","plugin_tags-sale","plugin_tags-stock","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-drickles","plugin_committers-drickles"],"banners":{"banner":"https:\/\/ps.w.org\/vivid-sale-quantity-limiter-for-woocommerce\/assets\/banner-772x250.png?rev=3613104","banner_2x":"https:\/\/ps.w.org\/vivid-sale-quantity-limiter-for-woocommerce\/assets\/banner-1544x500.png?rev=3613104","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/vivid-sale-quantity-limiter-for-woocommerce\/assets\/icon-128x128.png?rev=3613104","icon_2x":"https:\/\/ps.w.org\/vivid-sale-quantity-limiter-for-woocommerce\/assets\/icon-256x256.png?rev=3613104","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>WooCommerce lets you set a sale price and, optionally, a schedule for when it starts and ends. But there's no built-in way to say \"I have 20 of this in stock, but I only want to discount the first 3 sold \u2014 after that, back to full price.\"<\/p>\n\n<p>Without a quantity cap, a sale price with no end date just keeps selling at that price indefinitely, or until someone remembers to remove it by hand.<\/p>\n\n<p>This plugin adds that missing piece: a <strong>Sale Quantity Allocation<\/strong> field. Set it to 3, and the moment 3 units have sold \u2014 from a real WooCommerce order, a stock reduction from an external inventory sync, a POS system, or a manual edit \u2014 the sale price is cleared automatically. The product reverts to its regular price for real (the underlying sale price field is cleared), not just a display trick.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Quantity-limited sales \u2014 set a max number of units to sell at the discounted price, independent of total stock.<\/li>\n<li>Source-agnostic tracking \u2014 works whether stock drops from a checkout, a manual wp-admin edit, or any external system updating stock via the REST API.<\/li>\n<li>\"Only N left at this price!\" badge shown automatically on the product page and shop loop while the allocation is still active.<\/li>\n<li>Manual re-arming only \u2014 once a batch sells out, the sale stays off until you explicitly restart it. Restocking alone does not silently reactivate a sale.<\/li>\n<li>Works on simple and variable products.<\/li>\n<\/ul>\n\n<h4>How to run a limited sale<\/h4>\n\n<ol>\n<li>Set a Sale price (and optionally a sale schedule) as you normally would in WooCommerce.<\/li>\n<li>Enter a number in Sale Quantity Allocation (e.g. 3).<\/li>\n<li>Tick \"Start new limited-sale batch now\".<\/li>\n<li>Save\/update the product.<\/li>\n<\/ol>\n\n<p>From this point, the plugin watches the product's stock quantity. Every unit sold (by any means) counts against the allocation. When the allocation reaches 0, the sale price and any sale schedule dates are cleared automatically.<\/p>\n\n<p>To restart a batch later (e.g. after restocking), re-enter the allocation number, tick the checkbox again, and save. This is deliberate: the allocation field is pre-filled with its last value and would otherwise resubmit on any unrelated product save, so the checkbox is what makes \"manual re-arm only\" actually manual.<\/p>\n\n<h4>Source<\/h4>\n\n<p>Development happens on GitHub: https:\/\/github.com\/Drickles1\/wc-limited-sale-quantity<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/vivid-sale-quantity-limiter-for-woocommerce\/<\/code>, or install directly through the WordPress plugins screen.<\/li>\n<li>Activate the plugin through the 'Plugins' screen in WordPress.<\/li>\n<li>Make sure WooCommerce is installed and active.<\/li>\n<li>Edit any product and look for the new fields in the Pricing section of the General tab (or per-variation for variable products).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20work%20with%20variable%20products%3F\"><h3>Does this work with variable products?<\/h3><\/dt>\n<dd><p>Yes. The allocation field and arm checkbox are available per-variation as well as on simple products. The \"Only N left\" frontend badge is proven for simple products; on variable products it reflects whichever variation WooCommerce's own template has in scope, since WooCommerce swaps variation data via AJAX without re-running this plugin's PHP per variation.<\/p><\/dd>\n<dt id=\"what%20counts%20as%20a%20%22sale%22%3F\"><h3>What counts as a \"sale\"?<\/h3><\/dt>\n<dd><p>Any WooCommerce stock reduction \u2014 a paid order, a manual wp-admin stock edit, or an external system (inventory management tools, POS systems, etc.) updating stock via the REST API \u2014 counts against the allocation.<\/p><\/dd>\n<dt id=\"why%20do%20i%20have%20to%20check%20a%20box%20to%20restart%20a%20sale%20instead%20of%20just%20re-entering%20the%20number%3F\"><h3>Why do I have to check a box to restart a sale instead of just re-entering the number?<\/h3><\/dt>\n<dd><p>Because the allocation field is pre-filled with its current value, it resubmits on every product save regardless of whether you touched it. Requiring an explicit checkbox is the only way to guarantee a routine, unrelated edit (like fixing a typo in the description) can never silently reactivate a sale that already sold out.<\/p><\/dd>\n<dt id=\"can%20i%20set%20the%20allocation%20programmatically%3F\"><h3>Can I set the allocation programmatically?<\/h3><\/dt>\n<dd><p>The fields are wp-admin\/UI only for now. The underlying values are plain post meta (<code>_lsqw_sale_qty_allocation<\/code>, <code>_lsqw_sale_qty_remaining<\/code>, <code>_lsqw_sale_qty_last_seen_stock<\/code>) and can be read or written directly if needed.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>Added explicit nonce verification in the allocation-saving handlers (defense-in-depth; these hooks already only fire after WooCommerce's own nonce checks pass, but the check is now also explicit and self-contained here).<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Text Domain now matches the wordpress.org-assigned slug, vivid-sale-quantity-limiter-for-woocommerce.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fixed the release zip not including readme.txt (required for wordpress.org submission).<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Renamed to Vivid - Sale Quantity Limiter for WooCommerce ahead of public release.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added a graceful admin notice (instead of a fatal error) if WooCommerce isn't active.<\/li>\n<li>Added the <code>Requires Plugins: woocommerce<\/code> header.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added an explicit \"Start new limited-sale batch now\" checkbox so a routine, unrelated product save can never silently re-arm a depleted allocation.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Cap how many units of a product sell at the WooCommerce sale price, then automatically revert to regular price once that many are gone.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/338557","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=338557"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/drickles"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=338557"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=338557"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=338557"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=338557"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=338557"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=338557"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}