# Shipping Module

# Default Shipping Method

#### 1/ Default Shipping Method rules:

For recipients on our 1 or 2 day zipcode list we want to pre-select UPS Ground - code **UPS\_03**

So 1 or 2 day ground zips should default to **UPS\_03**

Everything else should default to **UPS\_02**

nothing should default to overnight / UPS\_01, that’s the more expensive option and would only be used by request.

2/

# Picked Up (pickup) at Fran's

Pick-up at Frans orders (pick-up orders) are orders that have ship method `Pick Up at ...` . The order will be picked up in one of the four pick-up stores in Frans.

Here are the steps to process a pick-up order:

#### Step 1: Place order  
  


Make an admin single ship pickup order by picking the fran's store and pickup method.   
When placing order, choose ship method `PickUp.. `; such as `Pickup Downtown`. Make sure shipping address matches.

#### Step 2: Ship

Go to the QA page and create `Create Shipment` to make the shipment.

#### Step 3: Print tickets in QA

It must be in 'printed' status to process the pickup: click `Print` button.

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/scaled-1680-/v8Limage.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/v8Limage.png)

Print page will be shown:

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/scaled-1680-/uRTimage.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/uRTimage.png)

  
  
  
Click 'Print Tickets' then either print the document, or cancel the print dialog. That will change the QA/Shipment to printed status:

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/scaled-1680-/cW0image.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/cW0image.png)

#### Step 4: Mark QA as Ready For Pickup

  
Go back to the QA page, you should see button '**Ready for Pickup**' option now, click that one. Shipment will be generated, and QA should look like this:

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/scaled-1680-/qyDimage.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2024-08/qyDimage.png)

#### Step 5: Pick up the order

On QA page, click 'Picked Up'. That will finalize the pickup order and create the invoice. A `picked up` email will also be sent.

# Frans custom for Shipment module

Frans shipment has some custom.

#### 1/ Shipment created vs shipment shipped  


Shipping process goes like this:   
\- step 1 - Shipper creates a shipment  
\- step 2 - Shipper adds packages to shipment  
\- step 3 - Shipper adds products to shipment's packages  
\- step 4 -Shipper prints label

Notice that after step 4; sales\_shipment has column `ship\_date` populated. Before step 4; `ship\_date` is empty.

We use `sales\_shipment` column `ship\_date` to determine if and when the shipment **ACTUALLY** shipped. We call that column actual-ship-date. Do **NOT** use `sales\_shipment` created\_at column - that column only means that shipment begins (step 1).

# Check cutoff date in FE checkout

11/19/24

In frontend checkout, there's a js polling that runs every 1 minute to get the latest cutofftime

# Offline Mode

For shipping with UPS, there's an offline mode:

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-03/scaled-1680-/image.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-03/image.png)

When Offline Mode is Yes, ship rate calculation is faster. No need to call UPS for live rates.  
Please use this with care; because it might give you outdated UPS shipping rates.   
Only use this `Offline Mode` for development; and remember to turn it off after use.

# Print Multiple packages per ship - UPS

Shipping Manager - Allow multiple packages for a shipment

Example Shipping Manager UI; which has box `**Number Of Labels**` :

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-03/scaled-1680-/aLKimage.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-03/aLKimage.png)

For example, admin chooses Number Of Labels = **3** , and click `Print Shipping Label`  
  
`shipping\_manager.js` calls ShippingManager/Post/Index

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-06/scaled-1680-/image.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-06/image.png)

Behind the scenes, app/code/Frans/ShippingMethods/Model/Carrier/Ups.php function requestRestQuotes() sends multiple packages to UPS API. UPS returns with **3** labels for **3** packages

[![image.png](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-06/scaled-1680-/UvTimage.png)](https://frdocs.socalappsolutions.com/uploads/images/gallery/2025-06/UvTimage.png)

With the 3 zpls returned, js function writeToSelectedPrinter(zpls) is called. This function sends 3 zpl labels to the [BrowserPrint SDK ](https://developer.zebra.com/products/printers/browser-print)

BrowserPrint sends those 3 labels to the physical Zebra printer.