Mage2Plenty v3.2 - Stability, Performance & PHP 8.4 Compatibility
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
Circuit Breaker for Relation Link Processing
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
SaveItemResultDatawere 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:
- No log level filtering — All severity levels (debug, notice, warning) were stored regardless of the configured log level
- Cleanup OOM — The cleanup cron used
collection->walk('delete'), loading every row as a PHP model object — impossible on tables with millions of rows - 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 50000batching - "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
- Review notification settings — The default log level is now "error". If you need lower-severity notifications, adjust the log level in your profile configuration.
- Check notification table size — If your
plenty_profile_notificationtable has grown excessively, the improved cleanup cron will now handle it automatically. For very large tables (50M+ rows), consider runningTRUNCATE TABLE plenty_profile_notificationduring a maintenance window for an immediate fix. - 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
| Module | Version | Key Changes |
|---|---|---|
| module-plenty-item-profile | 3.0.2 | Circuit breaker, error handling, async media checksum, PIM endpoint fix |
| module-profile-notification | 2.1.0 | Table bloat fix, log level filtering, config toggle, batched cleanup |
| module-plenty-order-profile | 2.4.1 | Creditmemo type mismatch, sleep interval |
| module-plenty-client | 2.1.2 | API log payload exclusion, PHP 8.4 fixes |
| module-plenty-profile | 2.1.2 | Setup queue sleep intervals, action handler pool |
| module-plenty-item | 2.4.0 | SKU to variation ID lookup |
| module-plenty-stock | 2.0.1 | REST API layer, warehouse management, listing UI |
| module-plenty-attribute | 2.0.3 | Queue consumer sleep interval |
| module-plenty-property | 2.0.4 | Queue consumer sleep interval |
| module-plenty-stock-profile | 2.0.5 | Queue consumer sleep interval |
| module-url-rewrite-generator | — | Queue consumer sleep interval |
| + 8 more modules | various | PHP 8.4 fixes, copyright updates |
Resources
Questions about the upgrade? Reach out to us at support@byte8.io.
