Multiple Ship-To Addresses for Zen Cart 2.0.0 – 2.3.0 — Version 3.0.1

Introduction

Credits

The order-splitting, per-address shipping-cost and destination-based tax handling that this plugin still relies on were created by Vinos de Frutas Tropicales (lat9), Copyright © 2014-2019. Original support thread at the Zen Cart forums: Multiple Ship-To Addresses Support Thread.

Version 3.0.0, which repackages the plugin as an encapsulated zc_plugin and rebuilds the checkout flow, Copyright © 2026 My Zen Cart Host (dbltoe).

Usage Notes

This plugin changes how an order is built, so it has to coexist carefully with anything else that does. As of v3.0.0 most of those interactions are handled for you rather than left as a warning:

  1. One Page Checkout — handled automatically. Once a customer chooses multiple addresses, One Page Checkout is switched off for that session and the customer follows this plugin's checkout instead. A customer who declines it keeps One Page Checkout exactly as normal, so both can be installed on the same store.
  2. Edit Orders — blocked, with a message. Opening a multiship order in Edit Orders returns the admin to the order's normal detail page and explains why: editing it there would destroy the record of which items went to which address. Orders that are not multiship are unaffected. What is blocked is restructuring the line items, not editing the order: the order's own Details page works exactly as it always has, so status changes, comments and customer notifications are all still available there — and this plugin adds per-address status updates to that same page, so each parcel can be advanced independently.
  3. Guest checkout and PayPal Express Checkout — multiple addresses are never offered because they require a registered account with a saved address book, so the question is simply not asked.
  4. Discount coupons — not offered on a multiship order. A coupon cannot be apportioned across sub-orders without producing totals that do not add up, so ot_coupon is removed from checkout for those orders only.
  5. Group pricing — customers in a group-pricing group are not offered multiple addresses, for the same reason.
  6. Free shipping — not handled, and worth understanding before you enable both. A multiship order is quoted one address at a time, and every free-shipping threshold is measured against the part of the order going to that address rather than against the whole order. A $60 cart that earns free shipping over $50 stops earning it the moment the customer splits it into two $30 halves.

    What the customer sees depends on which kind of free shipping you run. The Free Options and Free Shipping shipping modules decide when the order is quoted, so if one of those is the method the customer picked, the split produces no quote at all: the addresses are marked with a warning and checkout will not continue until they choose a different method. The Allow Free Shipping setting inside the Shipping order-total module decides later, after the quote, so nothing is blocked — the order simply completes with shipping charged on each address, even though the shopping-cart page had said shipping was free.

    That second one is the one to watch, because it costs the customer money quietly. If you offer free shipping over a threshold and you enable multiple addresses, either say so in your shipping policy or set the threshold low enough that a split order still clears it. Or judge the whole order instead: Multiple Ship-To Addresses Pro, a paid companion to this plugin, applies the threshold to the full cart and takes the shipping off every address when it passes — and picks the cheapest carrier for each address while it's at it.

  7. Specific payment methods — if a payment module cannot cope with a split order, name it under Configuration → Multiple Ship-to Addresses → Unsupported Payment Methods and it will be hidden for multiship orders only.

Still untested against this version, and worth asking about before relying on them: Super Orders, Ty Package Tracker, and Fast and Easy Checkout. If you have a question about another plugin's compatibility, please ask on the support thread.

Overview

This plugin lets a customer send the individual products in one order to two or more different addresses. The order is split into per-address sub-orders, each quoted, taxed, tracked and status-updated independently, while the customer pays once.

No core files are changed, and no template files are overwritten. That is the headline difference in v3.0.0. Earlier versions shipped replacement copies of Zen Cart core files and of your template's checkout templates, which had to be merged by hand and re-merged after every Zen Cart upgrade. This version is an encapsulated zc_plugin: everything lives under /zc_plugins/MultiShip/, it installs and uninstalls from the admin's Plugin Manager, and a Zen Cart upgrade cannot overwrite any of it because none of it sits in Zen Cart's own directories.

The practical consequences for you:

Developed and tested against Zen Cart 2.3 with the ZCA Bootstrap template, and declared compatible with Zen Cart 2.0.0 through 2.3.0. It has not been run against a Zen Cart 3.0.0 store.

Zen Cart Admin Interfaces

Installing the plugin from the Plugin Manager creates two tables in your Zen Cart database:

  1. orders_multiship — the delivery address for each sub-order.
  2. orders_multiship_total — the order-total values for each sub-order.

It also adds one column to your existing orders_products table, recording which sub-order each product line belongs to, and registers the invoice_multiship and packingslip_multiship pages plus its own configuration menu entry.

Settings

Under Configuration → Multiple Ship-to Addresses:

  1. Unsupported Payment Methods — a comma-separated list of payment modules to hide when an order is going to several addresses. Empty by default, meaning every payment method is offered.
  2. Maximum Delivery Addresses — how many addresses one multiship order may spread across. Defaults to 10. This is deliberately separate from Maximum Address Book Entries under Customer Details, which is left alone; set this no lower than that store-wide limit.
  3. Enable debug? — writes a trace to /logs/multiship_YYYYMMDD.log. Off by default. Turn it on before reporting a problem.

There is no store-wide on/off switch. Installing the plugin is the decision to use it; uninstall it from the Plugin Manager to turn it off.

Orders, invoices and packing slips

  1. Customers → Orders shows a multiship order with each sub-order broken out, including what shipped where, and lets you change the status of one sub-order without touching the others. The customer is emailed about that sub-order only.
  2. The invoice and packing slip are replaced automatically for multiship orders, so each address gets its own section. You do not need to pick a different menu item.
  3. Edit Orders, if you have it installed, refuses to open a multiship order and says why. See Usage Notes.

The image at the top of your emails

The plugin goes to some trouble to look like your store: it imposes no colors or typefaces of its own, taking both from your template so its pages sit inside your design rather than beside it. None of that reaches the customer's inbox. Order emails are Zen Cart's own, and they open with a file most store owners have never looked at.

Worth knowing before you take multiship orders, because this plugin will make you send more email than you do now. Each sub-order has its own status, so a customer who split an order across three addresses gets three "your order has shipped" emails rather than one. Whatever sits at the top of those appears once per parcel — and on most stores, what sits there is a file the owner has never seen.

Zen Cart ships /email/header.jpg, a 550×110 banner, and puts it at the top of every HTML email your store sends. The constants controlling it live in /includes/languages/english/lang.email_extras.php:

  1. EMAIL_LOGO_FILENAME — header.jpg
  2. EMAIL_LOGO_WIDTH / EMAIL_LOGO_HEIGHT — 550 / 110
  3. EMAIL_LOGO_ALT_TEXT — Brand Logo
  4. EMAIL_LOGO_ALT_TITLE_TEXT — Zen Cart! The Art of E-commerce

Read that last one again. Until it is changed, every HTML email your store sends carries Zen Cart's branding in the image tooltip, over your logo, under your domain.

Why you may never have noticed. Two switches both have to be on before anyone sees it. The store's — Configuration → E-Mail Options → Send E-Mails in HTML format — and the customer's, because each account carries its own email-format preference and one set to Plain Text gets plain text regardless. A store can run for years with the stock banner going to the subset of customers who have HTML enabled, while the owner, testing with a plain-text account, sees nothing.

What to do. Replace /email/header.jpg with your own artwork at the same dimensions — same filename, same size, nothing else to change. If your logo is a different shape, adjust the width and height constants and fix the alt and title text while you are there. If you would rather send no banner, a transparent image at those dimensions is safer than deleting the file, which leaves a broken-image icon.

What this plugin does about it: nothing, deliberately. Multiship sends no email of its own — it lets Zen Cart's order-status machinery do the sending, so a sub-order email looks exactly like every other email your store sends. If you have set that banner up, these emails use it. If you have not, these emails are no worse than the rest of your mail, and the fix above fixes all of them at once rather than just ours.

Zen Cart Customer Interfaces

A customer who does not want multiple addresses sees your store's ordinary checkout, unchanged. Everything below happens only once they ask for it.

Checkout is three steps, the same number as an ordinary Zen Cart order. In v2.0.0 a multiship customer went through five; the shipping-method choice has since moved onto the address page, and the page that used to exist only to confirm that choice is gone.

Being asked. When a cart could be split — two or more shippable items, a registered customer, shipping available — clicking Checkout presents a short page offering three choices: carry on with normal checkout, send the items to different addresses, or go back and keep shopping. It is asked once per order. Declining is remembered, and so is accepting — a customer who changes their mind can leave multiship from the address page at any point before paying.

If your store also offers PayPal Express Checkout or a similar one-click button from the cart page, a notice appears on the cart itself as well, because a customer who presses that button leaves before the question can be asked.

  1. Step 1 — Choose a Shipping Method and Addresses. Every shippable unit is listed on its own line, with a menu beside each one holding the customer's address book. They pick the shipping method once, at the top, and then a destination for each item. Shipping is quoted separately for each address as they go, so the running total is real rather than estimated. An address the chosen carrier cannot deliver to is flagged. A customer needing an address they have not saved can add one without leaving checkout, and returns to the grid with their other choices intact. The Continue button appears once every item has a destination.
  2. Step 2 — Payment. Your store's normal payment page. The customer pays once, for the whole order.
  3. Step 3 — Confirmation. The usual confirmation page, with the single delivery address replaced by a breakdown: each recipient, what they are getting, what their shipping costs, and their sub-total.

After the order is placed, the same breakdown appears on the order-received page, so the customer's receipt records which parcel went where.

A customer who is not signed in when they choose multiple addresses is sent to log in first, and told why, since multiship needs a saved address book.

When a customer has placed an order with Multiple Ship-To Addresses, that order's display within the customer's account-related pages changes to reflect the multiple addresses:

  1. On the main My Account page, the Ship To column of the Previous Orders table shows "Multiple Addresses".
  2. On the My Account :: History page, the Shipped To field shows "Multiple Addresses".
  3. On the Order Information page, the Delivery Address shows "Multiple Addresses" and the order's details are broken out by ship-to address.

Install and Un-install Instructions

Installation

There are no core-file overwrites and no template overrides. You should still back up your database and files before installing anything, but there is nothing to merge.

  1. Unzip the plugin's package.
  2. Copy the zc_plugins/MultiShip folder into your store's zc_plugins directory, so that you end up with /zc_plugins/MultiShip/v3.0.0/ containing manifest.php. Nothing goes anywhere else — do not copy anything into /includes/ or into your admin directory.
  3. Sign in to your Zen Cart admin and go to Modules → Plugin Manager.
  4. Find Multiple Ship-To Addresses in the list and click Install. This creates the tables, adds the configuration settings and registers the invoice and packing-slip pages.
  5. Go to Configuration → Multiple Ship-to Addresses and review the settings described under Zen Cart Admin Interfaces. The defaults are usable as they stand; there is no enable switch to find, because installing the plugin is what enables it.
  6. Before you take real orders, audit your product weights — see the warning immediately below.

Product weights matter more than they used to. Multiship quotes shipping separately for each address, so it exposes gaps in your product data that a single-address order hides.

A product with no weight is already quoted wrongly on every order you take — but a single-address order absorbs that error into one total where nobody notices. Split the same cart across three addresses and the same missing weight produces three visibly wrong quotes. The same applies to dimensions, which newer carrier modules use for dimensional weight.

Nothing in this plugin can compensate for missing data, and it deliberately does not try: a guessed weight is worse than a visibly wrong one, because it looks right. If you are about to enable multiship, audit the weights on anything bulky first.

One thing you do not need to worry about: a sub-order heavier than your carrier's limit. Zen Cart splits a consignment into multiple boxes once it exceeds SHIPPING_MAX_WEIGHT, and because multiship quotes each address independently, that calculation is done per address. Three heavy items going to one recipient are boxed on their own weight, not the whole order's.

Upgrading from v2.x: install this version from the Plugin Manager, then delete the individual files the older version had you copy into /includes/ and your admin directory, and restore your own copies of any core or template files you merged its changes into. Your existing multiship orders are not affected — the database tables are the same, and the installer leaves existing data alone.

Uninstall

  1. Go to Modules → Plugin Manager, find Multiple Ship-To Addresses and click Uninstall. This drops the two multiship tables, removes the orders_multiship_id column from orders_products, removes the configuration group and its settings, and de-registers the invoice and packing-slip pages.
  2. Delete /zc_plugins/MultiShip/ from your file system.

There is no SQL patch to run and nothing to restore, because nothing outside /zc_plugins/ was ever changed.

Read this before you uninstall. The uninstall is thorough, and that cuts both ways: it discards the record of which items went to which address on every multiship order you have ever taken. The orders themselves remain, with their products, totals and payment details intact, but the per-address breakdown is gone for good — from the customer's order history, from your invoices and packing slips, and from the database. It cannot be recovered by reinstalling, because the column tying each product line to its sub-order is dropped along with the tables.

If any of that history matters — and it will if you have unshipped multiship orders on the books — take a full database backup first, and do not uninstall until those orders have been delivered.

Version and Change History

File lists below are marked [+] added, [-] removed, [template] a file in your active template, and [core] a Zen Cart core file. Each marker is a word as well as a color, so the list reads the same whether or not the colors do.

Back to Top