Shipping

Delivery zones with flat and weight rates, Standard and Express, free delivery over an amount, delivery dates, PIN checks, tracking links.

This version needs ShopClass 7.1, which is in beta. Try it on a test site, not a live one.

Version
0.2.0
Updated
30 October 2026
Works with
Shops
Needs
ShopClass 7.1 or later
PHP
8.2 or later
Tested with
ShopClass 7.1
Category
Integrations
Price
Free
Licence
GPL-3.0+
Downloads
2
Made by
Navjot Tomer
  • Shipping zones
    Shipping zones
  • Shipping settings
    Shipping settings
1 / 2

Delivery zones for ShopClass shop orders: flat and weight-based prices, shipping class charges, Standard and Express delivery, free delivery over an amount, delivery dates, PIN code checks and courier tracking links.

Requirements

  • ShopClass 7.1.0 or later, in shop mode
  • PHP 8.2 or later
  • No outside accounts. No cron, worker, Redis or shell needed.

Install

  1. Open Plugins → Browse (or upload the zip from the GitHub release).
  2. Install.
  3. Activate.

Set up

  1. Open Billing → Shipping and press Add zone.
  2. Fill Name, then Countries, States and PIN or postcode starts for where it covers. Leave a list empty to cover everything. Under Shipping class charges, write one class per line with its extra charge, such as bulky = 200.
  3. For Standard delivery and Express delivery, turn on Offer this method in the zone and set Name at checkout, Price, the weight included, the price per extra kilo, the free-over amount and the delivery days.
  4. Press Save zone. Use Move up and Move down to order zones.
  5. Open the Settings tab on the same screen:
    • Zone used before an address is known
    • An address no zone covers
    • Weight of an item with none set (grams)
    • Couriers and tracking links

Amounts are in the site's currency.

How it works

  • The most exact zone wins: a PIN start beats a state, a state beats a country. Among zones of the same kind, the one higher in the list wins.
  • A zone with states needs the shopper's state. A zone with PIN starts needs a PIN. 11 covers every PIN starting 11. States ignore capitals and spaces.
  • A zone with every method off never matches.
  • Before the shopper gives an address, the default zone prices the cart. With no default zone, core's flat rate shows.
  • Price: amount + per_kg × (started kilos above the included weight). Every started kilo counts, so 1,001 g over is two kilos.
  • Delivery is free once the items reach the free-over amount. Empty means never. That amount also drives the cart's free-delivery meter.
  • An item with no weight counts as the default weight.
  • Shipping classes come from each product variant's Shipping class. A class with a charge in the zone adds that charge for each item, on top of the price. Free-over still makes the whole delivery free.
  • Items in the class free ship free and add no weight. A cart of only free items ships free.
  • A method with fastest and slowest day counts shows a date range, such as "20 Oct - 21 Oct". One day exactly shows "Tomorrow". Both at 0 shows no date. The estimate is kept on the order's shipping line.
  • For an address no zone covers, Refuse it (default) says "We do not deliver to this PIN code yet." or "country". Keep the standard delivery rate keeps core's flat rate.
  • Tracking: under Couriers and tracking links, write one per line, a name, a comma and an https link with {tracking}:
    Delhivery, https://www.delhivery.com/track/package/{tracking}

    When an admin ships an order with a matching courier name and a tracking number, the buyer gets that link. Links that are not https, or lack {tracking}, are refused.

Notes / limits

  • With no zones at all, nothing is refused.
  • An address missing the PIN or state a zone needs is not refused. The default zone prices the cart until the shopper types it.
  • No database query when a cart is priced. Zones are read from the settings core already loads.
  • Without the cart hooks (older ShopClass), the plugin loads, does nothing and says so in the admin.
  • Zones and settings are preferences in the shipping section. No table of its own.
  • Uninstalling removes the zones and settings. Orders keep what they were charged.

For developers

Listens to the filters cart_shipping_methods, cart_problems, cart_free_over and billing_tracking_url. It fires no hooks.

Translations: copy languages/shipping.pot to languages/<locale>/messages.po, translate, and compile to messages.mo. Rebuild the template with php tools/make-pot.php.

Tests: ./tests/run.sh (unit) and php tests/integration/quote.php (needs core's scratch MySQL on port 33061).

Support

GitHub issues

What's new in 0.2.0

New

  • Shipping class charges per zone, such as bulky = 200 for each bulky item. Items in the class "free" ship free.

Found a problem with Shipping? Open an issue on GitHub.