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.
Migration guide
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 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.
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.
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.
| Data | Source on Zen Cart | Moves to Shopify? |
|---|---|---|
| Products with models, names, descriptions, prices, specials, weights, images, meta tags | Easy Populate 4 CSV or the products and products_description tables | Yes. 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 prefixes | products_attributes, products_options, products_options_values | Yes, redesigned. Real choices become variants, paid extras become add-ons. See below. |
| Stock by attribute combination | Stock by Attributes or POSM plugin tables, or the built-in variant stock in 2.1 and later | Yes, as per-variant inventory. |
| Product types (general, music, document, free shipping) | products_type plus extra tables such as product_music_extra | Yes. Music fields such as artist and genre become metafields; free shipping becomes a shipping profile. |
| Categories and manufacturers | cPath hierarchy and manufacturers | Yes, as collections and menus. Manufacturers become the Shopify vendor. |
| Quantity discounts | products_discount_quantity | Yes, as volume pricing through B2B catalogs or a discount app, chosen in the audit. |
| Group pricing | group_pricing and each customer’s pricing group | Yes, as customer tags with automatic discounts, or B2B companies and catalogs. |
| Orders with products, attributes, totals, taxes, shipping | orders, orders_products, orders_products_attributes, orders_total | Yes. Real orders under the original number and date, with transactions and refund records where money went back. |
| Order status history and tracking | orders_status_history, plus any tracking plugin columns | Yes. 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-ins | customers, address_book | Yes, with marketing consent from the newsletter flag. |
| Passwords | Hashes in customers_password | No. 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. |
| Reviews | reviews and reviews_description | Yes, into Judge.me or your chosen review app. |
| Gift certificate balances and coupons | coupon_gv_customer, coupons | Yes. Balances become gift cards and coupons are rebuilt as discounts. See below. |
| EZ-Pages, define pages, template and plugins | Admin, database and template files | Pages move with their content. The template is rebuilt and each plugin is mapped to a Shopify app or native feature, or dropped. |
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.
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.
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.
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.
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:
/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./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.
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.
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.
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.
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.
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.
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.
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.
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
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.
Products, variants, option pricing, customers, the full order history with refunds and tracking, reviews, content and redirects. Reconciled to the cent.
Rebuilt exactly as it is, given a facelift, or redesigned completely. Quoted inside the migration, not as a second project.
Reviews, search, subscriptions, loyalty, bundles, email. Matched to a Shopify equivalent, dropped where the platform now does it, or rebuilt as a custom app.
ERP, CRM, PIM, 3PL, POS, accounting and EDI, reconnected and tested before cutover. Nobody rekeys orders on launch day.
The first question we ask
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.
Indistinguishable from the old store, down to the spacing, but rebuilt on a current Shopify theme so it is faster and maintainable underneath.
The same structure, better executed: typography, spacing, color, photography, product pages and navigation. The shape your customers know stays put.
A new storefront, designed as a prototype you click through before a line of Liquid is written, then built on Horizon.
Included with every migration
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.
Other platforms
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.