Rotozoom Sell & Ship — User Manual
Couriers, checkout and invoices in one plugin. Sell & Ship replaces the standard WooCommerce address form with a courier picker, quotes the real price from the courier's own API, prints waybills from the order screen, follows the parcel until it is delivered, and issues the sales documents your accounting needs.
- Free version: all courier integrations, the checkout picker, waybills and tracking, delivery statuses, invoicing and the fiscal export for your own country, and the shop's own customer-reputation history.
- Pro version: the multi-currency and multi-language layer, and cross-border (international) fiscal handling. Couriers are free in every country.
What's new in 1.9.2
- The order is always in the store's currency. When a shopper browses in another currency, the checkout, the payment, the emails and every document stay in the shop's base currency, and the foreign amount travels as a reference: two rows, "Currency for reference:" and "To be paid only in EUR:" (with your own currency code), on the checkout summary, the thank-you page, My Account, all order emails and the PDF documents. Previously a switched currency could reach the gateway as a base-currency number under a foreign code.
- Speedy pallet delivery. Under Settings → Speedy → "Pallet delivery": "Pallet service" (empty — "— Do not offer pallets —" — means off, and off means exactly the behaviour from before this feature), "Default pallet height (cm)" (180) and "Pallet sender (contract address)". A pallet is used for shipments over 50 kg or whose volume exceeds what the standard service takes in one package, to an address only — Speedy does not allow a pallet to be handed in at an office. On the volume branch both services are quoted and the cheaper one is charged.
- Reputation precheck. When a flagged customer is recognised, cash on delivery now disappears 2 seconds after the checkout form is complete (both names, phone and a valid email), instead of only when the order is submitted. The new setting "Do not tell the customer why cash on delivery is unavailable" is on by default — the method simply is not there. A refused submission always carries its reason.
- A named accuser may remove cash on delivery. A source of the "accusation" class that you have explicitly armed with block is now honoured at checkout; the default for such a source stays notify.
- Econt: the packing list for a department payout agreement. Where your Econt cash-on-delivery agreement is a department agreement, the waybill now carries a digital packing list — Econt refuses such a waybill without one, and its validation step does not catch it.
- Econt: requesting a courier now re-sends the complete waybill, because Econt's update call replaces the label rather than patching it.
- Seams for other plugins:
rotozoom_ss/shipment_deliveredandrotozoom_ss/shipment_returnedevents,window.rotozoomSSBlocksApplySaved()for applying a saved address on the block checkout, and a standalone courier picker that can be rendered outside the checkout. B2B Manager 1.2.0 is the first consumer of all four.
For newcomers: what this plugin does
A WooCommerce checkout asks for a street address. A courier wants something more precise: which office, which locker, which city id in its register, how heavy the parcel is and who pays for the delivery. Sell & Ship bridges the two:
- The shopper picks a courier and a delivery type (to an office, to an address, to a parcel locker) and searches the courier's real list of locations, on a list or on a map.
- The price shown is the courier's own quote for that basket and that destination, not a flat rate you guessed.
- When the order arrives, you print the waybill from the order screen and the tracking number goes to the customer.
- The sale is documented — invoice or fiscal receipt — with the numbering your law requires.
Setup
1. Choose your store country
Settings → General → "Store country" decides which courier and fiscal features are shown. The Bulgarian courier and fiscal tabs (Econt, Speedy, BoxNow, NRA H-18, Customer reputation) appear when the store operates in Bulgaria.
2. Connect the couriers you use
Each courier has its own tab — "Econt", "Speedy", "BoxNow" — where you enter the credentials from your contract and pick the sender (the contract address a shipment is collected from). Use the synchronize buttons to pull your contract addresses and the services your contract actually allows; the plugin never guesses a service you do not have.
3. Add the courier methods to a shipping zone
The courier methods are ordinary WooCommerce shipping methods. Add the ones you offer to the shipping zone for your country, and the checkout picker will present them.
4. Set up documents
The "Invoices" tab holds your company data, the numbering series and the document settings; "NRA H-18" holds the fiscal export for Bulgaria. Documents are issued at payment: a card order when it is captured, a bank-transfer order when it is marked as being processed, a cash-on-delivery order when the delivery is confirmed. An unpaid order never consumes a number.
Feature reference
The checkout picker
For a domestic order the standard address fields are replaced by:
- courier buttons (Econt / Speedy / BoxNow) with their logos,
- delivery-type cards (to an office, to an address, to a locker) with the price of each,
- a location form — search an office by town or name, pick it from the list or the map, or fill in a street address.
The picker is served from a local copy of the courier nomenclature, so searching is instant; the list and the map read the same rows and can never disagree. It works on the classic checkout and, in its own form, on the WooCommerce Checkout block.
Real prices from the courier
The rate shown for a courier method is the courier's own quote for that basket, cached briefly and falling back to your flat rate only when the API fails. Weight and dimensions come from the products; a multi-package shipment is split and declared as separate parcels.
Waybills and the order screen
Every order gets a "Delivery" panel with the courier's tab:
- preview and create the waybill, print the label in the size your printer wants,
- void a label,
- see the current shipment status,
- change the sender for this one order,
- "Request a courier" where the parcel is collected from an address.
Tracking, delivery statuses and returns
The plugin follows the shipment and records when the courier confirmed the delivery, and when a parcel is refused or comes back. The status "Unclaimed" exists for a parcel the customer never collected, with its own settlement flow. Shipment events are published for other plugins as rotozoom_ss/label_created, label_voided, rotozoom_ss/shipment_delivered and rotozoom_ss/shipment_returned.
Pallet delivery (Speedy)
A basket over 50 kg, or bulky enough that its volumetric weight exceeds what the standard service carries in one package, is quoted as a pallet — one 80 × 120 cm EUR pallet, height taken from the products or from "Default pallet height (cm)", to an address only.
Three things are worth knowing before you switch it on:
- The pallet tariff depends on which contract address it is quoted from — measured on one 153 kg shipment: €29.36 from one contract address against €167.46 from another, while the standard parcel service costs the same from all of them. That is why "Pallet sender (contract address)" is a separate control.
- A pallet is not automatically cheaper. On the volumetric branch the plugin quotes both services and charges the cheaper one; on the "over 50 kg" branch there is no parcel alternative.
- Leaving "Pallet service" empty is a real off switch. The plugin then behaves exactly as it did before the feature: a shipment over 50 kg simply gets no Speedy rate. A missing option counts as off, so an update never switches the feature on for a shop that did not choose it.
Customer reputation
An optional layer that can withhold cash on delivery from a customer whose delivery record justifies it.
- The shop's own delivery history is always available and always free — it is first-party, correctable, and yours.
- External registers can be connected with your own API key. A register of the "statistical" kind needs a minimum sample before it counts at all; a register of the "accusation" kind only removes a payment method if you explicitly arm it to.
- Since 1.9.2 the check runs 2 seconds after the checkout form is complete, so the method disappears before the shopper reaches Place order; the check at submission remains as a backstop. "Do not tell the customer why cash on delivery is unavailable" (on by default) keeps that silent; a refusal at submission always explains itself.
- Blocking is deliberately locked behind a server constant that identifies your proxy, so the rate limiter cannot be fed a visitor-chosen value.
Invoices and fiscal documents
Documents are issued at payment and dated by it. The invoice for a cash-on-delivery order is dated by the delivery the courier confirmed. A monthly archive exports the invoices issued in a chosen month, and the NRA H-18 tab produces the audit file for the Bulgarian revenue authority.
Local (home-country) invoicing, VAT and the fiscal export are free. Cross-border fiscal handling is Pro, and it is gated on the order's country at the data layer, not in the interface.
Saved addresses
A logged-in customer can save the point a parcel goes to — but only when they tick "Save this address" and name it, so the book never fills itself with one-off addresses. Delivery and billing records are kept as two separate lists, because a company that ships to five offices should still enter its company ID only once. Saved points are applied through exactly the same path as the list and the map, so they cannot drift out of step with the picker.
Localization: currency and language (Pro)
A two-tab widget lets visitors browse in their own language and currency, with the rates refreshed daily from the ECB.
How money is handled (since 1.9.2): the conversion is a browsing convenience. The order, the payment and every document are always in the store's base currency, and the chosen currency appears as a reference pair — "Currency for reference:" and "To be paid only in
Multisite
On a WordPress network each sub-site can be pinned to its own language and currency through a network-level map, instead of being detected from the visitor's IP.
Free vs Pro at a glance
| Feature | Free | Pro |
|---|---|---|
| Courier integrations, checkout picker, real quotes | ✓ | ✓ |
| Waybills, labels, tracking and delivery statuses | ✓ | ✓ |
| Pallet delivery (Speedy) | ✓ | ✓ |
| Saved delivery addresses | ✓ | ✓ |
| Invoices and fiscal export for your own country | ✓ | ✓ |
| Customer reputation: your own delivery history | ✓ | ✓ |
| Customer reputation: one external in-country register | ✓ | ✓ |
| Customer reputation: several registers, out-of-country registers, bulk checks, usage dashboard | — | ✓ |
| Multi-currency and multi-language layer | — | ✓ |
| Cross-border (international) fiscal handling | — | ✓ |
Advanced notes
- A courier refusing a waybill is almost always a missing mandatory field, and each courier reports only the first one. Read the whole error, including the raw response the plugin prints, before changing anything else.
- Read-only calls are retried; a waybill is never retried. A repeated waybill call would be a second parcel.
- The nomenclature refresh replaces a list only against its own successful response — a half-finished refresh is recorded and visible rather than silently emptying the picker.
- Integrating another plugin: listen to
rotozoom_ss/shipment_deliveredandrotozoom_ss/shipment_returned(deduplicate yourself — the hourly job re-reads), apply a stored destination on the block checkout withwindow.rotozoomSSBlocksApplySaved(record), and render the picker outside the checkout with the standalone mode, which reports its result as arotozoom-ss:destinationDOM event. - Known limitation: on the block checkout a proforma for a bank-transfer order is not issued, because the WooCommerce Store API does not fire the hook the document engine listens to.
Troubleshooting
- No offices in the picker — the local nomenclature is empty for that courier; run the refresh from the courier's tab and check the status tab for a half-finished refresh.
- "There are no shipping options" — the basket may be over the legal cash limit for cash on delivery, or heavier than the selected service accepts; check the courier tab and the order's weight.
- Cash on delivery is missing for one customer — the reputation layer withheld it. The audit log in the reputation tab names the source and the reason.
- A pallet is quoted very expensively — compare a real quote from each contract address and set "Pallet sender (contract address)" accordingly; the tariff differs per address.
- The customer was charged in the wrong currency — update to 1.9.2 or later: orders are now always in the store's base currency, with the foreign amount shown only for reference.
- An empty label PDF — reprint from the order screen; a zero-byte file means the print call was built in the wrong shape and the plugin's own call is the one to use.
To connect a Pro licence, see Installing and updating plugins.