Skip to main content

Mage2Plenty v3.2 - Stability, Performance & PHP 8.4 Compatibility

· 6 min read
Soft Commerce Team
Mage2Plenty Development Team

We're pleased to announce Mage2Plenty v3.2, a major stability and performance release that resolves critical queue loop and notification bloat issues, delivers smarter product import error handling, fixes order creditmemo processing, and adds full PHP 8.4 compatibility.

What's New in v3.2

This release is focused on production hardening — improving error handling in product import, optimising notification storage, and reducing idle database polling across all queue consumers.

Item Import Stability

When cross-sell or related product targets referenced non-existent items, the multi-pass relation link import could repeatedly re-queue the same items. An in-memory retry registry now tracks reprocessing attempts per item. Items that exceed the maximum retry count (default: 2) are skipped with a warning log, ensuring the import completes cleanly.

Improved Error Handling

Several fixes ensure that import errors are properly surfaced and recorded:

  • Error results now persist to the item table — Previously, when the type processor threw an error after the SKU was already set, post-processors like SaveItemResultData were skipped entirely, meaning errors were silently lost.
  • Batch execution errors surfaced to CLI and UI — PIM batch failures that previously only appeared in log files now show in the CLI output and admin message collector.
  • Post-processor guard — Post-processors no longer run when the type processor fails or is skipped, preventing cascading "Product SKU is required" errors.
  • Memory leak prevention — The retry registry is now capped at 10,000 entries to prevent unbounded memory growth in long-running queue consumers.

Auto-Create Missing Attribute Values

The product export now detects missing attribute values (not just missing attributes) and triggers the AttributeExportService to create them before sending the batch. Child variations with unresolved attribute values are skipped with a warning, preventing PlentyONE batch rejections caused by inconsistent attributeValues across variations.

PIM Dedicated Endpoint Fix

Dedicated PIM endpoints (categories, sales prices, etc.) now correctly receive variationId in each payload item, fixing "variationId muss ausgefüllt sein" validation errors when exporting simple product categories.

Async Media Checksum Computation

Media checksum computation has been moved from the synchronous setup wizard to an async message queue handler. This prevents HTTP timeouts and CLI blocking during plenty:setup:create on stores with many product images.

Notification Table Bloat Fix

The Problem

On high-activity installations, the plenty_profile_notification table grew to 45M+ rows, exhausting disk space and causing cleanup failures. Three root causes were identified:

  1. No log level filtering — All severity levels (debug, notice, warning) were stored regardless of the configured log level
  2. Cleanup OOM — The cleanup cron used collection->walk('delete'), loading every row as a PHP model object — impossible on tables with millions of rows
  3. Config toggle ignored — Disabling notifications in admin only stopped cleanup while writes continued, making the problem worse

The Fix

  • Log level filtering is now enforced on all write paths — only messages at or above the configured severity are stored
  • Batched SQL deletes replace the collection-based cleanup — handles tables of any size using DELETE ... LIMIT 50000 batching
  • "Enable Notifications" toggle is now respected on all write operations (log, startProcess, endProcess, setSummary)
  • Default log level changed from "notice" to "error" for new installations
  • MySQL Error 1093 resolved in cleanup batch delete queries

Order Export Improvements

Credit Note Cancellation Guard

When a credit note was created in PlentyONE and imported to Magento, the resulting creditmemo changed the Magento order state to "closed". On the next export cycle, the connector would cancel the parent order in PlentyONE — even if creditmemo export was disabled in the profile configuration.

The cancellation generator now checks for associated credit note child orders (type 4) in PlentyONE before allowing cancellation. Orders that already have credit notes are protected regardless of Magento order state or creditmemo export configuration.

Creditmemo for Canceled Orders

A type mismatch bug prevented creditmemos from being created for canceled orders. The order status condition config values were returned as strings but compared strictly against float status IDs (e.g., 8.0 !== "8"), causing the check to always fail. Additionally, the hard gate on Credit Note order type has been relaxed so that regular orders in cancellation statuses can also trigger creditmemo creation.

Queue Consumer Idle Polling

All message queue consumers across the connector now include a sleep interval (15 seconds) when idle, significantly reducing database polling overhead on production servers.

PHP 8.4 Compatibility

Implicit nullable type deprecations have been resolved across all affected modules. Parameters with = null defaults now use explicit mixed type hints, preventing deprecation log spam on PHP 8.4.

Affected modules: module-core, module-plenty-client, module-plenty-category, module-plenty-customer, module-plenty-item, module-plenty-item-profile, module-plenty-order, module-plenty-stock, module-profile.

API Client Improvements

Error logs from the PlentyONE REST API client no longer include the full request payload unless verbose mode is explicitly enabled. This prevents log bloat from large payloads (e.g., HTML product descriptions) on production servers.

Upgrade Guide

Prerequisites

  • Magento 2.4.6+ (2.4.8 recommended)
  • PHP 8.1+ (8.3 or 8.4 recommended)
  • Mage2Plenty v3.1.x

Quick Upgrade

# Update via Composer
composer require softcommerce/mage2plenty-os:^3.2

# Run Magento updates
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush

Post-Upgrade Steps

  1. Review notification settings — The default log level is now "error". If you need lower-severity notifications, adjust the log level in your profile configuration.
  2. Check notification table size — If your plenty_profile_notification table has grown excessively, the improved cleanup cron will now handle it automatically. For very large tables (50M+ rows), consider running TRUNCATE TABLE plenty_profile_notification during a maintenance window for an immediate fix.
  3. Verify queue consumers — Queue consumers now sleep for 15 seconds when idle. No configuration needed, but be aware that message processing may have a slight delay compared to the previous continuous polling.

Updated Modules

ModuleVersionKey Changes
module-plenty-item-profile3.0.2Circuit breaker, error handling, async media checksum, PIM endpoint fix
module-profile-notification2.1.0Table bloat fix, log level filtering, config toggle, batched cleanup
module-plenty-order-profile2.4.1Creditmemo type mismatch, sleep interval
module-plenty-client2.1.2API log payload exclusion, PHP 8.4 fixes
module-plenty-profile2.1.2Setup queue sleep intervals, action handler pool
module-plenty-item2.4.0SKU to variation ID lookup
module-plenty-stock2.0.1REST API layer, warehouse management, listing UI
module-plenty-attribute2.0.3Queue consumer sleep interval
module-plenty-property2.0.4Queue consumer sleep interval
module-plenty-stock-profile2.0.5Queue consumer sleep interval
module-url-rewrite-generatorQueue consumer sleep interval
+ 8 more modulesvariousPHP 8.4 fixes, copyright updates

Resources


Questions about the upgrade? Reach out to us at support@byte8.io.