bonlineco / module-tajersystem
Syncs orders, products, and stock data from Magento 2 to TajerSystem ERP.
TajerSystem Connector for Magento 2
Official connector module that links a Magento 2 / Adobe Commerce store to
TajerSystem — real-time profit, VAT and inventory
analytics for Magento merchants.
See what it feeds: open the live TajerSystem demo — one click, no signup.
What's new in 2.7
Version 2.7 turns the sync from "orders and totals" into an accounting-grade
financial event ledger living inside your own Magento database:
- Immutable financial events — order placement, invoices, payment
authorizations/captures, credit memos, refunds, shipments, deliveries and
returns are each recorded as append-only events, protected by database
triggers so history can never be rewritten (not even by the module itself). - Outbox with auto-recovery — financial changes are delivered through a
durable outbox (tajersystem_financial_change); a recovery cron re-queues
anything missed within 5 minutes, so no financial change is ever lost. - Delivery evidence endpoint —
POST /V1/tajersystem/orders/:orderId/delivery-evidence
records real carrier delivery confirmation instead of inferring it from a
mutable order status (essential for COD profit recognition). - Structured tax evidence — order payloads carry explicit net/tax/gross
per line; VAT reports reconcile against evidence, not reverse-engineered totals. - Consent-gated marketing touchpoints (dormant by default) — allowlisted
UTM/referrer capture that only fires behind a CMP-owned consent cookie; the
module never sets the cookie itself. - Still zero extra infrastructure: DB-backed queues + standard Magento
cron. No RabbitMQ, no middleware.
See CHANGELOG.md for details. 2.7.1 fixes trigger installation
on MariaDB / MySQL 8.
What it does
- Real-time push sync — observers on
sales_order_save_after,
catalog_product_save_after,inventory_source_item_save_afterand
customer_save_afterpush changes to TajerSystem the moment they happen. - One-click connect — a Connect button in Stores → Configuration
generates a short-lived setup token; TajerSystem exchanges it for a scoped
integration token (POST /V1/tajersystem/exchange-token). No copying API
keys around. - Pull API for TajerSystem — REST endpoints under
/V1/tajersystem/*
let the platform manage orders (status, invoice, ship, refund, comment),
adjust stock, and update product price/status — so actions taken in
TajerSystem reflect back into Magento. - Backfill commands —
bin/magento tajersystem:sync:orders,
tajersystem:sync:products,tajersystem:sync:stockfor initial or
catch-up sync. - Housekeeping cron — expired setup tokens are cleaned automatically.
Requirements
- Magento Open Source / Adobe Commerce 2.4.x
- PHP 8.1+ (8.3 supported) with ext-bcmath (exact money math)
- MSI modules (
magento/module-inventory-api) recommended for salable-qty sync
Installation
Via app/code
mkdir -p app/code/Bonlineco/TajerSystem
# copy this repository's contents there, then:
bin/magento module:enable Bonlineco_TajerSystem
bin/magento setup:upgrade
bin/magento setup:di:compile
bin/magento cache:flush
Via composer (path or VCS repository)
composer config repositories.tajersystem vcs https://github.com/o0mohd0o/magento2-tajersystem-connector
composer require bonlineco/module-tajersystem
bin/magento module:enable Bonlineco_TajerSystem && bin/magento setup:upgrade
Connecting your store
- Create a free TajerSystem account at tajersystem.com (14-day trial, no card).
- In Magento admin: Stores → Configuration → TajerSystem → Connect — click Generate connect link.
- Open the link — TajerSystem exchanges the setup token and starts the first
full sync automatically. Your profit numbers appear within minutes.
Security notes
- The setup token is single-use and short-lived; the permanent integration
token is scoped to the endpoints listed above. - The module only talks to the TajerSystem URL configured under
Stores → Configuration → TajerSystem (defaulthttps://app.tajersystem.com). - No telemetry, no third-party calls.
License
OSL-3.0 — the same license family as Magento Open Source itself.
Built by BONLINE TECHNOLOGIES LTD — a team
that runs Magento stores, for people who run Magento stores.
Changelog — Bonlineco_TajerSystem Magento 2 Module
All notable changes to the bonlineco/module-tajersystem module are documented in this file.
2.7.1 — 2026-07-24
Fixed
- Production activation compatibility fixes
- Completed Magento service-contract and queue message PHPDoc metadata.
- Created compound trigger bodies through Magento's
multiQueryAPI. - Marked the three trigger data patches
NonTransactionableso Magento does not wrap trigger DDL in a transaction. - Made the trigger patch intentionally non-revertable/data-preserving to avoid Magento's transactional DDL conflict.
2.7.0 — 2026-07-24
Added
- Immutable financial-event sync & payload contracts (Spec 001 Reconciled Profitability)
- Added support for explicit contract-allowed financial event payload types (
order_placed,invoice_issued,payment_authorized,payment_captured,credit_issued,refund_paid,shipment_completed,delivery_completed,return_received) carryingsource_namespace=magento:{store_code}and immutable storedeconomic_origin_key.
- Added support for explicit contract-allowed financial event payload types (
- Structured sales-line tax evidence capture
- Expanded order payload serialization in
OrderPayloadBuilderto preserve explicit net/tax/gross and structured output-tax evidence without totals-based inference, leaving output line recoverability fields null.
- Expanded order payload serialization in
- Consent-aware marketing touchpoint capture
CaptureMarketingTouchpointobserver wired to capture allowlisted UTM params, referrer, and consent-aware acquisition parameters on first landing.CopyMarketingTouchpointToOrderobserver transfers touchpoints from quote to order context for attribution processing.
- Durable queue topology & payload compatibility
- Enhanced queue message consumers and payload serialization to maintain backward and forward compatibility between Magento and TajerSystem SaaS versions.
2.6.0 — 2026-03-01
Changed
- Outbound sync request context header (Sprint E Task 7.3)
Model/Client/TajerSystemClientnow sendsX-Magento-Website-Idon outbound sync requests (orders/upsert,products/upsert,stock/update,customers/upsert).- This header carries Magento website context to TajerSystem's inbound webhook receiver for safer multi-connection mapping.
2.5.0 — 2026-03-01
Added
- Customer sync pipeline (Sprint E Task 6.1)
CustomerSyncObserverwired tocustomer_save_afterto publish customer sync messages.- Queue contract + wiring for customer sync: topic
tajersystem.customer.sync, publisher/topology bindings, queuetajersystem.customer.sync.queue, consumertajersystem.customer.sync.consumer. - Customer sync message + processing classes:
CustomerSyncMessage,CustomerSyncConsumer, andCustomerPayloadBuilder.
- Customer pull endpoint —
GET /rest/V1/tajersystem/customersfor TajerSystem ERP pull sync with pagination and optionalupdated_after/website_idfiltering.- Service contract:
Bonlineco\TajerSystem\Api\CustomerManagementInterface(getList). - Implementation:
Bonlineco\TajerSystem\Model\Customer\GetCustomersService.
- Service contract:
Changed
etc/acl.xml— addedBonlineco_TajerSystem::customersACL resource.etc/di.xml— addedCustomerManagementInterfacetoGetCustomersServicepreference.etc/webapi.xml— added routeGET /V1/tajersystem/customerswithBonlineco_TajerSystem::customersresource.composer.json— version bumped to2.5.0.
2.4.0 — 2026-03-01
Added
- Inbound product status update endpoint (Task 4.3) —
POST /rest/V1/tajersystem/products/statusallows TajerSystem ERP to enable or disable a product in the Magento catalog.- Service contract:
Bonlineco\TajerSystem\Api\ProductStatusManagementInterfacewithupdateStatus(string $sku, bool $enabled)method. - DTO interface:
Bonlineco\TajerSystem\Api\Data\ProductStatusResultInterface— returnssuccess,sku,oldStatus,newStatus, andmessage. - DTO implementation:
Bonlineco\TajerSystem\Model\Product\ProductStatusResult— immutable constructor-promoted DTO. - Service implementation:
Bonlineco\TajerSystem\Model\Product\UpdateStatusService— validates SKU (trims whitespace, rejects empty), loads product by SKU viaProductRepositoryInterface, sets catalog status (1=enabled, 2=disabled), detects no-ops (product already at desired status), saves viaProductRepositoryInterface::save(). Logs the status change with old/new status details. - Request body:
sku(string, required) — Product SKU to update.enabled(boolean, required) —trueto enable the product (status=1),falseto disable it (status=2).
- Response:
{ "success": bool, "sku": string, "old_status": string, "new_status": string, "message": string } - ACL resource: Reuses
Bonlineco_TajerSystem::products— the existing dedicated ACL resource for product operations. - 8 unit tests in
Test/Unit/Model/Product/UpdateStatusServiceTest.phpcovering: enable product, disable product, already-enabled no-op, already-disabled no-op, empty SKU rejection, whitespace-only SKU rejection, non-existent product rejection, and SKU whitespace trimming. - Total unit tests: 130 (across all module services).
- Service contract:
Changed
etc/webapi.xml— added route forPOST /V1/tajersystem/products/statuswithBonlineco_TajerSystem::productsACL resource.etc/di.xml— added preferences:ProductStatusManagementInterface→UpdateStatusService,ProductStatusResultInterface→ProductStatusResult.composer.json— version bumped to2.4.0.
2.3.0 — 2026-02-28
Added
- Inbound product price update endpoint (Task 4.1) —
POST /rest/V1/tajersystem/products/priceallows TajerSystem ERP to update a product's regular price and optional special (sale) price in the Magento catalog.- Service contract:
Bonlineco\TajerSystem\Api\ProductPriceManagementInterfacewithupdatePrice(string $sku, float $price, ?float $specialPrice, ?string $specialFromDate, ?string $specialToDate)method. - DTO interface:
Bonlineco\TajerSystem\Api\Data\ProductPriceResultInterface— returnssuccess,sku,oldPrice,newPrice,specialPrice, andmessage. - DTO implementation:
Bonlineco\TajerSystem\Model\Product\ProductPriceResult— immutable constructor-promoted DTO. - Service implementation:
Bonlineco\TajerSystem\Model\Product\UpdatePriceService— validates inputs (non-empty SKU, non-negative price, special price less than regular price, Y-m-d date format), loads product by SKU viaProductRepositoryInterface, sets price and special price with date range (or clears special price when null), saves viaProductRepositoryInterface::save(). Trims SKU whitespace. Logs the update with old/new price details. - Request body:
sku(string, required) — Product SKU to update.price(float, required) — New regular price. Must be zero or positive.specialPrice(float, optional) — Special (sale) price. Must be less than regular price. Passnullto clear the special price and its date range.specialFromDate(string, optional) — Start date for special price (Y-m-dformat).specialToDate(string, optional) — End date for special price (Y-m-dformat).
- Response:
{ "success": bool, "sku": string, "old_price": float, "new_price": float, "special_price": float|null, "message": string } - ACL resource:
Bonlineco_TajerSystem::products— new dedicated ACL resource for product operations, nested under::config, titled "TajerSystem Product Management". - 11 unit tests in
Test/Unit/Model/Product/UpdatePriceServiceTest.phpcovering: regular price update only, price with special price and dates, special price without dates, SKU whitespace trimming, zero price allowed, empty SKU rejection, negative price rejection, negative special price rejection, special price exceeding regular price rejection, invalid date format rejection, and non-existent product rejection. - Total unit tests: 122 (across all module services).
- Service contract:
Changed
etc/webapi.xml— added route forPOST /V1/tajersystem/products/pricewithBonlineco_TajerSystem::productsACL resource.etc/di.xml— added preferences:ProductPriceManagementInterface→UpdatePriceService,ProductPriceResultInterface→ProductPriceResult.etc/acl.xml— addedBonlineco_TajerSystem::productsresource nested under::config.composer.json— version bumped to2.3.0.
2.2.0 — 2026-02-28
Added
- Inbound stock adjustment endpoint (Sprint C) —
POST /rest/V1/tajersystem/stock/adjustallows TajerSystem ERP to adjust stock quantities in Magento MSI (Multi-Source Inventory).- Request body:
sku(string, required) — Product SKU to adjust.quantity(number, required) — Target quantity (setmode) or change amount (deltamode).adjustment_type(string, required) —"set"for absolute quantity or"delta"for relative change (+/−).source_code(string, optional) — MSI source code. Defaults to the default source if omitted.reason(string, optional) — Human-readable reason for the adjustment, logged for audit trail.
- Response:
{ "product_id": int, "sku": string, "source_code": string, "old_quantity": number, "new_quantity": number, "adjustment_type": string } - ACL resource:
Bonlineco_TajerSystem::stock— new dedicated ACL resource for stock operations, nested under::config. - Dependency: Requires Magento MSI (
magento/module-inventory-api) for source item management.
- Request body:
Changed
etc/webapi.xml— added route forPOST /V1/tajersystem/stock/adjustwithBonlineco_TajerSystem::stockACL resource.etc/di.xml— added preference for the stock adjustment service contract.etc/acl.xml— addedBonlineco_TajerSystem::stockresource nested under::config.composer.json— version bumped to2.2.0, addedmagento/module-inventory-apitorequire.
2.1.0 — 2026-02-28
Added
-
Inbound shipment creation endpoint (Task 2.2) —
POST /rest/V1/tajersystem/orders/:orderId/shipallows TajerSystem ERP to create shipments with optional tracking information in Magento.- Service contract:
Bonlineco\TajerSystem\Api\ShipmentManagementInterfacewithcreateShipment(int $orderId, ?string $trackNumber, ?string $carrierCode, ?string $carrierTitle, ?string $comment, ?bool $notify)method. - Service implementation:
Bonlineco\TajerSystem\Model\Order\CreateShipmentService— ships all eligible items using Magento'sShipOrderInterface. When$trackNumberis provided, creates aShipmentTrackCreationInterfaceinstance with the given carrier code and title. Adds an optional status history comment. Sends customer notification email when$notifyistrue. ReturnsOrderActionResultInterface. - 5 unit tests in
Test/Unit/Model/Order/CreateShipmentServiceTest.php.
- Service contract:
-
Inbound refund/credit-memo endpoint (Task 2.3) —
POST /rest/V1/tajersystem/orders/:orderId/refundallows TajerSystem ERP to create full credit memos (refunds) in Magento.- Service contract:
Bonlineco\TajerSystem\Api\RefundManagementInterfacewithcreateRefund(int $orderId, ?string $comment, ?bool $notify)method. - Service implementation:
Bonlineco\TajerSystem\Model\Order\CreateRefundService— creates a full credit memo for all eligible items using Magento'sRefundOrderInterface. Adds an optional status history comment. Sends customer notification email when$notifyistrue. ReturnsOrderActionResultInterface. - 4 unit tests in
Test/Unit/Model/Order/CreateRefundServiceTest.php.
- Service contract:
-
Inbound order comment endpoint (Task 2.4) —
POST /rest/V1/tajersystem/orders/:orderId/commentallows TajerSystem ERP to add status history comments to Magento orders.- Service contract:
Bonlineco\TajerSystem\Api\CommentManagementInterfacewithaddComment(int $orderId, string $comment, ?bool $notify, ?bool $visibleOnFront)method. - Service implementation:
Bonlineco\TajerSystem\Model\Order\AddCommentService— adds a status history entry with configurable storefront visibility via$visibleOnFront. Sends customer notification email when$notifyistrue. Persists viaOrderRepositoryInterface::save(). ReturnsOrderActionResultInterface. - 4 unit tests in
Test/Unit/Model/Order/AddCommentServiceTest.php.
- Service contract:
-
All three new service contracts reuse the shared
OrderActionResultInterfaceDTO from v2.0.0. -
All three endpoints require the
Bonlineco_TajerSystem::ordersACL resource. -
Total unit tests: 24 (11 from v2.0.0 + 13 new).
Changed
etc/webapi.xml— added routes forPOST /V1/tajersystem/orders/:orderId/ship,POST /V1/tajersystem/orders/:orderId/refund, andPOST /V1/tajersystem/orders/:orderId/comment, all withBonlineco_TajerSystem::ordersACL resource.etc/di.xml— added preferences:ShipmentManagementInterface→CreateShipmentService,RefundManagementInterface→CreateRefundService,CommentManagementInterface→AddCommentService.composer.json— version bumped to2.1.0.
2.0.0 — 2026-02-28
Added
- Inbound order status endpoint —
POST /rest/V1/tajersystem/orders/:orderId/statusallows TajerSystem ERP to push order status changes into Magento. Supports standard transitions, hold/unhold, cancellation, status history comments, and customer notification.- Service contract:
Bonlineco\TajerSystem\Api\OrderManagementInterfacewithupdateStatus(int $orderId, string $status, ?string $comment, ?bool $notify)method. - DTO interface:
Bonlineco\TajerSystem\Api\Data\OrderActionResultInterface— returnssuccess,message,orderId,status, andstate. - DTO implementation:
Bonlineco\TajerSystem\Model\Order\OrderActionResult— immutable constructor-promoted DTO. - Service implementation:
Bonlineco\TajerSystem\Model\Order\UpdateStatusService— handles the full transition logic:- Validates target status against
ALLOWED_STATUSES(pending, pending_payment, processing, complete, closed, canceled, holded). - No-op shortcut when the order is already at the target status.
- Special-case handling for
holded(uses$order->hold()),canceled(uses$order->cancel()), and unhold transitions (uses$order->unhold()then applies target status if different). - General transitions set both state and status via
STATUS_STATE_MAP. - Adds status history comment (default: "Status updated via TajerSystem ERP.") with configurable customer notification.
- Persists via
OrderRepositoryInterface::save(). - Comprehensive logging (request received, success, failure).
- Validates target status against
- ACL resource:
Bonlineco_TajerSystem::orders— nested under::config, titled "TajerSystem Order Management". - 11 unit tests in
Test/Unit/Model/Order/UpdateStatusServiceTest.phpcovering: valid status transitions, no-op for same status, invalid status rejection, hold/unhold/cancel special cases, unhold-then-transition, customer notification flag, and error propagation. - Test stubs expanded:
Phrase,LocalizedException,NoSuchEntityExceptionclasses added toTest/Stubs/magento_stubs.php;Orderstub now implementsOrderInterface.
- Service contract:
Changed
etc/webapi.xml— added route forPOST /V1/tajersystem/orders/:orderId/statuswithBonlineco_TajerSystem::ordersACL resource.etc/di.xml— added preferences forOrderManagementInterface→UpdateStatusServiceandOrderActionResultInterface→OrderActionResult.etc/acl.xml— addedBonlineco_TajerSystem::ordersresource nested under::config.composer.json— version bumped to2.0.0.
1.1.1 — 2026-02-23
Fixed
- Integration authorization rules silently deleted during token exchange — Magento's
Model\Plugin\IntegrationhooksafterCreate()andafterUpdate()onIntegrationServiceInterface. Withoutall_resourcesorresourceset on the integration model, the plugin callsgrantPermissions($id, [])with an empty array, which deletes all previously granted authorization rules. The fix sets'all_resources' => truein the integration data so the plugin callsgrantAllPermissions()instead, grantingMagento_Backend::all => allow(full API access). This is appropriate for the TajerSystem ERP integration.
Removed
AuthorizationServiceInterfacedependency fromIntegrationManager— no longer needed; permission granting is now handled automatically by Magento's Integration plugin via theall_resourcesflag.REQUIRED_RESOURCESconstant fromIntegrationManager— the explicit resource list is replaced by theall_resourcesapproach.
1.1.0 — 2026-02-23
Added
- Auth link flow — One-click store connection via setup token exchange.
ConnectButtonadmin block — renders "Connect to TajerSystem" button with AJAX-powered token generation.GenerateLinkadmin controller — generates setup token, derives TajerSystem app URL from API base URL, returns auth link. ACL-restricted toBonlineco_TajerSystem::connect.SetupTokenExchangeInterfaceservice contract — defines the REST exchange method.ExchangeTokenService— REST API handler: validates and consumes setup token atomically, creates Magento Integration viaIntegrationManager, returns access token.IntegrationManager— creates Integration with timestamped name, grants full API permissions viaall_resourcesflag, creates OAuth token, activates. Cleans up orphaned Integrations on failure.SetupTokenManager— generates 256-bit random tokens (10-min expiry), atomicvalidateAndConsume()via conditional SQL UPDATE,cleanup()for expired tokens.SetupTokenmodel withisExpired(),isUsed(),isValid()helpers.tajersystem_setup_tokenDB table with unique token constraint and expires_at index.- Resource model and collection for setup tokens.
CleanupExpiredSetupTokenscron job — runs hourly, deletes tokens older than 60 minutes.POST /rest/V1/tajersystem/exchange-tokenREST endpoint (anonymous access, token-based auth).- Admin route
tajersystem/connect/generateLinkviaetc/adminhtml/routes.xml. - "TajerSystem Connection" config group in
system.xmlwith connect button. Bonlineco_TajerSystem::connectACL resource.
Changed
etc/di.xml— addedSetupTokenExchangeInterface→ExchangeTokenServicepreference.etc/acl.xml— addedBonlineco_TajerSystem::connectnested under::config.etc/adminhtml/system.xml— added "TajerSystem Connection" group.etc/module.xml— addedMagento_Integrationto sequence dependencies.etc/crontab.xml— addedtajersystem_cleanup_setup_tokenshourly cron job.etc/db_schema.xml— addedtajersystem_setup_tokentable.etc/db_schema_whitelist.json— whitelisted new table.composer.json— addedmagento/module-integrationtorequire.
1.0.0 — 2026-02-23
Added
- Admin configuration — Website-scoped settings for API credentials, sync mode, retry limits, and debug logging under Stores > Configuration > TajerSystem > General Settings. API key stored encrypted via Magento's
Encryptedbackend model. - Event observers — Three global-scope observers (
OrderSyncObserver,ProductSyncObserver,StockSyncObserver) react tosales_order_save_after,catalog_product_save_after, andinventory_source_item_save_afterevents. Observers publish lightweight message DTOs to the queue without loading entities or calling APIs. - DB-backed message queue — Three topics (
tajersystem.order.sync,tajersystem.product.sync,tajersystem.stock.sync) with DB connection, single exchange (tajersystem.exchange), and three consumers (maxMessages=100 each). - Queue consumers —
OrderSyncConsumer,ProductSyncConsumer,StockSyncConsumerprocess messages by building payloads, tracking attempts viaSyncLogManager, and POSTing to the TajerSystem API. Transient errors trigger queue retry; permanent errors are consumed. - Payload builders —
OrderPayloadBuilder,ProductPayloadBuilder,StockPayloadBuilderload entities and build API payloads with idempotency keys. Stock uses data-deterministic idempotency (MD5 of qty values). - HTTP client —
TajerSystemClientwith Bearer auth, tenant ID header, idempotency key header, 30s timeout, debug logging, and transient error detection (0, 408, 429, 500, 502, 503, 504). - Sync log —
tajersystem_sync_logtable withSyncLogManagerfor attempt tracking, outcome recording, and retry limiting. Unique constraints prevent duplicate rows and idempotency keys. - CLI commands —
tajersystem:sync:orders,tajersystem:sync:products,tajersystem:sync:stockfor manual full/partial sync. Commands enqueue to the existing queue infrastructure. - Cron incremental sync —
IncrementalSyncruns every 5 minutes for websites withsync_mode=cron, processing entities changed since last successful sync. - Centralized topic constants —
Model/Queue/Topics.phpas single source of truth for all queue topic strings. - Unit test suite — 78 tests, 168 assertions across 11 test classes:
ConfigTest(16 tests) — All 12 Config helper methods.OrderPayloadBuilderTest(4),ProductPayloadBuilderTest(3),StockPayloadBuilderTest(5) — Payload structure, idempotency keys, edge cases.TajerSystemClientTest(10) — Headers, responses, errors, debug logging.OrderSyncConsumerTest(6),ProductSyncConsumerTest(3),StockSyncConsumerTest(3) — Consumer outcomes, retry logic.OrderSyncObserverTest(5),ProductSyncObserverTest(4),StockSyncObserverTest(5) — Publishing, guards, exception isolation.SyncLogManagerTest(8) — Attempt tracking, outcome recording, retry checks.
- Test infrastructure — PHPUnit 10.5, Magento type stubs (~370 lines), factory stubs, separate test Composer file, bootstrap that loads stubs before autoloader.
Requires 11
| Package | Constraint |
|---|---|
| ext-bcmath | * |
| magento/framework | ^103.0 |
| magento/module-catalog | ^104.0 |
| magento/module-checkout | ^100.4 |
| magento/module-config | ^101.2 |
| magento/module-integration | ^100.4 |
| magento/module-quote | ^101.2 |
| magento/module-sales | ^103.0 |
| magento/module-store | ^101.1 |
| magento/module-tax | ^100.4 |
| php | ^8.1 |
Requires-dev 1
| Package | Constraint |
|---|---|
| phpunit/phpunit | ^10.5 |
Suggests 2
| Package | Reason |
|---|---|
| magento/module-inventory-api | Required for MSI stock sync |
| magento/module-inventory-sales-api | Required for salable quantity calculation |
Compatibility
Each Magento release line is installed on its supported PHP versions, then the module is built (DI compilation + static-content deploy) and its unit and integration suites are run. The matrix shows the lines and PHP versions the module is confirmed to install and run on. Code-quality results further down (phpstan, phpcs, …) are reported separately and never affect compatibility.
Code Quality
Advisory checks against the module's source. Static analysis runs once across the whole module; PHPStan re-runs per Magento + PHP version because resolvable symbols differ between releases. These NEVER affect the Compatibility badge. A phpcs finding can't make a module incompatible.
Static analysis
Coding standards (phpcs), mess detection (phpmd), copy-pasted code (cpd), PHP cross-version compatibility, composer.json validity. Each runs once for the whole module.
| Tool | Status | Findings | Summary |
|---|---|---|---|
| PHPCS | Fail | 270 | 2 errors, 268 warnings (ruleset: Magento2), 231 auto-fixable with phpcbf |
| PHPMD | Warning | 15 | 15 rule violations (UnusedPrivateField:13, ExcessiveClassLength:2) |
| Cpd | Pass | 0 | |
| Composer validate | Info | 1 | valid; 1 advisory note (composer validate --strict) |
PHPStan
Type-checks the module's PHP against a real Magento install at the configured gate level. Re-runs per Magento and PHP version because resolvable symbols differ between releases.
Tests
Unit and integration suites, run for each applicable Magento and PHP version. A test failure speaks to the module's behaviour, not its compatibility with a Magento line, so it is reported here separately and never reddens the compatibility matrix.
Unit tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Integration tests
| Magento | PHP 8.2 | PHP 8.3 | PHP 8.4 | PHP 8.5 |
|---|---|---|---|---|
| 2.4.7 | N/A | N/A | ||
| 2.4.8 | N/A | N/A | ||
| 2.4.9 | N/A | N/A |
Security
Security checks run directly against the module: an audit of its declared dependencies for known vulnerabilities (composer audit) and a scan of its source for malware and web-shell signatures. Each runs once. A malware detection fails the version outright.
More from bonlineco
View vendorLightweight Alpine.js one-page checkout for Magento 2 — no Knockout, no RequireJS, plain REST. Works on stock Luma-based themes.
Arabic and RTL-ready invoices, credit memos, packing slips, order PDFs, and printable sales pages for Magento 2.
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.