{"id":365991,"date":"2026-09-08T11:52:48","date_gmt":"2026-09-08T11:52:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/catcode-abandoned-cart-recovery-for-woocommerce\/"},"modified":"2026-09-08T11:52:35","modified_gmt":"2026-09-08T11:52:35","slug":"catcode-abandoned-cart-recovery-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/catcode-abandoned-cart-recovery-for-woocommerce\/","author":23504569,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"6.2","requires_php":"7.4","requires_plugins":null,"header_name":"CatCode Abandoned Cart Recovery for WooCommerce","header_author":"CatCode","header_description":"Captures abandoned WooCommerce carts and wins them back with a reminder email containing a one-click recovery link. Cart list with statistics, configurable timings and templates.","assets_banners_color":"ffffff","last_updated":"2026-09-08 11:52:35","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/catcode.com.ua\/modules\/catcode-abandoned-cart-recovery-for-woocommerce\/","header_author_uri":"https:\/\/catcode.com.ua","rating":0,"author_block_rating":0,"active_installs":0,"downloads":40,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"catcodestudio","date":"2026-09-08 11:52:35","revision":3686528}},"upgrade_notice":{"1.0.0":"<p>First public release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3686583,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3686583,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3686583,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3686583,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Abandoned cart list with the four statistic tiles and the status filter","2":"Settings: timings, the reminder email template with its placeholders, and the data retention period"}},"plugin_section":[],"plugin_tags":[15962,11133,282,267,286],"plugin_category":[41,45],"plugin_contributors":[271712],"plugin_business_model":[],"class_list":["post-365991","plugin","type-plugin","status-publish","hentry","plugin_tags-abandoned-cart","plugin_tags-cart-recovery","plugin_tags-ecommerce","plugin_tags-email","plugin_tags-woocommerce","plugin_category-communication","plugin_category-ecommerce","plugin_contributors-catcodestudio","plugin_committers-catcodestudio"],"banners":{"banner":"https:\/\/ps.w.org\/catcode-abandoned-cart-recovery-for-woocommerce\/assets\/banner-772x250.png?rev=3686583","banner_2x":"https:\/\/ps.w.org\/catcode-abandoned-cart-recovery-for-woocommerce\/assets\/banner-1544x500.png?rev=3686583","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/catcode-abandoned-cart-recovery-for-woocommerce\/assets\/icon-128x128.png?rev=3686583","icon_2x":"https:\/\/ps.w.org\/catcode-abandoned-cart-recovery-for-woocommerce\/assets\/icon-256x256.png?rev=3686583","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Most shoppers who fill a cart never reach the \"thank you\" page. This plugin records those carts, waits a configurable amount of time, and then emails the shopper a single link that puts every product straight back into their cart.<\/p>\n\n<h4>How it works<\/h4>\n\n<ol>\n<li>A shopper adds products to the cart. Logged-in customers are recorded immediately; guests are recorded as soon as they type an email address at checkout (classic checkout and Checkout Blocks are both supported).<\/li>\n<li>After the configured period of inactivity (60 minutes by default) a background scan marks the cart as <strong>abandoned<\/strong>.<\/li>\n<li>A reminder email goes out after the delay you choose, carrying a personal recovery link.<\/li>\n<li>Clicking the link restores the cart and pre-fills the checkout with the address already known. The cart becomes <strong>recovered<\/strong> automatically once an order is placed by that customer.<\/li>\n<\/ol>\n\n<h4>Features<\/h4>\n\n<ul>\n<li>Cart capture for logged-in customers and for guests who entered an email at checkout<\/li>\n<li>Configurable inactivity window before a cart counts as abandoned<\/li>\n<li>A reminder email with a fully editable subject and body<\/li>\n<li>Placeholders: <code>{customer_name}<\/code>, <code>{cart_items}<\/code>, <code>{recovery_link}<\/code>, <code>{store_name}<\/code><\/li>\n<li>One-time recovery links with a configurable lifetime (7 days by default) \u2014 only a SHA-256 hash of the token is ever stored<\/li>\n<li>Cart statuses: active \u2192 abandoned \u2192 recovered \/ lost, with automatic recovery detection when an order arrives<\/li>\n<li>Admin cart list with a status filter, email search and four statistic tiles: carts abandoned, carts recovered, revenue recovered and recovery rate<\/li>\n<li>Anti-spam guard: the same address is not emailed more often than once every N days<\/li>\n<li>Automatic data retention cleanup and integration with the WordPress personal data exporter and eraser<\/li>\n<li>HPOS (custom order tables) compatible, works with the block-based checkout<\/li>\n<\/ul>\n\n<p>Everything runs on your own server. Reminders are sent through your site's own <code>wp_mail()<\/code>, and the captured carts are stored in your own database \u2014 the plugin does not contact any external service.<\/p>\n\n<h4>Requirements<\/h4>\n\n<ul>\n<li>WooCommerce 7.0 or newer<\/li>\n<li>PHP 7.4+<\/li>\n<li>Working WP-Cron (or a real system cron calling <code>wp-cron.php<\/code>)<\/li>\n<\/ul>\n\n<p>The plugin interface is fully translated into Ukrainian. \/ \u0406\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u043f\u043b\u0430\u0433\u0456\u043d\u0430 \u043f\u043e\u0432\u043d\u0456\u0441\u0442\u044e \u043f\u0435\u0440\u0435\u043a\u043b\u0430\u0434\u0435\u043d\u043e \u0443\u043a\u0440\u0430\u0457\u043d\u0441\u044c\u043a\u043e\u044e.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin does not connect to any external service. It makes no outbound HTTP requests of any kind: cart capture, the abandonment scan, the reminder email (sent through your site's own <code>wp_mail()<\/code>) and the recovery link all run entirely on your own server, and no data ever leaves your site.<\/p>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin stores personal data of shoppers who did not complete an order, because a reminder cannot be sent without it.<\/p>\n\n<p><strong>What is stored:<\/strong> the email address, the customer name (when known), the WordPress user id for logged-in customers, a snapshot of the cart contents (product name, quantity, price), the cart total and currency, the cart status, and how many reminders were sent and when. Recovery tokens are stored only as a SHA-256 hash, never in plain text.<\/p>\n\n<p><strong>When it is stored:<\/strong> for logged-in customers, as soon as they have items in the cart; for guests, only once they have typed an email address at checkout. Anonymous browsing is never recorded.<\/p>\n\n<p><strong>Where it is stored:<\/strong> in the <code>{prefix}catcode_abandoned_carts<\/code> table in your own WordPress database. Nothing is sent to CatCode or to any other third party \u2014 the plugin makes no outbound requests at all.<\/p>\n\n<p><strong>How long it is kept:<\/strong> rows are deleted automatically by a daily job once they are older than the retention period set on the settings page (90 days by default; set it to 0 to keep the data indefinitely, which is not recommended). Uninstalling the plugin drops the table entirely.<\/p>\n\n<p><strong>Data subject requests:<\/strong> the plugin registers a WordPress personal data exporter and eraser, so a shopper's carts are included in the standard Tools \u2192 Export Personal Data and Tools \u2192 Erase Personal Data flows, keyed by email address. The plugin also contributes suggested wording to the site privacy policy screen (Settings \u2192 Privacy \u2192 Policy guide).<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/catcode-abandoned-cart-recovery-for-woocommerce\/<\/code><\/li>\n<li>Activate it in the \"Plugins\" menu<\/li>\n<li>Go to WooCommerce \u2192 Abandoned Cart Settings and set the timings and the email text<\/li>\n<li>Watch the results under WooCommerce \u2192 Abandoned Carts<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"when%20exactly%20is%20a%20guest%20cart%20captured%3F\"><h3>When exactly is a guest cart captured?<\/h3><\/dt>\n<dd><p>Only after the shopper has entered an email address at checkout. Before that there is nothing to send a reminder to, so nothing is stored \u2014 no personal data is collected from anonymous browsing.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20the%20block-based%20checkout%3F\"><h3>Does it work with the block-based checkout?<\/h3><\/dt>\n<dd><p>Yes. The classic checkout is captured server-side through the <code>update_order_review<\/code> AJAX call; the block checkout posts the email to the plugin's own REST route as soon as the field is filled in. Both paths end in the same table.<\/p><\/dd>\n<dt id=\"how%20often%20does%20the%20scan%20run%3F\"><h3>How often does the scan run?<\/h3><\/dt>\n<dd><p>Every 15 minutes, through WP-Cron (<code>catcode_abandoned_cart_scan<\/code>). A second daily event (<code>catcode_abandoned_cart_cleanup<\/code>) closes expired carts and enforces the retention period.<\/p><\/dd>\n<dt id=\"is%20the%20recovery%20link%20safe%20to%20email%3F\"><h3>Is the recovery link safe to email?<\/h3><\/dt>\n<dd><p>The link carries a 32-character random token. Only its SHA-256 hash is stored in the database, the comparison is done with <code>hash_equals()<\/code>, the token is single-use, and it is stripped from the address bar right after the cart is restored.<\/p><\/dd>\n<dt id=\"will%20a%20customer%20receive%20several%20reminders%20for%20several%20carts%3F\"><h3>Will a customer receive several reminders for several carts?<\/h3><\/dt>\n<dd><p>No. The \"do not email the same address more often than once every N days\" setting throttles reminders per address across all carts.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20send%20anything%20to%20an%20external%20server%3F\"><h3>Does the plugin send anything to an external server?<\/h3><\/dt>\n<dd><p>No. It makes no outbound requests at all \u2014 see the \"External services\" section above.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20the%20stored%20data%20when%20i%20uninstall%3F\"><h3>What happens to the stored data when I uninstall?<\/h3><\/dt>\n<dd><p>Uninstalling the plugin drops its database table and deletes its options, so no captured cart data is left behind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: cart capture for customers and guests, abandonment scan, reminder email with a one-time recovery link, cart list with statistics, retention cleanup and privacy tools.<\/li>\n<\/ul>","raw_excerpt":"Captures abandoned WooCommerce carts and wins them back with a reminder email containing a one-click recovery link.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/365991","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=365991"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/catcodestudio"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=365991"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=365991"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=365991"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=365991"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=365991"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=365991"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}