{"id":336596,"date":"2026-09-28T13:09:17","date_gmt":"2026-09-28T13:09:17","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/smart-waitlist-for-woocommerce\/"},"modified":"2026-09-28T12:13:09","modified_gmt":"2026-09-28T12:13:09","slug":"smart-waitlist-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/fuc.wordpress.org\/plugins\/smart-waitlist-for-woocommerce\/","author":23519266,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.0.0","stable_tag":"trunk","tested":"7.1.2","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"Smart Waitlist for WooCommerce","header_author":"Abdennour Laoubi","header_description":"Automatically notifies customers via email when out-of-stock products become available again.","assets_banners_color":"","last_updated":"2026-09-28 12:13:09","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/smart-waitlist-for-woocommerce\/","header_author_uri":"https:\/\/profiles.wordpress.org\/abdennourlaoubi\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":33,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":[],"upgrade_notice":{"2.0.0":"<p>Internal identifier rename for WordPress.org compliance (SWW \u2192 SWFWC prefix). All existing data migrates automatically. Max Subscribers per Product is now a free, configurable setting.<\/p>","1.1.2":"<p>Critical compatibility and stability update. Fixes database activation and deactivation hooks, and upgrades double opt-in controls. Highly recommended.<\/p>","1.1.1":"<p>Security and reliability update. Fixes a critical bug where re-subscribing after unsubscribing silently failed to send the confirmation email. Adds GDPR personal data export\/erasure hooks. Upgrades the database schema (adds <code>user_id<\/code> index). Recommended for all users.<\/p>","1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":[],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Waitlist signup form on an out-of-stock product page.","2":"Restock notification email received by a subscriber.","3":"Admin subscribers dashboard with search, filters, and bulk actions.","4":"Waitlist panel on the product edit page.","5":"Plugin settings page (WooCommerce \u2192 Settings \u2192 Products \u2192 Waitlist)."}},"plugin_section":[],"plugin_tags":[155593,916,4423,4422,286],"plugin_category":[45],"plugin_contributors":[283182],"plugin_business_model":[],"class_list":["post-336596","plugin","type-plugin","status-publish","hentry","plugin_tags-back-in-stock","plugin_tags-notify","plugin_tags-out-of-stock","plugin_tags-waitlist","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-abdennourlaoubi","plugin_committers-abdennourlaoubi"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/smart-waitlist-for-woocommerce.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Smart Waitlist for WooCommerce<\/strong> automatically notifies customers when an out-of-stock product is back in stock.<\/p>\n\n<p>When a product runs out of stock, a \"Notify Me When Available\" form appears on the product page. Customers enter their name and email to join the waitlist. The moment you restock the product, every pending subscriber receives a personalized notification email \u2014 automatically.<\/p>\n\n<h4>Core Features<\/h4>\n\n<ul>\n<li><strong>Automatic restock detection<\/strong> \u2014 hooks directly into WooCommerce stock management; no manual steps required.<\/li>\n<li><strong>Variable product support<\/strong> \u2014 per-variation waitlists, so customers subscribe to the exact variant they want.<\/li>\n<li><strong>Double opt-in support<\/strong> \u2014 require email confirmation before users are added to the waitlist (now a core free feature).<\/li>\n<li><strong>Smart form display<\/strong> \u2014 form appears only on out-of-stock products; hidden when stock is available.<\/li>\n<li><strong>Duplicate prevention<\/strong> \u2014 customers cannot accidentally subscribe twice.<\/li>\n<li><strong>Honeypot spam protection<\/strong> \u2014 invisible field blocks automated spam submissions.<\/li>\n<li><strong>HMAC-signed unsubscribe links<\/strong> \u2014 every notification email contains a secure, one-click unsubscribe link.<\/li>\n<li><strong>Batch notifications<\/strong> \u2014 large waitlists are processed in background batches via WP-Cron to avoid timeouts.<\/li>\n<li><strong>Admin dashboard<\/strong> \u2014 searchable, filterable, sortable subscriber list with bulk actions (delete, mark as notified).<\/li>\n<li><strong>Per-product settings<\/strong> \u2014 enable or disable the waitlist individually for any product.<\/li>\n<li><strong>Waitlist capacity limits<\/strong> \u2014 optionally cap the number of subscribers per product (or per variation) to control stock flow.<\/li>\n<li><strong>WooCommerce Settings integration<\/strong> \u2014 configure waitlist emails under WooCommerce &gt; Settings &gt; Emails and waitlist behavior under WooCommerce &gt; Settings &gt; Products &gt; Waitlist.<\/li>\n<li><strong>Theme-overridable templates<\/strong> \u2014 copy templates to your theme for complete HTML customisation.<\/li>\n<li><strong>GDPR tools<\/strong> \u2014 personal data export and erasure via WordPress Privacy Tools (Tools \u2192 Erase Personal Data).<\/li>\n<li><strong>Developer-friendly<\/strong> \u2014 action and filter hooks throughout; documented phpdoc on every method.<\/li>\n<li><strong>WPCS-compliant<\/strong> \u2014 all database queries use <code>$wpdb-&gt;prepare()<\/code>; all output is escaped; nonces on every form.<\/li>\n<li><strong>HPOS compatible<\/strong> \u2014 declared compatible with WooCommerce High-Performance Order Storage.<\/li>\n<\/ul>\n\n<h4>Pro Version<\/h4>\n\n<p>Upgrade to the Pro Version (available at https:\/\/payhip.com\/b\/aH2Oq ) for advanced features:<\/p>\n\n<ul>\n<li>WhatsApp Business API notifications<\/li>\n<li>Coupon-with-notification (send discount codes alongside the restock alert)<\/li>\n<\/ul>\n\n<h4>Privacy<\/h4>\n\n<p>This plugin stores subscriber names, email addresses, and optionally phone numbers in a dedicated database table (<code>{prefix}swfwc_waitlist<\/code>). Data is retained until manually deleted by the site administrator or until the subscriber unsubscribes. No data is shared with third parties. Plugin data is fully removed on uninstall.<\/p>\n\n<p>Personal data can be exported and erased via <strong>Tools \u2192 Erase Personal Data<\/strong> in compliance with GDPR Article 17 and Article 20.<\/p>\n\n<p>Consider updating your site's Privacy Policy to reflect this data collection.<\/p>\n\n<h3>Email Setup Guide<\/h3>\n\n<h4>Email Configuration<\/h4>\n\n<ol>\n<li>Configure a reliable SMTP or transactional email plugin first.<\/li>\n<li>Send a test email from the SMTP plugin and confirm it arrives.<\/li>\n<li>Go to <strong>WooCommerce \u2192 Settings \u2192 Emails<\/strong>.<\/li>\n<li>Enable and review <strong>Waitlist Signup Confirmation<\/strong>.<\/li>\n<li>Enable and review <strong>Waitlist Restock Notification<\/strong>.<\/li>\n<li>Test the waitlist flow with one out-of-stock product and one real email address.<\/li>\n<\/ol>\n\n<h4>Email Production Checklist<\/h4>\n\n<ul>\n<li>SMTP or transactional email test succeeds.<\/li>\n<li>SPF, DKIM, and DMARC are configured for the sending domain.<\/li>\n<li>Signup confirmation email arrives.<\/li>\n<li>Restock notification email arrives after stock changes to <code>instock<\/code>.<\/li>\n<li>Unsubscribe links work.<\/li>\n<li>Emails are not consistently landing in spam.<\/li>\n<\/ul>\n\n<h4>Pro Version Features Setup<\/h4>\n\n<p>If you upgrade to the Pro version, you will get access to:\n* <strong>WhatsApp Cloud API Integration<\/strong> for template-based restock messages.\n* <strong>Auto-generated WooCommerce Coupons<\/strong> sent directly inside email alerts.<\/p>\n\n<h3>License<\/h3>\n\n<p>Smart Waitlist for WooCommerce is free software: you can redistribute it and\/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or any later version.<\/p>\n\n<p>Smart Waitlist for WooCommerce is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.<\/p>\n\n<!--section=installation-->\n<h4>Upload Installation<\/h4>\n\n<ol>\n<li>Download the plugin ZIP file.<\/li>\n<li>Log in to your WordPress admin panel.<\/li>\n<li>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>.<\/li>\n<li>Choose the ZIP file and click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<h4>After Activation<\/h4>\n\n<ol>\n<li>Go to <strong>WooCommerce \u2192 Settings \u2192 Products \u2192 Waitlist<\/strong> to configure the plugin.<\/li>\n<li>Review the waitlist emails under <strong>WooCommerce &gt; Settings &gt; Emails<\/strong>.<\/li>\n<li>Customise email subjects, headings, and email types from WooCommerce's email settings.<\/li>\n<li>The waitlist form will automatically appear on any out-of-stock product.<\/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 form appears when a customer selects a specific variation that is out of stock. Subscribers are tracked per variation, so notifications are only sent when that exact variation comes back in stock.<\/p><\/dd>\n<dt id=\"can%20i%20customise%20the%20form%20appearance%3F\"><h3>Can I customise the form appearance?<\/h3><\/dt>\n<dd><p>Yes. Copy <code>templates\/notify-form.php<\/code> from the plugin folder to <code>{your-theme}\/smart-waitlist-for-woocommerce\/notify-form.php<\/code> and modify it freely. CSS custom properties in <code>public\/css\/swfwc-public.css<\/code> make colour\/spacing changes easy without overriding templates.<\/p><\/dd>\n<dt id=\"can%20i%20customise%20the%20notification%20email%3F\"><h3>Can I customise the notification email?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>WooCommerce &gt; Settings &gt; Emails<\/strong> and update the waitlist email subjects, headings, and email types. You can also customise the HTML template by copying <code>templates\/emails\/email-notification.php<\/code> to your theme.<\/p><\/dd>\n<dt id=\"what%20merge%20tags%20are%20available%20in%20the%20email%3F\"><h3>What merge tags are available in the email?<\/h3><\/dt>\n<dd><p>{product_name}, <code>{product_url}<\/code>, <code>{customer_name}<\/code>, <code>{site_name}<\/code>, <code>{unsubscribe_url}<\/code><\/p><\/dd>\n<dt id=\"how%20do%20customers%20unsubscribe%3F\"><h3>How do customers unsubscribe?<\/h3><\/dt>\n<dd><p>Every notification email contains a signed unsubscribe link. Clicking it marks the subscriber as unsubscribed immediately \u2014 no login required.<\/p><\/dd>\n<dt id=\"is%20the%20unsubscribe%20link%20secure%3F\"><h3>Is the unsubscribe link secure?<\/h3><\/dt>\n<dd><p>Yes. Each link contains an HMAC-SHA256 token signed with your site's WordPress auth salt. Tokens expire after 90 days and cannot be guessed or forged.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%20hpos%3F\"><h3>Does it work with WooCommerce HPOS?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares compatibility with WooCommerce High-Performance Order Storage (HPOS \/ custom order tables).<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20have%20thousands%20of%20subscribers%3F\"><h3>What happens if I have thousands of subscribers?<\/h3><\/dt>\n<dd><p>For waitlists with more than 50 subscribers, notifications are automatically queued in batches of 25 via WP-Cron, with 30 seconds between batches. This prevents PHP timeouts and server overload.<\/p><\/dd>\n<dt id=\"will%20my%20data%20be%20deleted%20if%20i%20uninstall%20the%20plugin%3F\"><h3>Will my data be deleted if I uninstall the plugin?<\/h3><\/dt>\n<dd><p>Yes. The uninstall routine drops the <code>swfwc_waitlist<\/code> table and removes all plugin options. This action is irreversible.<\/p><\/dd>\n<dt id=\"can%20i%20disable%20the%20waitlist%20for%20specific%20products%3F\"><h3>Can I disable the waitlist for specific products?<\/h3><\/dt>\n<dd><p>Yes. Each product has a \"Waitlist\" meta box in the product editor where you can set it to Enabled, Disabled, or \"Inherit global setting\".<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20support%20gdpr%20right-to-erasure%20requests%3F\"><h3>Does the plugin support GDPR right-to-erasure requests?<\/h3><\/dt>\n<dd><p>Yes. The plugin integrates with WordPress Privacy Tools (Tools \u2192 Erase Personal Data). Submitting an erasure request for a customer's email will permanently delete all their waitlist records.<\/p><\/dd>\n<dt id=\"can%20i%20limit%20how%20many%20people%20join%20a%20single%20product%27s%20waitlist%3F\"><h3>Can I limit how many people join a single product's waitlist?<\/h3><\/dt>\n<dd><p>Yes. Go to <strong>WooCommerce \u2192 Settings \u2192 Products \u2192 Waitlist<\/strong> and set <strong>Max Subscribers per Product<\/strong>. Leave it at <code>0<\/code> for unlimited (the default).<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20plugin%20behind%20a%20reverse%20proxy%20or%20load%20balancer%3F\"><h3>Can I use the plugin behind a reverse proxy or load balancer?<\/h3><\/dt>\n<dd><p>Yes. Define your trusted proxy IP addresses using the <code>swfwc_trusted_proxy_ips<\/code> filter or the <code>SWFWC_TRUSTED_PROXY_IPS<\/code> constant, and the plugin will correctly identify real client IPs from the <code>X-Forwarded-For<\/code> header. Without this configuration the direct connection IP is used, which is the safe default.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.0<\/h4>\n\n<ul>\n<li><strong>Breaking (internal only):<\/strong> Renamed every internal identifier \u2014 classes, functions, hooks, options, the custom database table, post meta, cron hooks, nonces, and asset handles \u2014 from the \"SWW\"\/\"sww_\" prefix to \"SWFWC\"\/\"swfwc_\". The old prefix was too short and collision-prone for the WordPress.org Plugin Directory. A one-time, automatic migration preserves all existing waitlist data, settings, and per-product toggles on upgrade; no action needed.<\/li>\n<li>Fix: \"Max Subscribers per Product\" is now a free, fully configurable setting under WooCommerce \u2192 Settings \u2192 Products \u2192 Waitlist. The subscriber-cap enforcement was already active in the free plugin; only the control to configure it was previously (incorrectly) hidden.<\/li>\n<li>Fix: Removed all inline <code>&lt;style&gt;<\/code>\/<code>&lt;script&gt;<\/code> blocks from PHP templates. CSS moved into <code>admin\/css\/swfwc-admin.css<\/code>; JS moved into <code>admin\/js\/swfwc-admin.js<\/code> using <code>wp_localize_script()<\/code> for nonces\/strings.<\/li>\n<li>Fix: Plain-text double opt-in confirmation email now escapes the confirmation link with <code>esc_url()<\/code> instead of <code>esc_url_raw()<\/code> at the point of output.<\/li>\n<li>Fix: Corrected Plugin URI and Author URI to resolve correctly; corrected the readme Contributors field.<\/li>\n<li>Fix: Added <code>Requires Plugins: woocommerce<\/code> header plus a defensive activation-time WooCommerce check for older WordPress versions.<\/li>\n<li>Housekeeping: Text domain corrected to <code>smart-waitlist-for-woocommerce<\/code> (matching the plugin slug) throughout.<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Critical fix: Bulk status updates now pass dynamic parameters to <code>$wpdb-&gt;prepare()<\/code> with variadic binding, restoring bulk mark-as-notified compatibility.<\/li>\n<li>Email: Double opt-in confirmation now uses a dedicated WooCommerce email class with HTML\/plain-text templates and WooCommerce Settings &gt; Emails controls.<\/li>\n<li>Cleanup: Removed legacy Gumroad license code and Pro features to focus on a lightweight freemium-first build.<\/li>\n<li>Fix: Addressed casing issues in activation and deactivation hooks.<\/li>\n<li>Documentation: Updated plugin version and compatibility metadata.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Security: Rate limiter now only trusts X-Forwarded-For headers from configured trusted proxy IPs (SEC-02).<\/li>\n<li>Security: Removed <code>SWFWC_get_pending_subscribers_extra_where<\/code> filter to eliminate SQL injection surface (SEC-01). Replaced with typed <code>$confirmed_only<\/code> boolean parameter.<\/li>\n<li>Security: Unsubscribe tokens now include a 90-day expiry timestamp with backwards compatibility for existing tokens (SEC-06).<\/li>\n<li>Bug fix: Re-subscribing after unsubscribing no longer silently fails to send the confirmation email. MySQL's <code>insert_id=0<\/code> on <code>ON DUPLICATE KEY UPDATE<\/code> is now handled by re-fetching the row ID (BUG-01).<\/li>\n<li>Performance: Removed blocking <code>sleep()<\/code> call inside the WhatsApp cron worker. Retries are now scheduled as async events to avoid blocking the cron queue (PERF-01).<\/li>\n<li>Performance: Batch processing now fetches all subscriber rows in a single <code>IN()<\/code> query instead of N individual SELECTs (BUG-02).<\/li>\n<li>Performance: Admin list table status counts now use a single <code>GROUP BY<\/code> query instead of four separate <code>COUNT(*)<\/code> queries (WC-04).<\/li>\n<li>Reliability: Notification lock transient prevents duplicate batches when the stock-change hook fires more than once in quick succession (WC-01).<\/li>\n<li>Database: Added <code>user_id<\/code> index to <code>swfwc_waitlist<\/code> table schema (DB-01).<\/li>\n<li>Database: <code>delete_by_product()<\/code> now busts caches for all variation IDs, not only variation 0 (DB-04).<\/li>\n<li>GDPR: Added personal data exporter (<code>wp_privacy_personal_data_exporters<\/code>) hook for data portability compliance.<\/li>\n<li>GDPR: Added personal data eraser (<code>wp_privacy_personal_data_erasers<\/code>) hook for right-to-erasure compliance.<\/li>\n<li>GDPR: Added optional GDPR consent checkbox (disabled by default; enable via <code>SWFWC_show_consent_checkbox<\/code> filter).<\/li>\n<li>GDPR: Privacy policy URL appended to form privacy note via <code>wp_get_privacy_policy_url()<\/code>.<\/li>\n<li>Architecture: <code>SWFWC_Email_Confirmation<\/code> now accepts <code>SWFWC_Database<\/code> via constructor, restoring the DI contract (ARCH-01).<\/li>\n<li>Architecture: Button position option is now read at render-time instead of at hook-registration time (ARCH-02).<\/li>\n<li>Architecture: Singleton <code>__clone()<\/code> now throws an exception instead of silently succeeding (ARCH-03).<\/li>\n<li>Compatibility: Bumped DB schema version to 1.2.0 to trigger <code>dbDelta<\/code> on existing installs for the new index.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Core waitlist functionality: subscribe, notify on restock, unsubscribe via link.<\/li>\n<li>Variable product \/ variation support.<\/li>\n<li>Admin dashboard with WP_List_Table (search, filter, bulk actions).<\/li>\n<li>WooCommerce email class integration.<\/li>\n<li>Async batch processing via WP-Cron.<\/li>\n<li>HMAC-signed unsubscribe URLs.<\/li>\n<li>Honeypot spam protection.<\/li>\n<li>WooCommerce HPOS compatibility declaration.<\/li>\n<li>Theme-overridable templates.<\/li>\n<li>Full uninstall cleanup.<\/li>\n<\/ul>","raw_excerpt":"Let customers join a waitlist for out-of-stock products and receive automatic email notifications when stock is restored.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/336596","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=336596"}],"author":[{"embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/abdennourlaoubi"}],"wp:attachment":[{"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=336596"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=336596"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=336596"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=336596"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=336596"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fuc.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=336596"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}