v2.6.2 Latest version

Fix

Critical fix: the scheduled export task no longer propagated price or content changes made in Dolibarr to Shopify, and had not since version 2.2.0 at least (only manual synchronisation and the creation of a product worked). A modified price now goes to the head of the queue, other changes (title, description, photos) are served by a reserved share of every run, and all products, variants included, are processed in turn instead of the same 10 every time. After updating, disable then re-enable the module to apply the migration: prices modified in the last 30 days are then sent to Shopify over the following runs

Fix

Variants deliberately deleted in Dolibarr are no longer recreated by the “Repair variants” tool when Dolibarr is the source of truth, and an unlinked product no longer touches the Shopify page of its former parent (it can no longer replace it with a single variant)

Fix

Re-enabling the module no longer produces the “Duplicate entry 'card-1-1'” error (duplicate payment mapping) and attaching the settings to the store now completes; a database already affected is repaired automatically at the next activation

Fix

A product whose two Dolibarr attributes carry the same label is no longer refused over and over by Shopify: homonymous attributes are merged into a single option, and a product that would exceed the store's option limit is refused locally with a message naming the options and variants involved, sending nothing to Shopify

Fix

Stock: the module never invents a reference quantity of 0 any more. A line whose stock reference is unknown is refused on its own, and the other lines of the batch go through normally

Enhancement

The “Repair variants” tool is greyed out, with the reason displayed, as soon as Dolibarr is the source of truth for the store's products; attributes are found by their label regardless of case, accents or punctuation

v2.6.1

Fix

Dolibarr stock flows to Shopify again: updates were refused as soon as a product already had online stock (“changeFromQuantity”). The module now reads the quantity actually recorded at Shopify and sends only the difference, groups updates in batches, and a temporary Shopify outage no longer puts products into permanent failure; products left stuck are re-queued automatically

Fix

The module's REST API had been answering with a 500 error since 2.6.0, even with a valid key: fixed and verified over real HTTP on Dolibarr 18 and 24 from the delivered package

Fix

The maintenance tools finally open (the tab crashed on opening), and the “Status mapping” tab, which had no effect on your orders, is removed — its old links redirect to “Order configuration”

Fix

The Webhooks tab no longer crashes: unticking “Immediate processing” or emptying a numeric field caused a fatal error, and choosing the blank line in “Webhook user” made all your webhooks answer with a 500 error

Fix

Saving a store's product category no longer silently erases its order, invoice and quotation tags. To check: open each store sheet, “Categories and tags” tab, and make sure the three tags are filled in

Fix

A manual collection is no longer mistaken for an automatic one: its products are attached again, and collections driven by conditions are reported separately on the synchronisation screen

New

An order whose customer has no e-mail (phone only, for example) is now imported: the customer is found by Shopify identifier, phone, or name and address, and created without an e-mail as a last resort

Enhancement

A collection's image is no longer re-sent to Shopify at every synchronisation: fewer duplicate files and shorter cycles (each image is re-sent once after the update)

Enhancement

The “Photo duplicates” tool now only offers genuinely identical copies, nothing is ticked by default and the module re-checks before deleting

Enhancement

A product's JSON export no longer mistakes a numeric SKU for a Shopify identifier, and the module's dedicated journal can finally be more detailed than Dolibarr's (Debug level)

v2.6.0

New

The module now keeps its own journal: every synchronisation cycle is traced with an identifier, its origin — scheduled job, screen, webhook, API — and its outcome (duration, products processed, errors, images). A support request now starts from facts instead of a round of questions

New

A line is written when each cycle STARTS, before any work. That is the decisive point: without it, a scheduler that is not running and a scheduler running with nothing to do leave exactly the same absence of trace. With it, "last scheduled cycle: four days ago" becomes an answer

New

New "Download the journal (CSV)" button: you download it and attach it to your message. It is deliberately bounded and contains exactly what is shown on screen — no order contents, none of your customers' personal data

New

Shopify connection: a confirmation page now appears once, at your next store reconnection — it shows your Dolibarr address and asks for confirmation before anything is sent; subsequent reconnections from the same address stay silent as before

Security

Security: your Shopify credentials (access token, API keys) are no longer shown in clear text on the configuration screen, the diagnostic export now masks any sensitive-looking field regardless of its name, and a licence can now be properly revoked when needed

Enhancement

The journal is written on a separate database connection, so its trace survives even when the operation it describes fails and rolls back its own writes. In other words, the most interesting failure is precisely the one that leaves a trace

Enhancement

This release also brings in ten batches of earlier work that had never been published: hardening of the Shopify connection recovery, cap on licence linking attempts, bounded licence revalidation with a visible failure, and removal of personal data from the website's application logs

v2.5.7

Fix

Critical fix: on a Shopify store configured with several locations/warehouses, the stock-only re-sync cycle (when a product's content has not changed since the last push) was systematically rejected by Shopify. An integrator reported 141 errors out of 158 products, with stock staying at its old value on Shopify with no update ever going through. The cause: the reference quantity was compared against a Shopify stock across all locations combined, whereas Shopify actually compares it against the single location configured for your store — invisible on a single-location store, the defect appears as soon as a second location exists. It is now always read at the location actually configured for your store. After updating, re-run a stock sync for the products previously in error

Fix

Fix: a product with several variants no longer has all its variants blocked by one variant's issue — if a variant cannot be re-synced on a given cycle, the other variants of the same product, correctly synced, are no longer held back together with it

Fix

Fix: a genuine Shopify location configuration problem (location deleted, invalid, or disabled — e.g. an old warehouse closed but not deleted) is now clearly reported in the logs and the sync summary, with the action to take depending on the case. A misconfigured location identifier is also now detected immediately, without waiting for the call to Shopify

Fix

Fix: a temporary slowdown imposed by Shopify (rate limiting, normal on a large catalogue) is never confused with this location configuration problem — it keeps following the normal path, with a retry on the next cycle

Fix

Fix: an item correctly set with a stock of zero is no longer ever confused with an item whose quantity could not be read — a legitimately null stock at the configured location is now correctly sent to Shopify

Fix

Fix: on an installation with several Shopify stores, a product's sync tracking stays correctly isolated per store, with no mixing between stores; the two counters introduced by this version are also now visible directly on the manual sync screen, as dedicated banners

Enhancement

The installation package is back under 2 MB, installable through Dolibarr's deployment screen regardless of the default upload limit

v2.5.6

Fix

Critical fix, accounting impact: since the 18 September 2026 update (version 2.5.5), a Shopify order carrying an order-wide discount (promo code or automatic discount applied across several items) could be imported with a discount close to double the amount Shopify actually granted. On an order of €2,520.00 excl. VAT discounted by 5% (€126.00 excl. VAT), the import kept €245.70 excl. VAT. The order-wide discount amount is now taken directly from the breakdown Shopify already computes per line item, read only once — double-counting becomes structurally impossible

Fix

Fix: a discount targeting only some of your items (e.g. "-10% on sale items") could, in some cases, be calculated on the value of all items in the order rather than only the ones concerned, present since the same 18 September update

Fix

Fix: with some third-party discount apps or Shopify Functions that already reflect the order-wide discount in the price Shopify displays, the first fix in this version still counted it a second time. The calculation now reads each discount allocation only once, regardless of how Shopify otherwise displays the line price

Fix

Fix: marketplace orders (Nature & Découvertes and similar channels), which do not always state the VAT rate on each item, could have their order-wide discount overestimated by 20%; the module now falls back to your Dolibarr product's VAT rate for this calculation, as it already does for the line itself

Fix

Fix: an order with mixed VAT rates (e.g. 5.5% and 20% on the same order) allocated its entire order-wide discount to the highest rate; a discount line is now created per VAT rate actually concerned

Fix

A discount announced by Shopify but not found in the line-item breakdown no longer disappears silently: it is now logged for investigation

v2.5.5

New

The module now keeps its own log, separate from Dolibarr's general log, and a "Download the module log" button is offered on the Support tab. If something goes wrong, you attach it to your message: the diagnosis starts from facts instead of a round of questions. Rotation, archiving and purge are handled by Dolibarr itself, so there is no extra setting to learn

Fix

Fix, accounting impact: a global discount spread across line items was never applied on two import paths — the historical import and the single-order fetch, that is, the path used after a new order notification. A piece of information needed for the decision was not requested from Shopify, so the condition was always false: the order was recorded at full price, with no error and no warning

Enhancement

A product left without images on Shopify is now counted and named — on the synchronisation screen, in the scheduled task report and in the log. The module declines the upload when it finds no image on the Dolibarr side, so as not to remove your existing visuals without a replacement; until now it said so only in a technical line nobody read

Fix

Fix: the stock of a variant with no matching SKU was never sent to Shopify, and nothing said so. The variant stayed indefinitely at whatever quantity it held when the mismatch appeared — sellable while out of stock, or unsellable while in stock — all the while the report announced a successful synchronisation

Enhancement

Dolibarr variants with no Shopify counterpart, and Shopify variants with no Dolibarr counterpart, are now counted, listed per product and flagged as not synchronised — in the synchronisation report as well as on the diagnostics screen

Fix

Fix: a product whose photos had disappeared on the Shopify side (product deleted then recreated, media removed by hand, backup restore) never got them back. The module relied on a fingerprint of the Dolibarr images to conclude that Shopify already held them, and no purge cleared that fingerprint: the correct procedure, correctly applied, could not work

Enhancement

Purges now clear the image memory, a skipped upload is reported in the synchronisation report, and a "force a full image re-upload" action for a single product is available in the configuration — with no SQL query and no global purge

Enhancement

Accessibility: 52 pieces of text shown in our brand colours fell short of the contrast required by WCAG AA. Fixed in the emails we send, the website screens and the module stylesheets, using darkened variants that keep the same hue

v2.5.4

Security

From 12 November 2026, an expired licence stops synchronisation in both directions — including Shopify orders flowing back into Dolibarr. Until now, only support and downloads were suspended. If your licence is active, nothing changes until it expires. The date comes from our servers: if they do not answer, nothing stops

Breaking

The stock synchronisation direction no longer defaults to "both ways" but to "Dolibarr to Shopify". If you had already chosen an explicit setting, it is kept as is; otherwise, check the Configuration screen

Fix

Fix: "Your licence has expired" was shown when it was in fact our server that had failed to answer. An outage on our side no longer presents itself as a problem on yours

Enhancement

You are now warned before your licence expires, by email and by an alert inside the module showing the exact date

Enhancement

Supported Dolibarr versions: back to 18.0 → 24.x. Version 2.5.3 had narrowed the range to 23.0, which excluded 18 — the only older branch still maintained. Three targets are tested on every release (18, 23, 24); intermediate versions are declared compatible without being tested

v2.5.3

Fix

Multicompany fix: on installations where Doli2Shop is configured on an entity other than the first one, no webhook was ever accepted. The entry point always ran in the first entity and could not find the signing secret there: orders, products and shipments stopped coming through, without a single error message, and nothing was kept to be replayed later

Fix

Multicompany fix: product photos never reached Shopify. Dolibarr stores documents in a sub-folder named after the entity number, which the module did not recognise — the diagnostic screen reported "no product with at least one photo" while the ERP showed them

Fix

Multicompany fix: VAT on imported orders was computed using the company record of the first entity instead of the one the order belongs to

Fix

Multicompany fix: default payment mappings (card, bank transfer, cheque, PayPal…) were never created on a secondary entity. They are now seeded per entity, and never overwrite a mapping you have changed

Fix

Fix, all installations: a warning claiming a photo was not indexed was written for every product on every synchronisation, including when it was perfectly indexed — and each product was read from disk twice

Fix

Fix, all installations: your product photos were duplicated on every notification from Shopify — a mere price or stock change was enough to drop another copy. One customer had four copies of the same image on a single product, three of them created on the same day. A cleanup screen is provided for the duplicates already accumulated: it shows what will be deleted before acting, and never touches a photo you uploaded yourself

Enhancement

New document, in five languages: the go-live procedure for connecting Doli2Shop to a Dolibarr that already holds your sales history — the case of a store migrated to Shopify from PrestaShop, WooCommerce or Magento. It also states, explicitly, what it does not protect against

v2.5.2

Fix

Critical fix: on some installations, the Shopify connection had to be re-established manually every day. The default store kept two copies of its credentials and the automatic renewal only updated one of them; since a Shopify token is single-use, the forgotten copy expired. Both copies are now kept in step

Fix

Fix: each variant's label was being replaced by the parent product title on every update coming from Shopify, including a simple price or stock change. Labels are now recalculated as they are on creation, and the repair tool finds them again even once they have already been linked

Fix

Fix: on the webhooks screen, the save button had no effect — the list of tracked events could not be changed. A page structure defect prevented the form from being submitted

Fix

Fix: the product synchronisation screen and the scheduled task were not looking at the same scope. A product filed under a sub-category was synchronised without ever appearing on screen, which reported "no products". Both now share the same definition, and a new go-live date setting lets you exclude orders predating your move to Shopify

Fix

Fix: on multi-store installations, the synchronisation screen counters counted each product once per store it was present in. Displayed totals will therefore go down: they are now correct

Fix

Fix: the historical order import never reported where it stood — "completed" always stayed no, statistics stayed empty, and changing the start date midway had no effect. The import now reports its progress, and can no longer declare itself complete after a failure

Enhancement

Robustness improvement: a malformed request sent to the billing service now receives a clear error response instead of a server error, and no internal technical message is returned to the caller

v2.5.0

New

New: each synchronisation flow (products, stock, prices, orders) now has its own configurable direction — Dolibarr to Shopify, Shopify to Dolibarr, or both. You decide, flow by flow, which system is authoritative

New

New: a control API lets you trigger and monitor synchronisations from your own tools

Enhancement

The module is now available in five languages: French, English, German, Spanish and Italian

Fix

Critical fix: the shipment catch-up scheduled task no longer started at all, leaving no trace whatsoever in Dolibarr — only the server log recorded it. An automatic check now prevents this kind of silent failure from recurring

Fix

Fix: two other scheduled tasks failed for a related reason, including the webhook health check — which broke down precisely when recording an incident, that is, when it was most needed

Fix

Fix: products with variants produced around thirty warnings on every image synchronisation

v2.4.8

Fix

Critical fix: viewing one page could disable the buttons on another. The module's internal calls rotated the session security token, and the Health page triggers one per store as soon as it opens: on a three-store installation, merely opening that page was enough for clicks on the Webhooks page to be rejected, silently

Fix

Fix: thirty actions across nine administration pages could be rejected with no message and no trace when the security token was refused — including linking a licence number to a store, which could therefore fail without any indication. All of them now display an explicit error

Fix

Fix: a synchronisation could switch off the webhooks of other stores

v2.4.7

Fix

Fix: on the webhooks screen, "Configuration saved" was displayed without the state actually changing. Display and saving were not looking at the same database row: you disabled a webhook, the page confirmed, and nothing moved

Fix

Fix: disabling now removes every relevant subscription rather than just the first one found — a twin row can no longer bring back a webhook you have just removed. Enabling reuses an existing subscription instead of creating another one

Fix

Inconsistencies inherited from installations predating multi-store support are corrected along the way: a row left "active" with no actual subscription is reset

v2.4.6

Fix

Fix: with several stores connected, the Webhooks page displayed the selected store but saved against another one — webhooks could not be disabled and the Save button appeared to do nothing. Display and saving now share the same per-store filter, and every error is shown in full instead of an empty message

Fix

Critical fix: on hardened installations (anti-CSRF token renewed on every page), every admin action of the module was silently rejected — including the setup wizard. Token checking now matches Dolibarr core, and a rejection is always reported on screen

Enhancement

Robustness: a database incident while saving webhooks no longer produces a blank page — the error is shown along with the webhook concerned, and the remaining ones are still processed

v2.4.5

Enhancement

Stock push to Shopify is now asynchronous: validating an invoice returns immediately, even when Shopify is slow or unreachable (no more multi-minute validations). A scheduled task pushes stock every 5 minutes, merging movements and retrying automatically after a failure

Fix

Critical fix: on Dolibarr 18 to 22, connecting a store returned an HTTP 500 error on the way back from Shopify and the store was lost — the module relied on a core feature only introduced in late 2025

Fix

Fix: on strict SQL mode hosting, webhooks were never registered — the timestamps sent by Shopify were rejected by the database. They are now converted and stored in universal time

New

New "Discount repair" tool: repairs orders imported before 2.2.9 whose percentage discount was under-valued — preview before applying, drafts only, audit trail preserved

Enhancement

Store connection: the "Failed to save credentials" error now states its actual cause, and an incomplete database is reported with the steps to fix it (Diagnostics and Health pages)

v2.4.4

Fix

Fix: variant products imported from Shopify did not create a real Dolibarr variant — the parent/variant link stayed invisible in the interface, and the variant label could remain identical to the parent product's

New

New "Repair variants" button: retroactively links catalogues already imported, with no re-import and no duplicates, in batches and safe to run again

v2.4.3

Fix

Fix: importing products with variants failed when the same reference (SKU) is shared across several Shopify products — the module now reuses the existing product instead of failing, and shows the full error reason for any other issue

Fix

Fix: order lines coming from bundle/pack apps ("build your own pack") were not created in Dolibarr — billable products grouped in a bundle are now imported correctly (free 0-euro components are still ignored)

v2.4.2

Fix

Critical fix: Dolibarr stock was never pushed to Shopify (restocking, in-house production, manual corrections) — Shopify stock drifted with each sale, down to false negative values. Every Dolibarr stock movement is now synchronized to Shopify in real time (absolute value, never negative)

New

New "Realign stock to Shopify" button: pushes the Dolibarr stock of all mapped products at once — immediately repairs Shopify values skewed in the past, without waiting for each product's next movement

Enhancement

Multi-store: stock is pushed to every store where the product is mapped, using each store's own credentials

Enhancement

Observability: every stock push is traced in the action log, and the "last realignment" state (date, products, errors) is shown in the admin

v2.4.1

Security

Shopify 2026 compliance: native support for expiring OAuth tokens (60-minute access token + refresh token), required by Shopify by January 1, 2027 — transparent automatic refresh, already-connected stores migrate in one click via the "Reconnect" button

New

New Shopify Collections API 2026-07: collections created with the new model (Shopify rollout from July 1, 2026) are now visible and synchronized — no more silent disappearance

Fix

Critical fix: more reliable product/stock sync — a disabled variant sometimes remained visible on Shopify, and diverging stock levels (sometimes negative) were no longer silently corrected; errors are now logged and surfaced

Enhancement

Instant diagnostics: per-store connection and health tests now run in the background, without slowing down the page

Enhancement

More reliable telemetry: the module now reports its real domain and Dolibarr version on every channel, eliminating false pending installations

v2.4.0

New

Multi-store: several Shopify stores configurable on a single Dolibarr installation, with license, settings and navigation specific to each store (accounting always stays unified)

New

Detailed per-store health diagnostics: connection and webhooks, license, sync counters — each store is checked independently

Enhancement

Larger store selector and redesigned context bar across all multi-store admin pages

Fix

Critical fix: a shipment left in draft status after a failure (warehouse/stock) was never caught up automatically — it is now validated and closed by the periodic catch-up job

Fix

Display fix: incorrectly encoded accented characters (double encoding) fixed throughout the admin interface

Fix

Fix: a store's license status could get stuck on "unknown" — verification is now reliable and never downgrades a default store

v2.3.2

Fix

Critical fix: some orders were no longer fetched from Shopify (regression introduced in 2.3.0) — order synchronization works normally again

Fix

Fix: webhooks registered on an outdated Shopify API version are now automatically re-registered during health checks, for each store

Fix

Fix: module activation blocked (blank page) on multi-store installations

Security

Security: connecting a Shopify store can no longer be done by manually entering a token — only through Shopify's secure OAuth flow

v2.3.0

New

Multi-store (foundations): several Shopify stores managed from a single Dolibarr installation with unified accounting — the existing store is migrated automatically, with no service interruption

New

New store administration interface: add, connect, manage webhooks and license, per store

Security

Security: Shopify connections are now protected with cryptographic keys (OAuth RSA) instead of a shared secret

New

New support tools: export a full order's JSON to speed up troubleshooting

New

Shipping and billing addresses are now displayed directly on the order record

Security

Security: strengthened CSRF protection on sensitive actions (configuration, license)

v2.2.9

Fix

Fix: percentage discounts undervalued — the discount was computed on the tax-excluded base then divided a second time by (1 + VAT) as if it were a tax-included amount. Orders with a percentage promo code now match the exact amount shown by Shopify (e.g. 5% = −€151.20 incl. tax, not −€126)

Enhancement

Documentation: table of the 4 Dolibarr stock decrease rules (order, invoice, shipment, shipment closing) and recommendation for mixed TakePOS counter + Shopify shops

v2.2.8

Fix

Critical fix: stock not decremented when importing Shopify orders — the warehouse was not passed at invoice validation. All 4 Dolibarr stock decrease rules (order, invoice, shipment, shipment closing) are now covered

Fix

Fix: the v2.2.4 permissions migration (module ID change) now runs automatically on activation — user rights are preserved when upgrading from a version older than 2.2.4

Fix

Webhooks fix: wrong callback URL (missing /custom/ path) when no explicit configuration was set, and the events retention days setting is now honored by the purge

Enhancement

Robustness: explicit log warnings when no warehouse can be resolved, and safeguards against fatal errors if the outbound Dolibarr → Shopify sync (planned for v2.4.x) is enabled prematurely

v2.2.7

Fix

Critical fix: document API calls returning 404 on subdirectory installations — a leading slash was overriding the subdirectory path (issue #288)

Fix

All document access points (product and category images) now correctly honour the installation subdirectory

Fix

Fixes Dolibarr installations running in a subdirectory (version 2.2.6 already worked around this via the local SQL fallback)

v2.2.6

Fix

Critical fix: resilient product image sync — automatic SQL fallback (llx_ecm_files) when the Dolibarr REST API /documents endpoint is unreachable (404, timeout, HTML in body). Product images now correctly synced to Shopify even on restrictive hosting (issue #286)

Fix

Critical fix: multi-tenant entity filter added to image SQL query — prevents exposing images from other Dolibarr entities in multi-company installations

Fix

Fix: image sort key mismatch (filename vs relativename) — sort by position now actually works

Enhancement

Image instance cache reduces 3 redundant SQL+API calls per product to 1 during sync

v2.2.5

Fix

Critical fix: verifToken() function not loaded on some PHP-FPM stacks, blocking Shopify OAuth — 4 module files now explicitly include the compatibility.lib.php polyfill

v2.2.4

Fix

Critical fix: Dolibarr module ID migration (436950 → 351003, official range allocated to Association P'tite Tête) — automatic SQL migration preserves existing permissions

v2.2.3

Fix

Critical fix: admin pages (setup, wizard, product sync) referenced a non-existent CSS file — CSS loading and page display now correct

v2.2.2

New

Shopify bundle/gift line handling (USH Bundles, EasyGift, etc.) — 3 configurable modes: ignore, import as comment, import as standard line

Fix

Critical fix: variant stock sync now runs every hour instead of 24h

Fix

Fixed webhook products/delete — invalid SQL query corrected

Fix

Critical fix: no more duplicate products created on Shopify after purging a product with variants

Fix

Improved anti-loop: inter-process sync/webhook protection to prevent deadlocks

Fix

Diagnostic false positive fixed: API Documents 404 on non-existent test product is now reported as warning instead of error

Enhancement

Enhanced diagnostic: old image path detection + server loopback test

Enhancement

Dynamic versions everywhere (no more hardcoded versions in UI)

Enhancement

Website admin: new 'SQL Migrations' section that lists numbered SQL scripts and allows one-click execution with automatic tracking

v2.2.1

New

Proactive email alert system (webhook errors + system health)

New

Smart per-type throttling with configurable cooldown

Enhancement

Complete Shopify API 2026-07 audit — anticipate breaking changes

Enhancement

PHPStan level 6 + test coverage 35% → 71%

Enhancement

Module version centralization (no more hardcoded versions)

Fix

Removed ~1,974 lines of dead code

Fix

Dolibarr 23 compatibility — systematic audit and corrections

v2.2.0

New

Real-time webhooks Shopify → Dolibarr (orders, shipments, payments)

New

Guided 6-step configuration wizard

New

Module health monitoring dashboard

New

2-level shipping mapping (title + actual carrier)

New

Simplified interface: 3 tabs instead of 5

New

Automatic catchup of missed orders (safety net CRON)

New

Configurable auto-creation of invoices, payments and shipments

Enhancement

Complete order configuration in wizard

Enhancement

Automatic webhook and CRON activation at wizard completion

v2.1.8

New

Multi-platform integrated support ticket system

New

Complete website redesign with MVC architecture

New

Degraded mode for expired licenses

New

Centralized internationalization with Twig

New

Bidirectional Shopify webhooks + real-time Dolibarr triggers

v2.1.7

New

Shopify Billing API - Dual-channel architecture

New

Complete web admin interface

Fix

OAuth license link fix

Fix

Discounts not applied on services

Enhancement

Configuration wizard improvements

v2.1.6

New

Complete security audit - 86 issues fixed

New

Bidirectional Shopify → Dolibarr import

Security

CSRF protection on 15 files

Security

Security score 6/10 → 9/10