Migration guide

Zen Cart to Shopify

How we move Zen Cart stores to Shopify: attributes with price prefixes as variants or add-ons, Ultimate SEO URLs and CEON redirects, years of order history, and a fixed price from $2,500 over six to eight weeks.

Every migration includes the storefront, the apps and your back-office systems, not just the data. Pixel-perfect, a facelift or a complete redesign?

Zen Cart to Shopify: twenty years of attributes, orders and URLs, moved in order

Zen Cart split from osCommerce in 2003. It is free, open source and self-hosted, and many stores have run on it for over a decade. That longevity makes a Zen Cart to Shopify migration more than an export and an import: years of attribute pricing rules, layered plugins, SEO URL modules swapped in and out, and a very large order history. This guide covers how we handle each of those parts, including the ones the export tools do not reach.

Why stores leave Zen Cart

  • PHP and hosting pressure. Each Zen Cart line supports a fixed PHP range: 1.5.8a runs on PHP 7.3 to 8.3, 2.1.x on 8.0 to 8.3, and the current 2.2.x line on 8.2 to 8.5. When a host retires a PHP version, the store has to be upgraded first, and older 1.5.x stores often cannot move at all without a rebuild.
  • Upgrades are manual merges. Each upgrade means re-applying template and core edits and checking every plugin against the new release.
  • Plugin dependence. SEO URLs, stock by attribute and bulk CSV import have historically come from community plugins, each maintained on its own schedule.
  • Security and PCI scope. Zen Cart’s documentation warns that running an unpatched PHP version is not PCI compliant. On a self-hosted store, patching, hardening and backups sit with you. Shopify is a PCI DSS Level 1 service provider and runs checkout itself.
  • Checkout and payments. Shop Pay, accelerated wallets and a maintained checkout replace payment modules you have to keep current.
  • A shrinking developer pool. Experienced Zen Cart developers are still around, but far fewer than Shopify developers.

To be fair, Zen Cart is actively maintained: 2.1 added admin multi-factor authentication and built-in variant stock, and a 3.0 line is in development. If owning the code matters most, staying is a reasonable choice.

What migrates from Zen Cart to Shopify

Zen Cart’s core admin has no general CSV export for the catalog. Most stores use the Easy Populate 4 plugin, which exports and imports products, categories, attributes, price breaks, featured products and Stock by Attributes quantities as CSV, but not orders or customers. Because the store is self-hosted, we read the MySQL database directly for everything, including the tables no plugin exports.

DataSource on Zen CartMoves to Shopify?
Products with models, names, descriptions, prices, specials, weights, images, meta tagsEasy Populate 4 CSV or the products and products_description tablesYes. Model numbers become SKUs, specials become compare-at prices, and meta tags carry to Shopify’s SEO fields.
Attributes (option names and values) with price and weight prefixesproducts_attributes, products_options, products_options_valuesYes, redesigned. Real choices become variants, paid extras become add-ons. See below.
Stock by attribute combinationStock by Attributes or POSM plugin tables, or the built-in variant stock in 2.1 and laterYes, as per-variant inventory.
Product types (general, music, document, free shipping)products_type plus extra tables such as product_music_extraYes. Music fields such as artist and genre become metafields; free shipping becomes a shipping profile.
Categories and manufacturerscPath hierarchy and manufacturersYes, as collections and menus. Manufacturers become the Shopify vendor.
Quantity discountsproducts_discount_quantityYes, as volume pricing through B2B catalogs or a discount app, chosen in the audit.
Group pricinggroup_pricing and each customer’s pricing groupYes, as customer tags with automatic discounts, or B2B companies and catalogs.
Orders with products, attributes, totals, taxes, shippingorders, orders_products, orders_products_attributes, orders_totalYes. Real orders under the original number and date, with transactions and refund records where money went back.
Order status history and trackingorders_status_history, plus any tracking plugin columnsYes. Status history becomes order notes; tracking numbers become fulfillments. Core Zen Cart has no tracking field, so we find where your store kept them.
Customers, address books, newsletter opt-inscustomers, address_bookYes, with marketing consent from the newsletter flag.
PasswordsHashes in customers_passwordNo. Current versions use PHP’s bcrypt hashes and older accounts may still hold salted MD5 or SHA-256; Shopify can use none of them. Customers reset or use passwordless sign-in.
Reviewsreviews and reviews_descriptionYes, into Judge.me or your chosen review app.
Gift certificate balances and couponscoupon_gv_customer, couponsYes. Balances become gift cards and coupons are rebuilt as discounts. See below.
EZ-Pages, define pages, template and pluginsAdmin, database and template filesPages move with their content. The template is rebuilt and each plugin is mapped to a Shopify app or native feature, or dropped.

Zen Cart URLs and redirects

A stock Zen Cart store serves query-string URLs. Products live at /index.php?main_page=product_info&cPath=1_4&products_id=12, where cPath is the category trail joined by underscores, and categories at /index.php?main_page=index&cPath=1_4. Other product types use their own page names, such as main_page=product_music_info and main_page=document_product_info, and EZ-Pages use main_page=page&id=3. The same product is usually reachable under several cPath values, so Google may have indexed more than one of them.

Shopify uses /products/handle, /collections/handle and /pages/handle. Which old URLs we map depends on the SEO add-on your store ran, covered in its own section below.

Tools

Cart2Cart, a partner of ours, lists Zen Cart as a source, and LitExtension supports it too, including products with variants, customers and orders. Both are fine for a first pass on products and customers. Their limits are the ones we see on every platform: tracking numbers on shipped orders do not come across, refunded orders tend to land as plain paid orders, and redirects are built from guessed slugs rather than the URLs your SEO add-on actually served. We finish those parts ourselves. Self-hosting works in your favor: with database access nothing is limited to Easy Populate or the admin screens, and we reconcile every count against the source tables.

How we run it

  1. Audit. Zen Cart and PHP versions, installed plugins, attribute and stock structure, product types, pricing rules, the SEO URL add-on and its history, order volume and integrations. The result is a fixed-price scope.
  2. Build in a free Shopify development store. As a Shopify Plus Partner we build in development stores, so you pay Shopify nothing until launch. Theme, checkout, payments, shipping, taxes and Markets are set up here.
  3. Catalog. Products, attributes as variants or add-ons, per-variant stock, product type fields as metafields, collections, images and SEO fields.
  4. Customers. Address books, pricing groups, consent and gift certificate balances.
  5. Orders. Line items with their attributes, taxes, shipping, transactions, refunds, status history and fulfillments, under original numbers and dates.
  6. Redirects. Query-string URLs, SEO add-on URLs and Search Console URLs, tested one by one.
  7. Sample, then full import. A sample of each entity, including attribute-priced, refunded and guest orders, for your sign-off, then the full run reconciled against the Zen Cart tables.
  8. Cutover. DNS moves to Shopify and a delta sync brings across orders and customers created since the full run.
  9. Post-launch SEO evaluation. Once Google has re-crawled the store and the first real analytics are in, we review coverage, 404s, rankings and conversion, and fix what we find.

Cost and timeline

A Zen Cart to Shopify migration starts from $2,500 for stores under 500 products and 5,000 orders ($3,500 for larger stores), and typically takes six to eight weeks for smaller stores. B2B pricing, multiple stores and integrations such as ERP or accounting are quoted as a fixed price after the audit. Terms are 50% to begin and 50% once the store is live and you are fully satisfied with the figures.

We choose the Shopify plan in the audit. Live UPS or FedEx rates need Advanced or Plus, or Grow on annual billing, and B2B catalogs run on all plans, with non-Plus plans limited to three.

Attributes with price prefixes: variants or add-ons

Each Zen Cart option value can add or subtract a price through its + or - prefix, change the weight the same way, carry a one-time charge, apply a price factor, or price text input per word or letter. Options can be dropdowns, radio buttons, checkboxes, text or file uploads, and a product can have many of them.

Shopify allows three options and up to 2,048 variants per product, each with one fixed price. We sort every option into one of three routes. A real product choice with its own stock, such as size or color, becomes a variant, with each variant price calculated by applying the prefixes exactly as Zen Cart did. A paid extra, such as gift wrap or a one-time setup charge, becomes an add-on product through a product options app, because multiplying it into the variants would inflate the variant count. Information only, such as engraving text or an uploaded file, becomes a line item property. Per-word pricing and price factors need an options app that supports formulas, which we confirm in the audit.

Stores tracked combination stock with the Stock by Attributes plugin, with Products’ Options’ Stock Manager (built into Zen Cart since 2.1), or not at all. We read whichever tables your store used so each variant opens with the right quantity, and check every calculated price against Zen Cart’s own cart total before launch.

SEO URL add-ons and their redirects

Most established Zen Cart stores replaced the query-string URLs with an add-on, and many changed add-ons over the years. The two we see most:

  • Ultimate SEO URLs. Builds URLs from the name plus a coded ID, such as /blue-widget-p-12.html for a product, /widgets-c-1_4.html for a category, -m- for manufacturers and -ezp- for EZ-Pages. Depending on settings, a product may also appear under its category, as in /widgets-c-1_4/blue-widget-p-12.html, and the extension can be .html or nothing. Because the ID sits in the URL, we match on the number and ignore the words, which also catches old URLs from products renamed years ago.
  • CEON URI Mapping. Stores a static URI per product, category, manufacturer and EZ-Page, such as /widgets/blue-widget, in its own database table. There is no ID in the URL, so the mapping table is the only reliable source, and it also holds previous URIs from renamed items. We redirect every current and historical URI.

We add the original index.php?main_page= URLs for every cPath, review pages, and any Search Console URL the database no longer knows. Every redirect is requested against the live domain before launch.

Long-lived stores with many years of orders

A store that has run since the 2000s may hold hundreds of thousands of orders, many for products deleted long ago. Zen Cart copies names, models, attributes and prices into each order, so we import those lines as custom line items rather than recreating dead products. Order statuses are store-defined, so we map each one to Shopify’s financial and fulfillment states, and keep the full orders_status_history trail, with its comments, as order notes. Order totals are separate rows per module (subtotal, shipping, tax, coupon, gift certificate, group discount, low-order fee), and we rebuild each order from those rows so the Shopify totals match to the cent. Customers who checked out years ago on old password hashes reset on first login.

Gift certificates need care. Zen Cart holds a balance per customer account in coupon_gv_customer, not per code. Shopify gift cards have codes, so each positive balance becomes a gift card assigned to that customer, and certificates bought but not yet released in the queue are handled individually.

PHP and hosting end of life

Many Zen Cart migrations start with a hosting notice. A store on 1.5.7 or earlier cannot run on current PHP, so the choice is an upgrade or a move. We plan around that deadline: the old store stays live while we build, we take the database copy early, and the delta sync at cutover picks up everything since. If the host cannot keep the old PHP version long enough, we agree a freeze window in the audit.

What you get at handover

A reconciliation ledger from the Zen Cart tables to the live Shopify counts for products, variants, customers, orders, fulfillments and gift cards, with every exclusion named; the redirect verification list with the status each URL returned; the attribute map showing how every option and price prefix was handled; the pricing map for group pricing and quantity discounts; the plugin to app decisions; and a recorded admin walkthrough.

Questions we settle in the survey

  • Which Zen Cart and PHP versions are you on, and do we have database access?
  • Which SEO URL add-ons has the store used, now and in the past?
  • How do you track stock for attribute combinations?
  • Which attributes carry price prefixes, one-time charges or text pricing?
  • Do you use group pricing, quantity discounts or gift certificates?
  • Do you need live carrier rates at checkout? That decides the Shopify plan.
  • When does your host retire the PHP version you run?

Frequently asked questions

Can we keep our full Zen Cart order history?

Yes. Orders import as real Shopify orders with the original numbers, dates, attributes, totals and refunds, and status history comes across as order notes. Orders for products deleted years ago import as custom line items, and every count is reconciled against the Zen Cart tables.

What happens to attributes with price prefixes?

Real product choices such as size or color become variants, with the plus or minus price applied to each variant price. Paid extras and one-time charges become add-on products through an options app, and text or file inputs become line item properties.

Will our Ultimate SEO URLs or CEON URLs keep their rankings?

We redirect every product, category, manufacturer and EZ-Page URL your add-on served, including older CEON URIs and every category path, plus the original index.php URLs. Each redirect is tested against the live domain before launch.

Can customers keep their Zen Cart passwords?

No. Zen Cart password hashes cannot be used by Shopify. Customer accounts, addresses and order history move across, and customers set a new password on first login or use passwordless sign-in.

What does a Zen Cart to Shopify migration cost?

From 2,500 dollars for stores under 500 products and 5,000 orders (3,500 dollars for larger stores), typically over six to eight weeks for smaller stores. B2B pricing, multiple stores and integrations are a fixed price after the audit. Terms are half to begin and half once the store is live and you are fully satisfied with the figures.

Start with the migration survey. For another self-hosted PHP cart, see the OpenCart guide, or compare every source we handle on our migration platforms page.

More than the data

A Zen Cart migration is four jobs. We do all four.

Getting the records out of Zen Cart is the part software can do on its own, so it is the part most providers sell. The storefront your customers see, the apps that run the store and the systems behind it are the rest of the work, and where a data-only migration hands the problem back to you. All four are in scope here.

01 · Data

Everything the old store knows

Products, variants, option pricing, customers, the full order history with refunds and tracking, reviews, content and redirects. Reconciled to the cent.

  • Sample first
  • Reconciled
  • Audited
02 · Storefront

The front end, designed and built

Rebuilt exactly as it is, given a facelift, or redesigned completely. Quoted inside the migration, not as a second project.

  • Pixel-perfect
  • Facelift
  • Redesign
03 · Apps

Every app accounted for

Reviews, search, subscriptions, loyalty, bundles, email. Matched to a Shopify equivalent, dropped where the platform now does it, or rebuilt as a custom app.

  • Klaviyo
  • Reviews
  • Subscriptions
  • Custom apps
04 · Systems

The back office keeps working

ERP, CRM, PIM, 3PL, POS, accounting and EDI, reconnected and tested before cutover. Nobody rekeys orders on launch day.

  • ERP
  • CRM
  • 3PL
  • POS
  • EDI

The first question we ask

Pixel-perfect, a facelift, or a complete redesign?

Your storefront does not have to come across unchanged, and it does not have to be thrown away either. We quote whichever route you pick inside the migration.

Route 01

Pixel-perfect

Indistinguishable from the old store, down to the spacing, but rebuilt on a current Shopify theme so it is faster and maintainable underneath.

  • Same look
  • New foundations
Route 02

A facelift

The same structure, better executed: typography, spacing, color, photography, product pages and navigation. The shape your customers know stays put.

  • Keeps the map
  • Modern build
Route 03

A complete redesign

A new storefront, designed as a prototype you click through before a line of Liquid is written, then built on Horizon.

  • Prototype first
  • Horizon
  • Upgradeable

Included with every migration

After go-live, we audit the store again.

A Zen Cart to Shopify migration is not finished when the data lands. Every migration we deliver includes an SEO and growth evaluation once Google has re-crawled the new store and the first real analytics exist: how it is indexed, where it ranks and who outranks it, a technical tag audit, speed, product copy, and quick wins in the order to do them. Here is one we delivered, based on a real engagement.

Ready when you are.

Tell us about your store in ten minutes. We come back within one business day with an honest assessment, a recommended track and a fixed price.