Fix: “Order Cancelled” message is now suppressed if the customer already has a successful (paid) order — prevents confusing notifications when a failed order is auto-cancelled after the customer already retried and paid
UX: Redesigned the Template Mappings event cards for maximum clarity — each card now shows a lifecycle timeline (Checkout → Placed → Paid → Shipped → Done), a color-coded payment status pill, a plain-language example scenario, and a “Best for” recommendation line
UX: Payment status pills (“Not paid yet” / “Payment confirmed” / “Paid & shipped”) make it visually impossible to confuse Order Placed with Payment Received
UX: Left accent stripe on each card is colored by payment stage (amber for unpaid, green for paid, blue for shipped) for at-a-glance scanning
UX: Added status badges (UNPAID / PAID / SHIPPED) on event cards so admins can see at a glance which payment stage each event fires at
UX: Inline warning on “Order Placed” when active — explains that message fires BEFORE payment is confirmed, so abandoned payments still receive it
UX: Page-level intro explains the WooCommerce event lifecycle and recommends “Payment Received” for most stores
UX: Conflict warning when both “Order Placed” and “Payment Received” are active — prevents accidental double-messaging
UX: Expanded descriptions on each event card with clearer wording and use-case guidance
1.0.11
Fix: Duplicate order event messages — dedup now re-fetches the order to bypass stale in-memory meta caches when multiple WooCommerce hooks fire in the same request
Fix: Atomic dedup using direct DB insert (HPOS + classic compatible) prevents the read-then-write race between woocommerce_payment_complete and woocommerce_order_status_processing
Added: Second-layer dedup in the Action Scheduler callback queries message_log by order_id + event_type
Added: order_id column on megasend_message_log with composite index (order_id, event_type) for fast dedup lookups
DB: Schema upgrade runs automatically on plugin update (dbDelta adds new column and index)
1.0.10
Fix: Revenue Recovered dashboard card now uses locale-aware currency formatting with thousand separators
Fix: Cart total values are clamped to a sensible maximum (9,999,999.99) to prevent corrupt WooCommerce session data from poisoning analytics
Fix: Dashboard SUM queries ignore absurd cart_total values so existing bad rows don’t break the display
Improved: Stats card value now wraps gracefully on long numbers instead of overflowing
1.0.9
Fix: Cart recovery links now correctly restore cart items — session is explicitly persisted before redirect
Fix: Validate product availability during recovery — skip out-of-stock or deleted items gracefully
Improved: Recovery handler moved from template_redirect to wp_loaded for proper WooCommerce session timing
1.0.8
Fix: Cart tracking now returns actual DB error when insert fails instead of silent success
Improved: Better error diagnostics for cart tracking issues
1.0.7
New: UTM tracking parameters for cart recovery URLs — configure utm_source, utm_medium, utm_campaign, utm_term, and utm_content in the Abandonment Settings.
New: Dynamic placeholders ({cart_id}, {session_id}) supported in UTM values.
New: Smart defaults for new installs (megasend/whatsapp/cart_recovery).
1.0.6
New: Payment abandonment detection — customers who place an order but never complete payment (PayPal redirect, bank transfer, etc.) now receive abandonment messages after the threshold period.
Fix: Orders with “pending” status no longer prematurely mark tracked carts as completed. Cart status is only finalized when payment is confirmed.
Fix: Cancelled and failed orders now re-enable the linked cart for abandonment detection.
New: Order status transition hooks (processing, completed, on-hold, cancelled, failed) for smarter cart lifecycle management.
1.0.5
Fix: Corrected wc-ajax URL generation for cart tracking on all hosting environments.
1.0.4
Fix: Cart tracking now uses WooCommerce wc-ajax endpoint instead of admin-ajax.php, resolving silent tracking failures caused by caching plugins (WP Rocket, LiteSpeed Cache, Cloudflare, etc.) serving stale nonces.
Fix: GDPR consent is now properly enforced on page unload beacon tracking.
Fix: AJAX retries only fire on actual network failures, not on HTTP error responses.
New: Debug logging for abandonment detection pipeline when WP_DEBUG_LOG is enabled.
1.0.3
Fix: Checkout tracking script now loads reliably on all themes, including WoodMart, Flatsome, and Elementor-based checkouts that override WooCommerce templates.
1.0.2
New: Marketing Consent Settings — optionally restrict abandonment messages to customers who opted into SMS/WhatsApp marketing via the checkout consent checkbox.
New: GDPR consent status now stored in database for compliance auditing.
New: Admin warning when Marketing Consent is enabled without GDPR checkbox.
1.0.1
Fix: Cart recovery now displays phone number in local format instead of E.164 (e.g., “054-616-2881” instead of “+972546162881”).
Fix: Cart recovery now restores all checkout fields (country, city, address, postcode).
Fix: Order event dispatcher now correctly skips draft orders created by Block Checkout.
Fix: Added fallback payment hook for gateways that bypass payment_complete().
Fix: Optimized event deduplication to avoid redundant database lookups.
1.0.0
Initial release.
Cart abandonment detection with configurable threshold.
Follow-up message sequences.
Order event notifications (created, paid, fulfilled, cancelled, refunded).
Template mapping with visual variable mapping and WhatsApp preview.
3-step onboarding wizard.
Dashboard analytics and message log.
GDPR consent checkbox support.
WooCommerce HPOS and Block Checkout compatibility.