What is Storzen Cart Recovery?
Storzen Cart Recovery for WooCommerce gives store owners everything needed to recover abandoned carts — capture system, automated email sequences, one-click recovery links, and full analytics — all bundled into one lightweight, self-hosted WordPress plugin. No SaaS subscriptions, no phone-home requests, no third-party API dependencies.
The plugin tracks both guest and logged-in carts, detects abandonment based on a configurable inactivity threshold, queues automated recovery emails via WP-Cron, and presents the entire recovery funnel through a clean, modern admin dashboard built with conversion optimisation in mind.
System Requirements
Storzen Cart Recovery is designed to work on modern WordPress + WooCommerce stacks with minimal overhead.
wp_mail()Installation
From WordPress.org
- In your WordPress admin, go to Plugins → Add New.
- Search for "Storzen Cart Recovery".
- Click Install Now, then Activate.
- You'll see a new Cart Recovery menu item in the WordPress admin sidebar.
Manual Installation (ZIP upload)
- Download the latest ZIP from wordpress.org/plugins/storzen-cart-recovery-for-woocommerce.
- Go to Plugins → Add New → Upload Plugin.
- Choose the ZIP, click Install Now, then Activate.
Via WP-CLI
# Install and activate from the .org repository wp plugin install storzen-cart-recovery-for-woocommerce --activate # Or install from a ZIP file wp plugin install ./storzen-cart-recovery-for-woocommerce.zip --activate
5-Minute Setup
After activation, the plugin works out of the box with sensible defaults. The setup below covers the three most important configuration steps.
Step 1 — Configure Sender Information
Go to Cart Recovery → Settings → Email Sequence and update the sender details that customers will see in their inbox.
- From Name: Your store name (shown in inbox)
- From Email: An address on your store's domain (avoid Gmail / Yahoo for deliverability)
- Reply-To: Optional address where customer replies should go
Step 2 — Set Inactivity Threshold
Go to Cart Recovery → Settings → General and adjust the inactivity threshold. After this many minutes of cart inactivity, the cart is marked as abandoned and email queue is scheduled.
Step 3 — Enable the Email Sequence
On the same settings page, toggle on Enable Automated Sequence and configure the two email steps:
- Email 1: Sent 1 hour after abandonment with subject "You left something behind"
- Email 2: Sent 24 hours after abandonment with subject "Your cart is waiting for you"
Each step has its own subject, template selector, and delay. Click Save Settings and you're live.
How Cart Tracking Works
The plugin captures cart data via two AJAX entry points and stores everything in a dedicated database table — no external services involved.
What Gets Captured
- Cart contents (serialised cart items array)
- Cart total and currency
- Customer email (when available — checkout, login, exit-intent popup)
- First name and last name (if provided)
- Visitor IP address (for analytics; configurable retention)
- User agent (for device analytics)
- Created at, updated at, and abandoned at timestamps
Capture Triggers
The plugin uses both standard WooCommerce hooks and AJAX listeners:
- Cart updates — captured via
woocommerce_cart_updatedand AJAXstorzen_cr_save_cart - Email capture — checkout email field, login, or exit-intent popup via AJAX
storzen_cr_capture_email - Order placed — cart marked as recovered via
woocommerce_thankyouwhen the customer email matches an abandoned cart
Cart Status Flow
// Cart status transitions active → user is browsing / updating cart abandoned → inactivity threshold reached, emails queued recovered → matching order placed lost → retention period exceeded with no recovery
Excluding User Roles
Under Settings → General → Tracking Scope, you can exclude certain roles (e.g. Administrator, Shop Manager) from being tracked. This prevents test carts created during development from polluting your analytics.
The Recovery Sequence
When a cart is marked as abandoned, the plugin schedules a 2-step email sequence based on your configured delays. Emails are queued in a dedicated database table and dispatched via the WordPress cron system.
How It Works
- Cron job
storzen_cr_check_abandonedruns every 5 minutes and finds carts past the inactivity threshold. - For each newly-abandoned cart with a valid email, two queue rows are created — one per email step, with their respective
scheduled_attimestamps. - Cron job
storzen_cr_send_queueruns every 5 minutes and dispatches pending emails whose scheduled time has passed. - If the customer completes checkout before all emails fire, remaining emails are automatically cancelled.
cancelled. The customer never receives reminder emails after they've already purchased.
Configuring the Sequence
Each of the two email steps has its own configuration block under Settings → Email Sequence:
| Field | Description | Default |
|---|---|---|
| enabled | Per-step toggle to enable or disable this specific email | true |
| subject | Email subject line (supports placeholders like {first_name}) | "You left something behind" |
| template | Which of the bundled templates to use (Template 1 or Template 2) | template_1 |
| delay_hours | Hours after abandonment before this email is sent | 1 (step 1), 24 (step 2) |
Recovery Email Templates
The plugin ships with two responsive, mobile-ready HTML email templates. Both are pre-styled and personalised with the customer's name, cart items, prices, store logo, and a recovery CTA button.
Template 1 — Friendly Reminder
Soft, friendly tone. Good for the first email (1h after abandonment). Subject line: "Hey [Name], you left something behind!"
Hey Alex, you left something behind!
You added some great items but didn't complete your purchase. We've saved everything for you.
Template 2 — Urgency Reminder
Direct, urgency-focused tone with red CTA. Good for the second email (24h after abandonment). Subject line: "[Name], your cart is still waiting!"
Template Preview
Go to Cart Recovery → Email Templates to preview both templates side by side, with desktop and mobile viewport toggle. The preview uses sample data — real emails will use actual customer names and cart items.
One-Click Recovery Links
Each recovery email includes a single-click button that, when clicked, restores the customer's cart and redirects them straight to checkout — no login required, no items to re-add.
How the Link Works
Recovery URLs use HMAC-SHA256 signatures, not WordPress nonces. This means:
- No expiration — the link works for the configured retention period (default 30 days)
- Tamper-proof — any modification to the URL breaks the signature and rejects the request
- Safe to share — emails can be forwarded; the link still only restores that specific cart
- No session needed — works for guest carts where the original session is long gone
URL Format
// Example recovery URL https://yourstore.com/?storzen_cr=abc123_def456... // Token format (URL-encoded) {hex(payload)}_{hmac} // Payload contents {cart_token}|{email_id} // HMAC computed using wp_salt('auth') hash_hmac('sha256', $payload, wp_salt('auth'))
Open Tracking Pixel
Each recovery email also contains a 1×1 transparent GIF tracking pixel that records the open event when the customer views the email. The pixel URL is also HMAC-signed using a separate token.
The Dashboard
The Dashboard gives you an at-a-glance view of your recovery performance. All metrics are computed from the plugin's own database tables — no external analytics service is contacted.
KPI Cards
| Metric | What it Means |
|---|---|
| Abandoned | Total cart count with status abandoned or lost |
| Recovered | Total cart count with status recovered |
| Recovery Rate | Recovered ÷ (Abandoned + Recovered) × 100 |
| Revenue Recovered | Sum of cart totals for all recovered carts |
| Revenue At Risk | Sum of cart totals for currently-abandoned carts (still recoverable) |
| Active Now | Carts currently being browsed (status active) |
30-Day Trend Chart
An inline SVG chart shows abandoned vs. recovered carts per day for the past 30 days. The chart is rendered via the bundled storzen-cr-chart.js library — no Chart.js or external CDN dependency.
Recent Activity Feed
The Dashboard's right column lists the 5 most recently abandoned carts with customer name (or "Guest"), email, cart value, status badge, and time-ago label. Click any row to jump to that cart's detail in the Abandoned Carts list.
Exit-Intent Email Capture
The optional exit-intent popup triggers when a visitor with items in their cart moves their cursor toward the browser close button (or, on mobile, scrolls up fast). It captures the email address before they leave, even if they never reach the checkout page.
Enabling the Popup
Go to Cart Recovery → Settings → General → Tracking Scope and toggle Enable Exit-Intent Popup. Once enabled:
- Popup loads only on pages that have a non-empty WooCommerce cart
- Triggers once per session (no repeat annoyance)
- Can be dismissed; dismissal is remembered for the session
- Captured email is immediately associated with the current cart
storzen_cr_exit_popup_html to replace the markup with your own design, or use CSS overrides on .storzen-cr-exit-popup for styling tweaks.
All Settings Explained
General Tab
| Field | Description | Default |
|---|---|---|
| inactivity_threshold | Minutes of cart inactivity before the cart is marked abandoned | 60 |
| retention_days | How many days to keep abandoned cart records before auto-purge | 30 |
| track_guests | Whether to track carts from guest (logged-out) visitors | true |
| track_logged_in | Whether to track carts from logged-in customers | true |
| enable_exit_popup | Show the exit-intent email capture popup | false |
| excluded_roles | User roles to exclude from tracking (multi-select) | ["administrator"] |
Email Sequence Tab
| Field | Description | Default |
|---|---|---|
| from_name | "From" name shown in customer's inbox | Site title |
| from_email | "From" email address (use your store's domain) | admin_email |
| reply_to | Optional Reply-To address | (blank — uses from_email) |
| enable_sequence | Master toggle for the entire recovery sequence | true |
| step_1.delay_hours | Hours after abandonment to send email 1 | 1 |
| step_2.delay_hours | Hours after abandonment to send email 2 | 24 |
Developer Hooks
The plugin exposes several hooks so you can extend behaviour without editing core files.
Actions
Filters
Database Tables
The plugin creates three custom tables on activation via dbDelta(). All tables use the {wp_prefix}storzen_cr_ namespace.
{prefix}_storzen_cr_carts
Primary cart capture table. One row per tracked cart.
CREATE TABLE {prefix}_storzen_cr_carts ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cart_token VARCHAR(64) NOT NULL UNIQUE, user_id BIGINT UNSIGNED NULL, email VARCHAR(190) NULL, first_name VARCHAR(190) NULL, last_name VARCHAR(190) NULL, cart_contents LONGTEXT NULL, cart_total DECIMAL(20,4) DEFAULT 0, currency VARCHAR(10) NULL, status VARCHAR(20) DEFAULT 'active', ip_address VARCHAR(45) NULL, user_agent TEXT NULL, abandoned_at DATETIME NULL, recovered_at DATETIME NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX (status), INDEX (email), INDEX (updated_at) );
{prefix}_storzen_cr_email_queue
Email queue table. One row per scheduled recovery email.
CREATE TABLE {prefix}_storzen_cr_email_queue ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cart_id BIGINT UNSIGNED NOT NULL, step TINYINT UNSIGNED NOT NULL, subject VARCHAR(190) NOT NULL, template VARCHAR(50) NOT NULL, status VARCHAR(20) DEFAULT 'pending', scheduled_at DATETIME NOT NULL, sent_at DATETIME NULL, created_at DATETIME NOT NULL, INDEX (status, scheduled_at), INDEX (cart_id) );
{prefix}_storzen_cr_events
Event log table. One row per recovery event (email opened, link clicked, etc.).
CREATE TABLE {prefix}_storzen_cr_events ( id BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY, cart_id BIGINT UNSIGNED NOT NULL, email_id BIGINT UNSIGNED NULL, event_type VARCHAR(50) NOT NULL, event_data LONGTEXT NULL, created_at DATETIME NOT NULL, INDEX (cart_id, event_type) );
uninstall.php drops all three tables and removes all plugin options. Deactivation alone preserves data.
Privacy & Data Handling
The plugin is designed to be privacy-respecting by default. All data stays on your server and is never transmitted to the plugin author or any third party.
Data Collected
- Cart contents (products and quantities)
- Customer email, first name, last name (captured at checkout or via the optional exit-intent popup)
- Visitor IP address (for abandonment analytics; configurable retention)
- User agent string (for device analytics)
- Email open and recovery-link click timestamps
Data Retention
Abandoned cart records are automatically deleted after the configured retention period (default: 30 days). You can change this under Settings → General → Retention Period. Recovered cart records are kept indefinitely for reporting.
Personal Data Export & Erase
The plugin integrates with WordPress's built-in Tools → Export Personal Data and Tools → Erase Personal Data features. When an admin runs these tools for a specific email address, the plugin includes / removes all matching cart and event records.
Frequently Asked Questions
Does this work without WooCommerce?
Requires Plugins: woocommerce header so WordPress will block activation if WooCommerce is missing.Will guest cart tracking work?
Are recovery emails sent via wp_mail()?
wp_mail() for all outgoing emails, so any deliverability plugin (SMTP, SendGrid, Mailgun, Postmark, etc.) automatically applies. We recommend a transactional email service for production stores to maximise inbox placement.Does WP-Cron handle the queue reliably enough?
wp-cron.php every 5 minutes. The plugin's cron handlers are designed to be idempotent — they're safe to run more often without causing duplicate emails.How do recovery links survive long retention periods?
wp_salt('auth')). They don't rely on session data or WP nonces, so they remain valid as long as the cart record exists in the database — typically the full retention window.Will this plugin slow down my store?
wp_posts or order tables. Admin assets are loaded only on the plugin's own admin pages.Is the plugin HPOS compatible?
FeaturesUtil::declare_compatibility( 'custom_order_tables' ). Order matching for recovery uses the WooCommerce CRUD API, which automatically targets the right storage backend (HPOS or legacy).Is the plugin translation ready?
storzen-cart-recovery-for-woocommerce text domain and a .pot file is included in languages/. The plugin works with Loco Translate, WPML, Polylang, and standard .po / .mo file workflows.What happens to data when I uninstall the plugin?
uninstall.php file removes all plugin options and drops the three custom tables when the plugin is deleted via the Plugins screen. Deactivating (without deleting) preserves everything so you can reactivate later without losing data.