#1011 J2Commerce Migrator 6.1.9: dry-run reports 0/0/0 for Products and Orders despite live non-empty data

Posted in ‘Technical Support / Bugs’
This is a public ticket

Everybody will be able to see its contents. Do not include usernames, passwords or any other sensitive information.

J2Commerce

Version
J2Commerce v6

Latest post by Richard Sparks on Wednesday, 09 September 2026 22:12 UTC

Richard Sparks

Environment: Joomla 6.1.3, PHP 8.4.20, MariaDB 12.2.2. Freshly migrated site: J2Commerce 4.1.7 upgraded to J2Commerce 6.6.1 core with J2Commerce Migrator 6.1.9, adapter "J2Commerce Migrator - J2Commerce 4 Adapter" enabled by default, Migrator dashboard shows "All Systems Go", connected to the site's own database, source detected correctly as J2Commerce 4.1.7.

 

Bug 1: The toolbar "Dry-run all" button (Migration Wizard, #j2cm-btn-dryrun-all) does nothing when clicked. Verified with a JS click-event and fetch/XHR interceptor: the click event registers correctly on the button element (confirmed via getBoundingClientRect/elementFromPoint), but zero network requests of any kind are fired afterward. Migration History stays "No migration history yet" no matter how many times it's clicked. The same interceptor reliably captures real AJAX calls for other actions on the same page, so this isn't an instrumentation problem.

 

Bug 2: The per-row "Dry-run" option (each tile's menu -> Run options -> Dry-run) does fire a real request (task=api.run&action=tools.runAdapterTool, returns {"success":true,"data":{"run_id":N}}) and logs a row to Migration History, but every single entity tested reports 0 migrated / 0 skipped / 0 errors -- including entities with substantial live data:

- Products: dry-run reported 0, but the live J2Commerce v4 catalog has 17 real products (confirmed in Catalog > Products).

- Orders: dry-run reported 0, but the live site has 101 real orders totalling $4,092.40 all-time (confirmed on the J2Commerce v4 dashboard).

- Also tested: Currencies, Countries, Shipping Methods, Shipping Rates, Tax Profiles, Custom Fields, Variants -- all returned 0/0/0.

 

For comparison, genuinely empty source tables (Coupons, Vendors, Product Prices/Options/Filters, Order Item Attributes, etc.) are correctly auto-marked "Synced / Empty Source" by a separate discovery pass -- that mechanism works correctly, which is why the 0/0/0 results above look like a real bug rather than "the store has no data."

 

Opening the detail page for one of these runs (Orders, run #5) shows: "0 lines - No log lines found" and the tool's own diagnostic message: "No activity log entries were captured within this run's time window. The run may have failed at the HTTP layer before any server-side logger was reached -- check the browser console or the global Joomla error log." No related PHP errors were visible in the browser console or Joomla's own error log at the time of the run.

 

This is a local development site (not publicly reachable), so I can't offer login access for you to reproduce directly -- happy to provide additional logs, HAR files, or a screen recording if useful, or to test a specific fix/build if you have one.

 

Migrator version: 6.1.9 (confirmed latest available, released 2026-09-03). J2Commerce core version: 6.6.1.

Richard Sparks

One clarification: I'm working on a local development copy of this website, which is not publicly reachable and unavailable for your inspection. I can't offer login access for you to reproduce this directly, but I'm happy to provide additional logs, HAR files, or a screen recording if that would help investigate.

Richard Sparks

Follow-up: additional bugs found while testing the real (write) Sync engine, one severe

Since the report above, I continued testing past the dry-run issue by running the Migrator's real Sync path (per-row Sync, not dry-run) as a series of scoped canaries, working up the wizard's own dependency chain from Lookup Tables through Joomla Content & Users. The Sync/write path is NOT affected by the dry-run bug described above -- real Syncs on Currencies, Countries, Zones, Tax Profiles, Access Levels & Groups, and Users all completed and wrote plausible data. However, this testing surfaced four additional, distinct bugs, the last of which is severe (live content duplication) and the reason I stopped further testing.

Bug 3: every real Sync appears to run its per-tile batch/migration logic twice per click ("double-pass processing")

Confirmed on two tiles of very different size, both with the identical arithmetic signature. Zones (source table j2store_zones, 3,976 rows): Migration History reports Migrated: 56, Skipped: 7,896. The run's own Activity Log shows processed=7952, total_source=3976 -- processed is exactly 2x total_source. Working through it: pass 1 processed all 3,976 rows once (3,920 skips + 56 inserts); pass 2 re-processed the same 3,976 rows again, and since everything now existed in the target (including the 56 just-inserted rows), pass 2 skipped all 3,976. 3976+3976=7952 processed; 3920+3976=7896 skipped; 56 inserted (from pass 1 only). Tax Profiles (source table j2store_taxprofiles, 1 row) shows the identical signature at 1-row scale: processed=2, total_source=1, inserted=1, skipped=1.

This appears idempotent under "skip" conflict mode -- no duplicate data was created in either case, verified by spot-checking J2Commerce 6's own admin for both tiles -- but it roughly doubles wall-clock work and inflates the reported processed/skipped counters. I have not tested whether it is equally harmless under Overwrite or Merge conflict modes.

Bug 4: Zones sync has no foreign-key remap pass -- PK collisions silently repoint any table with a raw numeric FK into zones

The Zones real Sync produced a red warning banner not seen on any other tile: "56 row(s) were given a NEW target ID because their original ID already belonged to an unrelated row. Any child data still referencing the old ID may now point at the wrong parent -- review before trusting this data." The Activity Log confirms 56 WARNING lines of the form: "Natural-key miss + PK collision on j2commerce_zones: source PK 201 is already occupied by an unrelated target row. Reassigning to a new auto-increment id -- any child row still referencing PK 201 numerically will now point at the wrong parent (this engine has no FK-remap pass)."

I found no evidence of actual corruption in this dispatch, since nothing downstream referenced zones yet (Tax Rates/Geo Zones had not synced), but the tool's own message is explicit that it cannot remap foreign keys pointing at the 56 reassigned IDs. Any site migrating a table with a raw zone_id-style foreign key (shipping rates, tax rules, customer addresses, etc.) should treat this as a real data-integrity risk to check for by hand.

Bug 5: Users sync -- summary counters silently disagree with the run's own Activity Log, and skip mode drops 72 dependent child rows

Ran a real Sync on Users (249 Joomla accounts; same-server mode, so J2Commerce 6 shares the same #__users table as the v4 source -- "Migrated: 0" is the correct, expected outcome here, not a bug). Two problems surfaced only by opening the full Activity Log for this run, not from any summary UI. First, the Migration History list and the run's own result modal both report "Skipped: 0" for this run, but the Activity Log itself contains exactly 249 lines of the form "users:<id> skipped per conflict resolution" -- an exact match to the live user count. Every summary surface disagrees with the tool's own detailed log. Second, immediately after those 249 skip lines, in the same run, the tool attempts to migrate two child tables (Joomla core's own user_profiles and user_notes, swept up because Users migrates them in the same tier) and logs 8 lines of "WARNING user_profiles:0 skipped - user_id has no mapped target row" and 64 lines of "WARNING user_notes:<1-64> skipped - user_id has no mapped target row". The apparent cause: because the parent Users pass chose "skip" for all 249 already-existing rows, it never recorded an identity-map entry for any of them (even though, in same-server mode, source-id = target-id trivially) -- so the very next tier in the same run cannot resolve "target user for source user X" and drops the row instead of migrating it, logged only as a WARNING, invisible in the wizard, Migration History, or the run's own summary widget.

In my case the content lost was low-consequence -- I independently verified the 64 user_notes rows are 100% auto-generated sign-up IP/user-agent security-log entries from a third-party security plugin, not staff-written notes, and the 8 user_profiles rows are optional registration metadata for a plugin that is currently disabled site-wide -- but the mechanism itself (skip mode never populating the identity map) is a general design gap that could silently drop consequential child data on a site where these two Joomla core tables are used for something meaningful, with no way to know without manually opening every run's full Activity Log.

Bug 6 (severe): "Migrate Categories & Articles" pre-flight confirm duplicated every article on the site

This is the most serious issue, and the reason I stopped testing entirely. Content Categories is the first tile that does not Sync immediately on click -- it opens a "Migrate Categories" pre-flight modal listing every source category with a target-mapping dropdown, defaulting (per its own underlying DOM state, not just the displayed label) to "Create identical"/self for every row, except for two source categories that happen to share a display name with an unrelated category elsewhere in the tree (a nested "Grouped Products > Quilting Books" vs. a top-level "Shop > Quilting Books", and similarly for "Notions"). For those two rows, the default silently pre-selects the unrelated same-named category instead of self, which would merge two distinct categories together if confirmed as pre-filled. I did not submit that default -- I manually corrected just those two dropdowns to "Create identical" and confirmed.

That corrected confirm action completed with no error, and both tiles ("Content Categories" and "Articles") showed a clean "Synced, 0 rows" -- but it silently duplicated every one of the site's 63 published articles (new sequential IDs immediately following the prior max, alias suffix "-2", 0 hit-count vs. the originals' real hit counts, confirmed across all 63 pairs including high-traffic pages), taking total articles from 63 to 126, and separately created two brand-new, unwanted duplicate categories (cloned siblings of the two "Create identical" rows) instead of treating "Create identical" as "leave the source category as itself." There is no Migration History row and no Activity Log at all for this action -- unlike every other real Sync described in this ticket, this is a completely different code path that produces no audit trail whatsoever. The only way I detected this was by independently re-deriving the site's category and article counts by hand and diffing them against ground truth recorded before the action.

I did not attempt any further Sync steps after finding this, and remediated the live site by restoring from a full backup taken immediately before this step (restore verified fully successful, all content back to its correct pre-migration state).

Environment is the same as reported above (Joomla 6.1.3, PHP 8.4.20, MariaDB 12.2.2, J2Commerce 6.6.1, Migrator 6.1.9). Happy to provide the same kind of supplementary evidence as before -- logs, HAR files, or a screen recording -- for any of these four issues if useful. This remains a local development copy of the site, not publicly reachable, so I still can't offer direct login access.

Adam Melcher

Richard,

Thanks for detailed items - I am going through it now to see which items may have already been resolved in the upcoming release and which ones need to fixed.

 

Adam

Growing Together

Help us get back to #1 in the Joomla Extension Directory by leaving us a 5-Star review here.

Adam Melcher

Richard,

Can you update to the latest migrator version and let me know if the issues you mentioned have been resolved?

 

Adam

Growing Together

Help us get back to #1 in the Joomla Extension Directory by leaving us a 5-Star review here.

Richard Sparks

# J2Commerce Migrator 6.1.11 — Follow-Up Test Report

Retested against a full copy of a live production site (isolated environment, separate from our original dev site), covering every phase from Currencies through Orders, plus Transactional Data and the Tools & Finalise utilities. Real data throughout — 17 products, 101 orders, 249 users, 3,976 zones.

## Confirmed fixed since our earlier reports

- Dry-run now reports real counts (previously 0/0/0 on non-empty tables — the original bug report). - Sync no longer double-counts rows as skipped. - Users sync under skip mode now correctly maps skipped users, so dependent tables (e.g. user notes) migrate instead of being silently dropped. - The Content Categories "Migrate Categories & Articles" action no longer duplicates articles/categories when a row self-maps. - Relink Products & Orders and the Zones PK-reassignment "Acknowledge and unlock" gate both ran clean against a fully-migrated dataset, with zero broken links found.

Every commerce-critical number matched our known ground truth exactly (products, orders, order total, order items, order history, addresses) after a full run.

 

## Issues a non-technical user would still hit

**1. A table where source and target already match gets stuck at "Partial" forever, blocking everything downstream.** Countries, Order Statuses, Lengths, and Weights each showed: *"N existing row(s) were skipped — their customisations were NOT applied. Use this tile's ⋮ menu → Conflict mode to choose Overwrite or Merge."* Following that instruction — switching to Overwrite or Merge and re-running — does not change the status. It stays "Partial" indefinitely, because there's nothing to actually write (the data already matches). Since Tax System, Products, Addresses, Delivery, and Orders all sit behind Countries → Zones in the dependency chain, this can block the rest of the migration over a table that has nothing wrong with it. We only got past it by editing one row directly in the target database to create a real difference, then re-running Overwrite. There's no way to do that from the wizard itself.

**2. A correct sync can display "0 rows" afterward.** Product Images synced 17/17 rows correctly (confirmed in the database), but the tile's own badge showed "0 rows, Synced" once the automatic post-sync image-optimization pass finished — that pass's own result overwrote the visible count. Anyone reading the tile alone would conclude the images never migrated.

**3. The riskiest action's preview number doesn't match reality, with no way to check it in the UI.** Before running "Migrate Categories & Articles" — the action that creates categories and moves articles — its Preview reported "456 article(s) would be migrated" against a real site total of 66 articles. We found no explanation for the number anywhere in the wizard. The real run turned out correct (verified by counting articles/categories directly afterward), but someone deciding whether to trust the single riskiest button in the tool has only this unexplained number to go on.

**4. An acknowledged warning still displays as an active red alert.** After clicking "Acknowledge and unlock" on the Zones PK-reassignment warning, the tile shows green "Synced" — but the original red warning banner and its text stay attached to the tile indefinitely afterward, with nothing marking it as resolved.

**5. A tile's own description names the wrong reason it's locked.** "Copy Upload Files" describes itself as needing "a filesystem path to the source site, so it cannot run over an SSH tunnel." In our case it was locked for an ordinary, unrelated reason — it simply runs after "Resolve Upload Records" in the same phase. That SSH/filesystem line sits right next to the Locked state, though, and reads like it's the reason.

**6. "Run All Migrations" surfaces an unrelated error far from the actual blocker.** Clicking it processed what it could, then fired a premature Resync attempt that failed with a `[resync_users] backup_gate` error — shown on a tile in the very last section of the page, while the tiles actually needing attention (issue #1 above) sat at the top. The backup-gate refusal itself is working as intended; nothing on the page connects that error back to the real cause.

I'm glad to provide the full data set, screenshots, or exact reproduction steps for any of the above.

– Richard

Adam Melcher

Richard, 

If you can send me the screenshots to go along with the 6 items, I should be able to figure it out and get it updated.

 

Adam

Growing Together

Help us get back to #1 in the Joomla Extension Directory by leaving us a 5-Star review here.

Richard Sparks

Adam,

I don't have available screenshots of all issue, but most of them. See the attached PDF. Hope this helps!

Stay Updated

Subscribe for free and be the first to know about the latest features, updates, and new additions.