{"id":309015,"date":"2026-05-11T05:47:31","date_gmt":"2026-05-11T05:47:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/wt-waitlist\/"},"modified":"2026-05-21T06:21:51","modified_gmt":"2026-05-21T06:21:51","slug":"wt-waitlist","status":"publish","type":"plugin","link":"https:\/\/az.wordpress.org\/plugins\/wt-waitlist\/","author":23487023,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.4","stable_tag":"1.0.4","tested":"7.0","requires":"6.0","requires_php":"8.0","requires_plugins":null,"header_name":"WT Waitlist","header_author":"webmasters.team","header_description":"Lightweight back-in-stock waitlist for WooCommerce \u2014 automatic email notifications when an out-of-stock product (or variation) returns.","assets_banners_color":"ae2f4a","last_updated":"2026-05-21 06:21:51","external_support_url":"","external_repository_url":"","donate_link":"https:\/\/webmasters.team\/","header_plugin_uri":"https:\/\/webmasters.team\/en\/plugins\/wt-waitlist\/","header_author_uri":"https:\/\/webmasters.team","rating":0,"author_block_rating":0,"active_installs":0,"downloads":143,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.1":{"tag":"1.0.1","author":"webmastersteam","date":"2026-05-11 05:47:12"},"1.0.2":{"tag":"1.0.2","author":"webmastersteam","date":"2026-05-18 07:51:54"},"1.0.3":{"tag":"1.0.3","author":"webmastersteam","date":"2026-05-19 11:35:28"},"1.0.4":{"tag":"1.0.4","author":"webmastersteam","date":"2026-05-21 06:21:51"}},"upgrade_notice":{"1.0.4":"<p>Fixes the form rendering twice and the form not appearing on out-of-stock variable products. Adds editable form text. Recommended for all users on 1.0.3.<\/p>","1.0.3":"<p>Critical fix \u2014 signup form is now rendered for products on backorder (previously skipped), plus extra rendering layers for Flatsome \/ Avada \/ Enfold \/ Porto themes, sample-OOS-products diagnostics and full English UI. Strongly recommended upgrade.<\/p>","1.0.2":"<p>Adds a System Status panel and a Send-test-email button to Settings \u2014 much easier to troubleshoot &quot;form does not appear&quot; or &quot;emails not arriving&quot; without leaving WP Admin.<\/p>","1.0.1":"<p>Compliance fix for the unsubscribe page styling. No behavior changes.<\/p>","1.0.0":"<p>First public release. Requires WooCommerce \u2265 7.0 and PHP 8.0+.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3528253,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3528253,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3528253,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3528253,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.1","1.0.2","1.0.3","1.0.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3528253,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3528253,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3528253,"resolution":"3","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"Waitlist form on a WooCommerce out-of-stock product page.","2":"Subscriber management screen in the admin with filters, statuses and CSV export.","3":"Notification email delivered when the product is back in stock."}},"plugin_section":[],"plugin_tags":[155593,4906,259748,4422,286],"plugin_category":[45],"plugin_contributors":[261801],"plugin_business_model":[],"class_list":["post-309015","plugin","type-plugin","status-publish","hentry","plugin_tags-back-in-stock","plugin_tags-notifications","plugin_tags-stock-notifier","plugin_tags-waitlist","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-webmastersteam","plugin_committers-webmastersteam"],"banners":{"banner":"https:\/\/ps.w.org\/wt-waitlist\/assets\/banner-772x250.png?rev=3528253","banner_2x":"https:\/\/ps.w.org\/wt-waitlist\/assets\/banner-1544x500.png?rev=3528253","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wt-waitlist\/assets\/icon-128x128.png?rev=3528253","icon_2x":"https:\/\/ps.w.org\/wt-waitlist\/assets\/icon-256x256.png?rev=3528253","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wt-waitlist\/assets\/screenshot-1.png?rev=3528253","caption":"Waitlist form on a WooCommerce out-of-stock product page."},{"src":"https:\/\/ps.w.org\/wt-waitlist\/assets\/screenshot-2.png?rev=3528253","caption":"Subscriber management screen in the admin with filters, statuses and CSV export."},{"src":"https:\/\/ps.w.org\/wt-waitlist\/assets\/screenshot-3.png?rev=3528253","caption":"Notification email delivered when the product is back in stock."}],"raw_content":"<!--section=description-->\n<p><strong>WT Waitlist<\/strong> is a \"back in stock\" waitlist for WooCommerce without bloat. Customers leave their email on an out-of-stock product page, and when the stock returns \u2014 the plugin sends a notification in the background through Action Scheduler.<\/p>\n\n<p>Built by the <a href=\"https:\/\/webmasters.team\">webmasters.team<\/a> team. Open-source code, no external APIs, all data stored locally in the WordPress database.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Signup form replaces Add to cart<\/strong> for out-of-stock products, with variation support (per size\/color).<\/li>\n<li><strong>Custom database tables<\/strong> (<code>{prefix}_waitlist_subscriptions<\/code>) \u2014 we do not clutter <code>wp_postmeta<\/code>, the plugin scales to tens of thousands of subscriptions.<\/li>\n<li><strong>Action Scheduler queue<\/strong> (bundled with WooCommerce): batch of 50 emails per tick, automatic retries, retry log visible in <code>WooCommerce \u2192 Status \u2192 Scheduled Actions<\/code>.<\/li>\n<li><strong>5 min throttle<\/strong> per product \u2014 prevents duplicate sends when multiple hooks fire (e.g. quantity change followed by status change).<\/li>\n<li><strong>One-click unsubscribe<\/strong> via a link in the email (SHA-256 token), no confirmation or login required.<\/li>\n<li><strong>GDPR-ready<\/strong>: consent logging (anonymized IP, timestamp, user agent), integration with WordPress Privacy Tools (export and erasure of data per email).<\/li>\n<li><strong>CSV export<\/strong> of subscribers from the admin panel (streamed, no timeouts on large lists).<\/li>\n<li><strong>Anti-spam<\/strong>: honeypot plus rate limiter per IP (10 submissions per hour).<\/li>\n<li><strong>Theme compatibility<\/strong>: classic themes (Storefront, Twenty Twenty-One\/Two\/Three) plus block themes (Twenty Twenty-Four\/Five) \u2014 the form attaches through a hook for classic templates and through a <code>render_block<\/code> filter for FSE.<\/li>\n<li><strong>Zero external dependencies<\/strong>: apart from WooCommerce, requires only plain PHP 8.0+.<\/li>\n<\/ul>\n\n<h4>Shortcode fallback<\/h4>\n\n<pre><code>[wt_waitlist product_id=\"123\"] \u2014 use this if your custom product template does not fire the standard hooks.\n<\/code><\/pre>\n\n<h4>What WT Waitlist does NOT do (by design)<\/h4>\n\n<ul>\n<li>No SMS, no Mailchimp\/MailerLite integrations in the free version.<\/li>\n<li>No double opt-in (minimal flow \u2014 leave email, get notification).<\/li>\n<li>No WYSIWYG editor for email templates (HTML template lives in the plugin file, override with the <code>wt_waitlist\/notification_context<\/code> filter).<\/li>\n<\/ul>\n\n<p>These features are planned for the Pro edition. The free edition covers 100% of the core waitlist flow.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce (required).<\/li>\n<li>Install <strong>WT Waitlist<\/strong> via WP Admin \u2192 Plugins \u2192 Add new, or manually over FTP (folder <code>wt-waitlist<\/code> in <code>wp-content\/plugins\/<\/code>).<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open the <strong>WT Waitlist<\/strong> menu in the admin panel and configure data retention plus the administrator notification email address.<\/li>\n<\/ol>\n\n<p>On first activation the plugin creates its database tables and schedules a daily job that purges old subscriptions.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20does%20the%20form%20appear%20on%20the%20product%20page%3F\"><h3>How does the form appear on the product page?<\/h3><\/dt>\n<dd><p>Automatically \u2014 the plugin hooks into the standard WooCommerce action (<code>woocommerce_single_product_summary<\/code>) for classic themes and into the <code>render_block<\/code> filter for block themes (FSE). The form is shown only when the product is out of stock.<\/p><\/dd>\n<dt id=\"what%20if%20my%20theme%20or%20template%20does%20not%20fire%20woocommerce%20hooks%3F\"><h3>What if my theme or template does not fire WooCommerce hooks?<\/h3><\/dt>\n<dd><p>Use the shortcode <code>[wt_waitlist product_id=\"123\"]<\/code> \u2014 it works everywhere, from page builders to custom single product templates.<\/p><\/dd>\n<dt id=\"how%20many%20emails%20are%20sent%20at%20once%3F\"><h3>How many emails are sent at once?<\/h3><\/dt>\n<dd><p>Action Scheduler processes batches of 50 subscribers per tick. For a product with 1000 subscribers we queue 20 batches, each processed asynchronously, without blocking the PHP request.<\/p><\/dd>\n<dt id=\"do%20emails%20go%20through%20my%20wp%20mail%20configuration%3F\"><h3>Do emails go through my WP Mail configuration?<\/h3><\/dt>\n<dd><p>Yes. We use <code>wp_mail()<\/code> \u2014 if you have WP Mail SMTP, SendGrid, Amazon SES etc. configured, the mail travels through them. The plugin does not hardcode any provider.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20the%20data%20after%20uninstalling%20the%20plugin%3F\"><h3>What happens to the data after uninstalling the plugin?<\/h3><\/dt>\n<dd><p>The <code>uninstall.php<\/code> file drops the tables and deletes the options. Clean. If you deactivate without deleting, the data stays \u2014 you can reactivate without losing subscriptions.<\/p><\/dd>\n<dt id=\"gdpr%20compliance%3F\"><h3>GDPR compliance?<\/h3><\/dt>\n<dd><p>The plugin stores anonymized IPs (last octet zeroed), consent timestamp and user agent. It integrates with WordPress Privacy Tools \u2014 a customer can request data export or deletion through the standard WordPress flow.<\/p><\/dd>\n<dt id=\"the%20signup%20form%20does%20not%20appear%20on%20my%20product%20page.%20what%20now%3F\"><h3>The signup form does not appear on my product page. What now?<\/h3><\/dt>\n<dd><p>First check whether the product is actually out of stock \u2014 the form replaces the <strong>Add to cart<\/strong> button only when stock is zero (or the variation is unavailable). If the product is out of stock and the form still does not appear, your theme likely uses a custom single-product template that bypasses the standard WooCommerce hooks. Drop the shortcode <code>[wt_waitlist product_id=\"123\"]<\/code> directly into the product description or template. The shortcode also works inside page builders (Elementor, Bricks, Divi).<\/p><\/dd>\n<dt id=\"customers%20submit%20the%20form%20but%20no%20notification%20email%20arrives.\"><h3>Customers submit the form but no notification email arrives.<\/h3><\/dt>\n<dd><p>Open <strong>WT Waitlist \u2192 Settings<\/strong> and click <strong>Send test email to admin<\/strong>. If the test email arrives \u2014 <code>wp_mail()<\/code> works and notifications will be delivered as soon as the product returns to stock (give Action Scheduler 1\u20132 minutes to process the batch). If the test email does <strong>not<\/strong> arrive, the problem is on your mail pipeline, not on the plugin. Install the free <strong>WP Mail SMTP<\/strong> plugin and route mail through a transactional provider (SMTP2GO, Brevo, SendGrid, Amazon SES). Shared hosting often blocks <code>mail()<\/code> silently.<\/p><\/dd>\n<dt id=\"how%20do%20i%20check%20whether%20stock%20notifications%20are%20queued%3F\"><h3>How do I check whether stock notifications are queued?<\/h3><\/dt>\n<dd><p>Open <strong>WooCommerce \u2192 Status \u2192 Scheduled Actions<\/strong> and filter by hook <code>wt_waitlist_*<\/code>. You will see pending and completed jobs with timestamps. If nothing appears after a stock change, check the <strong>System status<\/strong> panel inside <strong>WT Waitlist \u2192 Settings<\/strong> \u2014 it shows whether Action Scheduler is available and how many <code>wt_waitlist_*<\/code> jobs are pending.<\/p><\/dd>\n<dt id=\"something%20is%20broken%20and%20i%20want%20to%20send%20a%20support%20ticket.\"><h3>Something is broken and I want to send a support ticket.<\/h3><\/dt>\n<dd><p>Open <strong>WT Waitlist \u2192 Settings<\/strong>, click <strong>Copy diagnostic info<\/strong> and paste the resulting block into your email to support. It includes plugin\/WP\/WC\/PHP versions, theme info, table state, subscription counts, recent email log, Action Scheduler status and a sample of out-of-stock products with their purchasable \/ backorders state \u2014 everything we need to diagnose the issue without going back and forth.<\/p><\/dd>\n<dt id=\"i%20use%20flatsome%20%2F%20avada%20%2F%20enfold%20%2F%20porto%20and%20the%20form%20does%20not%20appear.\"><h3>I use Flatsome \/ Avada \/ Enfold \/ Porto and the form does not appear.<\/h3><\/dt>\n<dd><p>Themes with custom product-page templates (Flatsome UX Builder, Avada Builder, Enfold templates, Porto) often replace the standard WooCommerce single-product template, which bypasses the hooks WT Waitlist uses to attach the signup form. As of <strong>v1.0.3<\/strong> we ship multiple compatibility layers, including a <code>wp_footer<\/code> JS DOM-injection fallback that should handle most of these themes automatically. The plugin also detects these themes and shows a compatibility note inside <strong>WT Waitlist \u2192 Settings \u2192 System status<\/strong>.<\/p>\n\n<p>If the form still does not show:<\/p>\n\n<ul>\n<li>In Flatsome, switch the product template to <strong>Default<\/strong> in <em>Flatsome \u2192 Theme Options \u2192 WooCommerce \u2192 Product Page<\/em>.<\/li>\n<li>Or place the shortcode <code>[wt_waitlist product_id=\"123\"]<\/code> directly inside the product description \/ UX block \/ Custom HTML block.<\/li>\n<\/ul><\/dd>\n<dt id=\"my%20product%20is%20marked%20out%20of%20stock%20but%20customers%20can%20still%20add%20it%20to%20the%20cart%2C%20and%20the%20waitlist%20form%20does%20not%20appear.\"><h3>My product is marked out of stock but customers can still add it to the cart, and the waitlist form does not appear.<\/h3><\/dt>\n<dd><p>That means the product has <strong>backorders enabled<\/strong> (Product \u2192 Inventory \u2192 Allow backorders). WooCommerce treats it as purchasable even though <code>is_in_stock()<\/code> returns false \u2014 and your customers see the standard \"Add to cart\" button alongside a backorder notice. WT Waitlist still renders its signup form for such products (so both signup paths coexist), but if the form is missing on a backorder-allowed product, check the <strong>Sample out-of-stock products<\/strong> section inside the diagnostic info (button <strong>Copy diagnostic info<\/strong>) \u2014 it lists <code>is_purchasable \/ backorders_allowed \/ subscribers<\/code> per OOS product so you can see exactly how WooCommerce treats each item.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.4<\/h4>\n\n<ul>\n<li><strong>Fix: signup form rendered twice<\/strong> on most themes. Two of the rendering layers shared one callback that did not check the \"already rendered\" guard, so the form appeared duplicated. Resolved \u2014 the form now renders exactly once.<\/li>\n<li><strong>Fix: signup form not appearing on variable products<\/strong> when a selected variation is out of stock or on backorder. The variation-aware JavaScript relied on <code>is_in_stock<\/code>, which is <code>true<\/code> for <code>onbackorder<\/code> variations. The plugin now tags each variation server-side (<code>woocommerce_available_variation<\/code>) with an explicit waitlist flag, so the form shows correctly for every non-<code>instock<\/code> variation.<\/li>\n<li>New: <strong>Editable signup form text<\/strong> \u2014 the form heading, description, button label and success message can now be customized under WT Waitlist \u2192 Settings \u2192 \"Signup form text\". Leave a field empty to keep the built-in translated default.<\/li>\n<li>i18n: translated the last two hardcoded Polish fallback strings in the frontend script (connection \/ generic error messages).<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li><strong>Fix: signup form was not appearing on backorder-allowed products.<\/strong> WooCommerce has three stock statuses \u2014 <code>instock<\/code>, <code>outofstock<\/code> and <code>onbackorder<\/code> \u2014 and <code>WC_Product::is_in_stock()<\/code> returns <code>true<\/code> for both <code>instock<\/code> and <code>onbackorder<\/code>. The previous version's check <code>!is_in_stock()<\/code> therefore skipped backorder products entirely. We now use <code>get_stock_status() !== 'instock'<\/code> so the form is rendered (and accepts signups) for both true-OOS and backorder products. This is the primary fix in 1.0.3 \u2014 strongly recommended for any store using WooCommerce backorders.<\/li>\n<li>New: <strong>Two additional rendering layers for theme compatibility<\/strong> \u2014 <code>woocommerce_after_single_product_summary<\/code> (Layer 4) and <code>wp_footer<\/code> + JS DOM injection (Layer 5). Fixes \"signup form does not appear\" on themes that bypass the standard WooCommerce summary hooks (Flatsome UX Builder, Avada Builder, Enfold, Porto and similar page-builder driven themes).<\/li>\n<li>New: <strong>Sample out-of-stock products<\/strong> section in System status \u2014 for the first 5 OOS products shows <code>is_in_stock \/ is_purchasable \/ backorders_allowed \/ subscribers<\/code> so backorder vs. waitlist conflicts are immediately visible.<\/li>\n<li>New: <strong>Theme compatibility hints<\/strong> \u2014 System status now reports the active theme template slug and surfaces a known-incompatibility note for Flatsome \/ Avada \/ Enfold \/ Porto.<\/li>\n<li>i18n: <strong>All user-facing strings translated to English<\/strong> (admin Settings labels, signup form, error messages, email templates, unsubscribe page, admin list table). Polish-only release is over \u2014 the plugin now ships in English by default.<\/li>\n<li>Docs: new FAQ entries covering Flatsome\/builder-theme rendering and backorder-vs-waitlist behavior.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>New: <strong>System status<\/strong> panel inside WT Waitlist \u2192 Settings \u2014 versions, DB tables, subscription counts, Action Scheduler state and recent email log at a glance.<\/li>\n<li>New: <strong>Send test email to admin<\/strong> button \u2014 one-click verification that <code>wp_mail()<\/code> works on this site (surfaces PHPMailer error string on failure).<\/li>\n<li>New: <strong>Copy diagnostic info<\/strong> button \u2014 generates a paste-ready support snippet so you do not have to copy values by hand.<\/li>\n<li>New: <strong>Quick start<\/strong> panel at the top of the settings page explaining the out-of-stock \u2192 form \u2192 Action Scheduler \u2192 email flow in four lines.<\/li>\n<li>Tweak: fixed <code>WT_WAITLIST_VERSION<\/code> constant that still reported <code>0.1.0<\/code> in cached environments.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: replaced inline <code>&lt;style&gt;<\/code> block in the unsubscribe page with <code>wp_register_style()<\/code> + <code>wp_print_styles()<\/code> (WP guideline compliance).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<p>First public release.<\/p>\n\n<ul>\n<li>Waitlist form on product pages (simple + variable), classic and block theme support.<\/li>\n<li>Custom database tables (<code>{prefix}_waitlist_subscriptions<\/code>, <code>{prefix}_waitlist_email_log<\/code>).<\/li>\n<li>Stock-status change detection through WooCommerce hooks.<\/li>\n<li>Notification queue through Action Scheduler with 5 min throttle and batches of 50.<\/li>\n<li>One-click unsubscribe with SHA-256 token.<\/li>\n<li>Admin panel: subscriber list with filters and CSV export.<\/li>\n<li>Product-edit widget showing waitlist count.<\/li>\n<li>Integration with WordPress Privacy Tools (export + eraser).<\/li>\n<li>Shortcode <code>[wt_waitlist]<\/code> as fallback.<\/li>\n<li>Honeypot plus rate limiter (10\/hour per IP).<\/li>\n<li>Automatic purge of old subscriptions (configurable retention).<\/li>\n<\/ul>","raw_excerpt":"Lightweight waitlist for WooCommerce \u2014 automatic email notifications when an out-of-stock product (or variation) is back in stock.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/309015","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=309015"}],"author":[{"embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/webmastersteam"}],"wp:attachment":[{"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=309015"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=309015"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=309015"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=309015"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=309015"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/az.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=309015"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}