Moving from Magento 2

One file on your existing Magento server reads its database and pushes your shop here. Nothing is pulled from outside, your database credentials never leave your server, and the first run is a dry run that counts everything and writes nothing. When it is done you delete the file.

What comes across

The connector reads the tables Magento has kept stable across the whole 2.x line, on both database layouts: Open Source, keyed on entity ids, and Adobe Commerce with content staging, keyed on row ids.

Categories
Every category below the store root, as a collection: name, description, position and URL key. The URL key becomes the collection's handle, and products keep their category links.
Products
Simple, virtual and downloadable products arrive as one product with one variant. A configurable product arrives as one product with a variant per child, on the same option axes shoppers used, so a shirt in four colours and three sizes is one product with Colour and Size, not twelve products. Bundles arrive at their own price and are flagged so you can rebuild the options. Grouped products are skipped; their members come across on their own. Each product brings its name, URL key, description, SKU, price and special price with its dates, stock quantity, enabled or disabled as active or draft, and up to twelve images, copied into your shop's own media so nothing points back at the old server.
Customers
Name and email, so an order can find its customer and a customer can sign in. Passwords cannot be moved, so each customer sets a new one with the reset link the first time they sign in.
Orders
Order history as records: number, date, customer, line items matched by SKU, totals, discount code, and Magento's order state mapped to a status, a payment status and a fulfilment status. Nothing is replayed. No payment is taken, no stock moves and no email is sent, because the money changed hands years ago. Old order numbers keep working.
Promotions
Cart price rules with their coupon codes, and catalog price rules, translated into rules that keep working rather than prices already applied. A rule that could be translated whole arrives as it was. A rule that lost a piece in the crossing arrives switched off with the reason attached, because every way a rule loses a condition makes it apply to more, never less.

What stays behind

CMS pages and blocks
Rebuild them in the editor, where they become sections you can move and reuse.
Blog posts, including Magefan
Not moved yet. Posts will land in the Blog plugin in a later version of the connector; until then they are copied by hand.
Reviews, wishlists, addresses, newsletter consent
Consent in particular is not carried, because importing a flag you cannot prove is a GDPR problem waiting to happen.
Store-view overrides
The default scope is read. A second language or a second store view is a second shop, not a second column.
Attribute sets, layered navigation, tax, shipping and payment settings
Configured in the dashboard. Shipping rates, tax and your own payment keys take a few minutes each and are worth doing fresh.
URL rewrites
The URL key survives as the handle, so /wool-coat.html becomes /wool-coat. Custom redirects do not come across.

Before you start

  • You are an admin of the WhizzyCommerce shop the catalogue is going into. A demo shop is fine; going live later keeps everything.
  • You can put one file on the Magento server, over SFTP or SSH.
  • The server runs PHP 8, which every Magento 2.4 install already does.
  • Product images are reachable over HTTPS at the store's base URL. They are fetched from there and copied into your new shop, so a store that is offline or behind a maintenance page arrives without pictures.
  • Time. Counting is fast; a live import runs at a few minutes per thousand products, and images are most of it.

Step by step

  1. 1

    Create a dry-run key

    In your shop's dashboard open Settings, Import and press Create a migration key, leaving “Import for real” unticked. The key is shown once, works for 24 hours, opens exactly this shop, and is used up when a run finishes. Every run, dry or live, starts with a fresh key.

  2. 2

    Put the connector on your Magento server

    Download import.php from the same screen, or from whizzycommerce.com/connector/magento2, and upload it to pub/whizzy/import.php. It finds app/etc/env.php by walking up from where it sits, so keep it under pub/. It is one readable file with no dependencies; read it before you run it, that is the point of it being one file.

  3. 3

    Run the dry run

    Either in a browser:

    https://your-shop.com/whizzy/import.php?k=wz_YOUR_KEY

    or over SSH from the Magento root:

    php pub/whizzy/import.php --key=wz_YOUR_KEY

    Output streams as it goes, one line per batch. On nginx the browser route usually answers 403: Magento's own nginx.conf.sample passes only index.php, get.php, static.php and the health check to PHP and denies every other .php file. That is correct behaviour, so use SSH there. SSH is also the better choice for anything past a few thousand products, because the command line has no execution time limit and a browser tab does.

  4. 4

    Read the report

    The run ends with a table per entity: seen, imported, skipped, failed, followed by the first problems. A dry run reports what would happen, so “imported” here means “would import”.

    products     seen 1240    imported 1231    skipped 0       failed 9
    categories   seen 38      imported 38      skipped 0       failed 0
    customers    seen 4102    imported 4102    skipped 0       failed 0
    orders       seen 9870    imported 9870    skipped 0       failed 0
    promotions   seen 14      imported 14      skipped 0       failed 0
    
    Problems (first 9):
      product    SKU-2231     no variant with a usable price
      product    SKU-0410     missing title

    Failed products are the usual suspects: no price, no name, or two products whose URL keys normalise to the same handle. Fix them in Magento if they matter, then create another dry-run key and run again until the numbers are the ones you want.

  5. 5

    Run it for real

    Back in Settings, Import, tick “Import for real” and create a new key. Run the same command with it. The dashboard lists the run under Imports so far and updates as batches land; reload to see progress. Categories go first, then products, customers, orders and finally promotions, since each later pass refers to the earlier ones by handle, SKU or email.

  6. 6

    Check the shop

    • Products and collections, with variants, images and stock in place.
    • Promotions. Any rule that arrived switched off carries the reason; turn it on once you have read what it lost.
    • Customers, who will set a new password the first time they sign in.
    • Orders, as history: nothing to fulfil, nothing to refund, nothing to email.
  7. 7

    Delete the file

    rm pub/whizzy/import.php

    It refuses to run without a valid key and the key is already burnt, but a file that can read your customer table has no business staying in a public directory.

  8. 8

    Then go live

    Pick a theme, add your own payment keys, set shipping and tax, and point your domain at the new shop. Nothing you imported changes when you do.

Running it twice

A second live run skips anything that is already there: a product with the same handle, a customer with the same email, an order with the same number. Skipped means left alone, not updated. To refresh something that changed in Magento since the first run, remove it from the new shop first, then run again.

Coming from somewhere else

Every other platform goes through spreadsheet files: export products, customers and orders as CSV, map the columns, dry-run, import. The details are on the pricing page.

Moving from Magento 2 · WhizzyCommerce