etechflow / module-abandoned-cart
etechflow/module-abandoned-cart
Abandoned Cart Email + Exit-Intent Popup extension for Magento 2 — recovers lost sales via automated email reminders and on-site discount popups. Fully compatible with Luma, Hyva, and Adobe Commerce.
ETechFlow Abandoned Cart Email for Magento 2
Recover lost sales with automated, personalised abandoned-cart email reminders. Fully compatible with Luma, Hyvä, and Adobe Commerce.
Features
- Configurable email sequences — send up to 9 reminders per cart at custom intervals (e.g., 1 hour, 24 hours, 72 hours)
- One-click cart restore — customers click the link in the email and their cart is back exactly as they left it, optionally with auto-login
- Auto-generated discount coupons — incentivise recovery with unique single-use coupon codes per email
- Open & click tracking — measure exactly which emails are working and which carts they recovered
- Rich targeting — per-store, per-customer-group, by cart subtotal range, by item count, by Magento price-rule conditions
- Guest cart support — track and email visitors who reached checkout but never logged in
- Test mode — preview emails by redirecting to a dev inbox before going live
- Unsubscribe link — built into every email, with confirmation page
- Recovery dashboard — total abandoned, total recovered, recovery rate, revenue recovered, by date range
- Per-rule analytics — at-a-glance recovery rate per rule in the rules grid
Compatibility
| Open Source 2.4.6 | Open Source 2.4.7 | Adobe Commerce 2.4.6 | Adobe Commerce 2.4.7 | |
|---|---|---|---|---|
| Luma theme | ✅ | ✅ | ✅ | ✅ |
| Hyvä theme 1.3+ | ✅ | ✅ | ✅ | ✅ |
| PHP | 8.1 / 8.2 | 8.2 / 8.3 | 8.1 / 8.2 | 8.2 / 8.3 |
Installation
Via Composer (recommended)
composer require etechflow/module-abandoned-cart
bin/magento module:enable Etechflow_AbandonedCart
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
Manual (upload zip)
- Upload the
ETechFlow/AbandonedCartfolder toapp/code/ETechFlow/AbandonedCart/on your server - SSH in and run:
cd /path/to/magento
bin/magento module:enable Etechflow_AbandonedCart
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
Verify the install
bin/magento module:status Etechflow_AbandonedCart
# Expected: Module is enabled
bin/magento etechflow:abc:verify
# Expected: ALL CHECKS PASSED
Cron must be running
The module's emails are sent by Magento cron. If you haven't already set up Linux cron:
bin/magento cron:install
crontab -l # verify it was added
Configuration
Go to Stores → Configuration → ETechFlow → Abandoned Cart Email.
Key settings to review on first install:
- General → Enable Module: Yes
- General → Cart Abandonment Threshold: 30 minutes (default — adjust to your store's checkout flow)
- License → License Key: Paste the key from your purchase email (development hosts skip this)
- Email Sending → Sender Identity: Pick which "Store Email Address" sends the recovery emails
- Cart Restore → Restore Token Expiry: 30 days default
Then create your first rule under Marketing → ETechFlow Abandoned Cart → Email Rules → Add New Rule.
A typical sequence:
- Rule 1: send 1 hour after abandonment, friendly reminder, no coupon
- Rule 2: send 24 hours later, includes 5% coupon
- Rule 3: send 72 hours later, "last chance" with 10% coupon
CLI commands
| Command | Purpose |
|---|---|
bin/magento etechflow:abc:verify |
End-to-end smoke test. Run after install and after upgrade. |
bin/magento etechflow:abc:perf |
Micro-benchmark of hot paths. Add --iterations=N and --json=path. |
bin/magento etechflow:abc:send |
Force a cron tick now (don't wait for the schedule). |
bin/magento etechflow:abc:cleanup |
Force the cleanup cron now. |
Performance
This module is built for high-traffic stores. Performance characteristics on warm cache:
| Hot path | p95 target |
|---|---|
| Frontend cart-save observer | < 0.5 ms |
| Per-cron-tick batch (50 carts) | < 1.5 s |
| 1-click restore controller | < 50 ms |
| Tracking pixel | < 20 ms |
Storefront pages take ZERO additional work from this module — all heavy lifting happens in cron.
Hyvä theme
Hyvä compatibility ships in the same package. The module detects the active theme automatically and:
- Sends Hyvä-styled email templates (Tailwind classes) on Hyvä storefronts
- Sends Luma-styled templates on Luma storefronts
- Restore + Unsubscribe pages render with both Block (Luma) and ViewModel (Hyvä) paths — no Knockout on Hyvä
Adobe Commerce
The module works fully on Adobe Commerce 2.4.6 / 2.4.7 and adds:
- Future v1.1.0: B2B company-account abandoned-cart support
- Future v1.1.0: Customer Segments integration
- Future v1.1.0: GraphQL endpoints for headless
v1.0.0 already handles multi-website / multi-store and AC's customer-group targeting.
Uninstall
bin/magento module:disable Etechflow_AbandonedCart
composer remove etechflow/module-abandoned-cart
bin/magento setup:upgrade
Database tables (etechflow_abandoned_cart, etechflow_abandoned_cart_rule, etechflow_abandoned_cart_email_log) are dropped by the schema patch on uninstall.
Support
- Email: [email protected]
- Website: https://etechflow.com
- Bug reports: include the output of
bin/magento etechflow:abc:verify
License
Proprietary. See LICENSE.txt for terms. A per-installation license is required for production use.
Changelog
All notable changes to Etechflow_AbandonedCart are documented here. Format follows Keep a Changelog and the project adheres to Semantic Versioning per ETechFlow Module Development Standards §3.
v1.0.1 — 2026-06-05
Security + bundle-consistency fix.
- Rotated per-module SECRET_FRAGMENTS (closes accidental plaintext-secret exposure in v1.0.0)
- Replaced plain BUNDLE_SECRET constant with BUNDLE_SECRET_FRAGMENTS array (aligned with other ETechFlow modules)
- BUNDLE_ID changed from 'ETECHFLOW_MAGENTO_BUNDLE_V1' to 'etechflow-bundle' (matches the rest of the suite — bundle keys interoperate)
- MODULE_ID changed from 'abandoned-cart-popup' to 'abandoned-cart' (matches composer package name)
- Dropped backward-compat for legacy v1.0–v1.2 'host|hmac' key format (no merchants on those versions)
⚠️ v1.0.0 keys (per-module or bundle) no longer validate. Re-issue keys via tools/generate-license.php.
Unreleased
Nothing pending — see v1.0.0 below for the initial release.
1.0.0 — 2026-05-21
Released after the 22-phase build + bulk re-deploy + end-to-end verification on the magento-dev.etechflow.com Docker stack.
Initial release — production-ready abandoned-cart recovery for Luma, Hyvä, and Adobe Commerce
Etechflow_AbandonedCart ships with a complete cart-recovery email system that detects abandoned carts via cron (no per-request scanning), sends configurable email sequences with 1-click restore links and optional auto-generated discount coupons, and attributes recovered revenue back to the originating emails for reporting. Built to match Amasty's feature surface with five concrete UX improvements (plain-English tooltips, inline rule preview, specific CSV-error messages, per-rule recovery rate in the rules grid, multi-recipient test mode).
Added
- Cart abandonment tracking —
CartSaveObserverrecords every cart save intoetechflow_abandoned_cart, with all four mandatory observer guards (enabled / bulk-importer / indexer-processing / relevant-change). - Configurable email sequences — up to 9 rules per cart, ordered by priority, with per-rule store / customer-group / cart-subtotal / Magento-price-rule conditions.
- One-click cart restore —
Controller/Restore/Indexwith HMAC-signed single-use tokens, configurable token expiry, optional auto-login for logged-in customers, optional merge with the customer's current cart. - Auto-generated discount coupons —
Model/CouponGeneratorissues per-email single-use coupon codes tied to a Magento sales rule the merchant chooses. - Email open & click tracking — 1×1 pixel + URL wrapping via
Controller/Track/OpenandController/Track/Click. UTM parameters auto-appended (configurable). - Unsubscribe flow — every email carries an unsubscribe link; the confirmation page is Luma + Hyvä compatible.
- Recovery attribution —
OrderPlaceAfterObserver+Quote\SubmitPluginmark carts as RECOVERED and link them back to the email that drove the conversion. - Test Mode — redirect all outbound emails to a comma-separated list of dev inboxes for safe pre-launch testing.
- Hyvä compatibility —
view/frontend/templates/hyva/+ViewModel/+hyva_default.xmldeliver Alpine-powered restore + unsubscribe pages with no Knockout dependencies. - Admin Rules grid + form — full CRUD UI Component at Marketing → ETechFlow Abandoned Cart → Email Rules, with inline per-rule recovery rate.
- Admin Carts grid + view — list every tracked cart with filters by status / customer / store / date, plus per-cart "Send Now" manual trigger.
- Admin Reports dashboard — total abandoned, total recovered, recovery rate, open rate, click rate, revenue recovered, by date range.
- CLI commands —
etechflow:abc:verify(end-to-end smoke),etechflow:abc:perf(micro-benchmark with--iterationsand--json),etechflow:abc:send(manual cron trigger),etechflow:abc:cleanup(manual cleanup trigger). - License validator — HMAC-signed per-installation licenses with
.test/.local/.docksal/.ddev/.lando/localhost/127.0.0.1dev-host auto-bypass and bundle-key support. - Performance instrumentation —
Model/Performance/Profiler.phpwraps every hot path (ETechFlow_ABC_CronTick,ETechFlow_ABC_RuleMatch,ETechFlow_ABC_EmailSend,ETechFlow_ABC_Restore) with no-op-when-absent Tideways spans. - Declarative schema — 3 tables (
etechflow_abandoned_cart,etechflow_abandoned_cart_rule,etechflow_abandoned_cart_email_log) with 11 indexes including composite indexes tuned for the cron's hot queries. - Data patches —
InstallDefaultRulesships sensible 1h/24h/72h rules disabled by default;RegisterEmailTemplatesregisters 3 Luma + 3 Hyvä templates. - i18n — 130+ translatable strings in
i18n/en_US.csvready for localisation. - Adobe Commerce support — works on AC 2.4.6 / 2.4.7. Composer
suggestsmagento/module-company(B2B) andmagento/module-graph-ql(headless) for future v1.1.0 features.
Backwards compatibility
- This is the initial release — no prior versions exist.
- Module ships with
general/enabled=1BUT no active rules. Merchants must explicitly create + activate rules before any email is sent. Per §0 mindset rule 2 (zero behavioural change until opt-in).
Migration tip
- After install, run
bin/magento etechflow:abc:verifyto confirm everything is wired. - Create at least one rule under Marketing → ETechFlow Abandoned Cart → Email Rules before going live.
- Enable Test Mode (
general/test_mode=1) for the first 48 hours after launch to preview emails to your dev inbox before they reach real customers.
Performance baseline (warm cache, p95)
- Frontend cart-save observer: < 0.5 ms (no DB write on the hot path — only an enqueue)
- Cron tick processing 50 carts: < 1.5 s
- 1-click restore controller: < 50 ms (HMAC verify + cart restore)
- Tracking pixel response: < 20 ms
Requires 13
| Package | Constraint |
|---|---|
| magento/framework | >=103.0.0 |
| magento/module-backend | >=102.0.0 |
| magento/module-checkout | >=100.0.0 |
| magento/module-config | >=101.0.0 |
| magento/module-cron | >=100.0.0 |
| magento/module-customer | >=103.0.0 |
| magento/module-email | >=101.0.0 |
| magento/module-quote | >=101.0.0 |
| magento/module-sales | >=103.0.0 |
| magento/module-sales-rule | >=101.0.0 |
| magento/module-store | >=101.0.0 |
| magento/module-ui | >=101.0.0 |
| php | ~8.1.0||~8.2.0||~8.3.0||~8.4.0 |
Suggests 2
| Package | Reason |
|---|---|
| magento/module-company | Required only on Adobe Commerce B2B for company-level abandoned-cart tracking |
| magento/module-graph-ql | Required only when exposing abandoned-cart data to headless / PWA storefronts |
No QA results yet
QA pipelines haven't run for this version. Compatibility and quality results appear here once the vendor publishes a tagged release that gets ingested.
More from etechflow
View vendorDynamic 'View Other Options/Finishes/Sizes' PDP buttons driven by per-product link attributes; replaces hardcoded in-description buttons and strips the old ones at render time.
Theme-agnostic mega menu for Magento 2. Renders on Hyvä, Luma, Adobe Commerce default and custom themes via automatic runtime detection. Provides a JSON endpoint for lazy-loaded subcategory + featured-product data.
EtechFlow Store Locator — admin-managed store/branch finder for Magento 2 with a Leaflet + OpenStreetMap map and postcode proximity search (postcodes.io). Hyva and Luma compatible. No paid map API key required.
Universal Product Fitment Finder for Magento 2 — Make/Model/Year/Part filtering on any fitment domain (automotive, motorcycle, marine, RV, phone cases, watches, appliance parts, anywhere a customer asks "will this fit my X?"). Admin-configurable labels + URL prefix so the same module rebrands to any merchant domain. Includes PDP fitment badge, SEO URLs, customer garage with cross-device sync, OEM/part-number search, and admin tooltips throughout. Theme-agnostic — Hyvä, Luma, custom themes. Renamed from "module-vehicle-compat" in v2.0.0.
Turn an existing module into recurring revenue.
If you already maintain a Magento 2 module on GitHub or GitLab, listing it on Packagento takes about five minutes. We mirror your tags, handle distribution signing, and route paid licenses through Stripe Connect, so you can keep shipping the way you already do.