{"id":288337,"date":"2026-03-14T19:47:23","date_gmt":"2026-03-14T19:47:23","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/beltoft-in-stock-notifier-for-woocommerce\/"},"modified":"2026-04-13T13:03:13","modified_gmt":"2026-04-13T13:03:13","slug":"beltoft-in-stock-notifier","status":"publish","type":"plugin","link":"https:\/\/es-mx.wordpress.org\/plugins\/beltoft-in-stock-notifier\/","author":23461136,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.1","stable_tag":"1.2.1","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Beltoft In-Stock Notifier for WooCommerce","header_author":"beltoft.net","header_description":"Let customers subscribe to out-of-stock product notifications and automatically email them when items are back in stock.","assets_banners_color":"","last_updated":"2026-04-13 13:03:13","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/beltoft-in-stock-notifier\/","header_author_uri":"https:\/\/beltoft.net","rating":5,"author_block_rating":0,"active_installs":0,"downloads":382,"num_ratings":1,"support_threads":1,"support_threads_resolved":1,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.0":{"tag":"1.1.0","author":"beltoftnet","date":"2026-03-14 19:46:50"},"1.1.1":{"tag":"1.1.1","author":"beltoftnet","date":"2026-03-25 22:33:03"},"1.2.0":{"tag":"1.2.0","author":"beltoftnet","date":"2026-03-27 18:01:37"},"1.2.1":{"tag":"1.2.1","author":"beltoftnet","date":"2026-04-13 13:03:13"}},"upgrade_notice":{"1.0.8":"<p>Security and reliability improvements: logging moved to WooCommerce logger, notification queue now uses Action Scheduler, rate-limit index added.<\/p>","1.0.7":"<p>Notifications now use WooCommerce email templates. New manual send button and admin improvements.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.0","1.1.1","1.2.0","1.2.1"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Subscription form on an out-of-stock product page.","2":"Admin dashboard with stats and top products.","3":"Subscription management with filters and bulk actions.","4":"Settings page.","5":"Back In Stock email in WooCommerce email settings."}},"plugin_section":[],"plugin_tags":[155593,1159,150169,4422,286],"plugin_category":[45],"plugin_contributors":[256640],"plugin_business_model":[],"class_list":["post-288337","plugin","type-plugin","status-publish","hentry","plugin_tags-back-in-stock","plugin_tags-notification","plugin_tags-restock","plugin_tags-waitlist","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-beltoftnet","plugin_committers-beltoftnet"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/beltoft-in-stock-notifier.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Beltoft In-Stock Notifier for WooCommerce adds a subscription form to out-of-stock products so customers can leave their email and get notified when the product is restocked. Emails are sent using WooCommerce's email template so they match your store's design.<\/p>\n\n<h3>Key Features<\/h3>\n\n<ol>\n<li>Subscription form on out-of-stock products \u2014 works with simple, variable, grouped, and external products.<\/li>\n<li>Variable products: form shows\/hides automatically when selecting out-of-stock variations.<\/li>\n<li>Notifications sent via WooCommerce email templates \u2014 same look as your order emails.<\/li>\n<li>Email settings (subject, heading, on\/off) under WooCommerce &gt; Settings &gt; Emails.<\/li>\n<li>Batch sending via Action Scheduler \u2014 handles thousands of subscribers without slowing down.<\/li>\n<li>Detects stock changes from admin, REST API, CLI, and ERP systems.<\/li>\n<li>Admin dashboard with stats and a manual \"Send Notifications\" button per product.<\/li>\n<li>Subscription list with search, filters, pagination, and bulk actions.<\/li>\n<li>One-click unsubscribe link in every email.<\/li>\n<li>Optional GDPR checkbox, honeypot spam protection, and rate limiting.<\/li>\n<li>Shortcode <code>[bisn_form]<\/code> for custom placement.<\/li>\n<li>Activity logging via WooCommerce logger.<\/li>\n<\/ol>\n\n<h3>How It Works<\/h3>\n\n<ol>\n<li>Customer visits an out-of-stock product and enters their email.<\/li>\n<li>When the product comes back in stock, the plugin picks it up via WooCommerce hooks.<\/li>\n<li>Emails are queued and sent in batches \u2014 each one includes the product image, a \"Shop Now\" button, and an unsubscribe link.<\/li>\n<li>Custom hook available for CDN\/Varnish cache purging if needed.<\/li>\n<\/ol>\n\n<h3>Configuration<\/h3>\n\n<h3>Form Placement<\/h3>\n\n<ul>\n<li>The form shows automatically on out-of-stock product pages.<\/li>\n<li>To place it yourself, disable auto-placement in settings and use <code>[bisn_form]<\/code> or <code>[bisn_form product_id=\"123\"]<\/code>.<\/li>\n<\/ul>\n\n<h3>Email Template<\/h3>\n\n<ul>\n<li>Uses WooCommerce's email system \u2014 same header, footer, and colours as your other store emails.<\/li>\n<li>Customise subject, heading, body text, button text, and footer text under WooCommerce &gt; Settings &gt; Emails &gt; Back In Stock.<\/li>\n<li>Use <code>{product_name}<\/code> and <code>{site_title}<\/code> placeholders in any of these fields.<\/li>\n<li>Override the template by copying <code>templates\/emails\/back-in-stock.php<\/code> to your theme's <code>woocommerce\/emails\/<\/code> folder for more complex customisations.<\/li>\n<\/ul>\n\n<h3>Batch Sending<\/h3>\n\n<ul>\n<li>Configurable batch size (default 50) and throttle between emails.<\/li>\n<li>If there are more subscribers than one batch, the next batch runs 60 seconds later.<\/li>\n<li>For low-traffic sites, set up a real system cron for reliable scheduling.<\/li>\n<\/ul>\n\n<h3>Hooks &amp; Filters<\/h3>\n\n<p>Developers can extend the plugin:<\/p>\n\n<ul>\n<li><code>bisn_form_html<\/code> \/ <code>bisn_form_fields<\/code> \/ <code>bisn_form_heading_text<\/code><\/li>\n<li><code>bisn_before_subscription<\/code> \/ <code>bisn_after_subscription<\/code><\/li>\n<li><code>bisn_validate_subscription<\/code><\/li>\n<li><code>bisn_before_notification_sent<\/code> \/ <code>bisn_after_notification_sent<\/code> \/ <code>bisn_after_batch_sent<\/code><\/li>\n<li><code>bisn_stock_status_triggers<\/code> \u2014 customise which statuses trigger notifications (default: instock, onbackorder)<\/li>\n<li><code>bisn_cache_purge_product<\/code> \u2014 fire custom cache purge logic (e.g. Varnish, CDN)<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>beltoft-in-stock-notifier<\/code> folder to <code>\/wp-content\/plugins\/<\/code> or install via the Plugins screen.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to <strong>WooCommerce &gt; In-Stock Notifier<\/strong> to configure.<\/li>\n<li>Optionally adjust the email text under <strong>WooCommerce &gt; Settings &gt; Emails &gt; Back In Stock<\/strong> (body text, button text, footer text).<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20it%20work%20with%20variable%20products%3F\"><h3>Does it work with variable products?<\/h3><\/dt>\n<dd><p>Yes. The form appears when a customer selects an out-of-stock variation. The specific variation is tracked so the notification only sends when that variation is back.<\/p><\/dd>\n<dt id=\"does%20it%20pick%20up%20stock%20changes%20from%20the%20rest%20api%20or%20erps%3F\"><h3>Does it pick up stock changes from the REST API or ERPs?<\/h3><\/dt>\n<dd><p>Yes. It hooks into WooCommerce's core stock events which fire regardless of how stock is updated.<\/p><\/dd>\n<dt id=\"which%20email%20providers%20does%20it%20work%20with%3F\"><h3>Which email providers does it work with?<\/h3><\/dt>\n<dd><p>Any. It sends through WooCommerce's email system which uses <code>wp_mail()<\/code> \u2014 works with SMTP plugins, Amazon SES, SendGrid, etc.<\/p><\/dd>\n<dt id=\"do%20emails%20match%20my%20store%27s%20design%3F\"><h3>Do emails match my store's design?<\/h3><\/dt>\n<dd><p>Yes. They use WooCommerce's email template \u2014 same header, footer, and styling as order emails.<\/p><\/dd>\n<dt id=\"can%20i%20send%20notifications%20manually%3F\"><h3>Can I send notifications manually?<\/h3><\/dt>\n<dd><p>Yes. The Dashboard tab has a \"Send Notifications\" button next to each product.<\/p><\/dd>\n<dt id=\"how%20do%20customers%20unsubscribe%3F\"><h3>How do customers unsubscribe?<\/h3><\/dt>\n<dd><p>Every email has a one-click unsubscribe link. No login needed.<\/p><\/dd>\n<dt id=\"what%20if%20the%20product%20sells%20out%20again%20before%20all%20emails%20go%20out%3F\"><h3>What if the product sells out again before all emails go out?<\/h3><\/dt>\n<dd><p>The sender checks stock before each batch. If the product is out of stock again, remaining emails are skipped.<\/p><\/dd>\n<dt id=\"does%20it%20handle%20cached%20pages%3F\"><h3>Does it handle cached pages?<\/h3><\/dt>\n<dd><p>WooCommerce and popular caching plugins already purge product pages when stock changes. The plugin also fires an <code>bisn_cache_purge_product<\/code> hook if you need custom purge logic (e.g. Varnish or a CDN).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fixed form text (heading, button, messages) not translating via .po files.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added editable email body text, button text, footer text, and unsubscribe link text under WooCommerce &gt; Settings &gt; Emails &gt; Back In Stock.<\/li>\n<li>Added editable form heading text under WooCommerce &gt; In-Stock Notifier &gt; Settings.<\/li>\n<li>All editable email fields support <code>{product_name}<\/code> and <code>{site_title}<\/code> placeholders.<\/li>\n<li>Translations still apply when fields are left at their defaults.<\/li>\n<li>Changed \"Disable Logging\" to \"Enable Logging\" (off by default).<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Added Czech (cs_CZ) translation.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Renamed internal prefix from <code>isn_<\/code> to <code>bisn_<\/code> for WordPress.org compliance.<\/li>\n<li>Moved inline JavaScript to <code>wp_add_inline_script()<\/code> for Content Security Policy compatibility.<\/li>\n<li>Added <code>wp_kses()<\/code> sanitization to the subscription form output.<\/li>\n<\/ul>\n\n<h4>1.0.29<\/h4>\n\n<ul>\n<li>Simplified token generation to use <code>wp_generate_password()<\/code> (no dependency on wp_salt).<\/li>\n<li>Rate limiter now uses REMOTE_ADDR only; X-Forwarded-For requires explicit opt-in via filter.<\/li>\n<li><code>delete_all()<\/code> requires explicit confirmation parameter to prevent accidental data loss.<\/li>\n<li>Product subscriber lookup now shows truncation notice when results exceed limit.<\/li>\n<li>Notification throttle now uses Action Scheduler delay instead of blocking <code>sleep()<\/code>.<\/li>\n<li>Skip redundant subscription check for variations (query parent directly).<\/li>\n<\/ul>\n\n<h4>1.0.28<\/h4>\n\n<ul>\n<li>Added database index on <code>unsubscribe_token<\/code> column for faster token lookups.<\/li>\n<li>Added <code>bisn_email_product_url<\/code> filter to email templates for URL customization.<\/li>\n<li>Added <code>bisn_dashboard_after_stats<\/code> action hook for extending the dashboard.<\/li>\n<li>Added SKU column to the Top Products table on the Dashboard tab.<\/li>\n<\/ul>\n\n<h4>1.0.8<\/h4>\n\n<ul>\n<li>Logging now uses WooCommerce logger (WooCommerce &gt; Status &gt; Logs) \u2014 fixes log file exposure on Nginx\/IIS.<\/li>\n<li>\"Enable Notifications\" setting now fully stops queueing and sending when disabled.<\/li>\n<li>Notification queue replaced with Action Scheduler (bundled with WooCommerce) for atomic, concurrent-safe scheduling.<\/li>\n<li>Added composite index on ip_address + created_at for faster rate-limit queries at scale.<\/li>\n<li>Removed legacy file-based logging and custom log viewer.<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Notifications now use WooCommerce email templates.<\/li>\n<li>Back In Stock email configurable under WooCommerce &gt; Settings &gt; Emails.<\/li>\n<li>Email preview in WooCommerce email settings.<\/li>\n<li>Manual notification trigger from the Dashboard tab.<\/li>\n<li>Variation stock status shown correctly in admin dashboard.<\/li>\n<li>Improved form design (joined email input and button).<\/li>\n<li>Pre-fill email for logged-in users.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Let customers subscribe to out-of-stock product notifications and automatically email them when items are back in stock.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/288337","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=288337"}],"author":[{"embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/beltoftnet"}],"wp:attachment":[{"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=288337"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=288337"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=288337"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=288337"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=288337"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/es-mx.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=288337"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}