Zenkraft Blog

Run your Logistics and Post-Purchase Experience on the Salesforce Platform.

Add External UPS tracking numbers to an Order

Published on 14 March 2017 by in salesforce tracking 

In today's blog post we’ll show you how to add externally created UPS tracking number to an object. Most common use cases are to get updated tracking, that you are then able to query using the standard Salesforce reporting. We will be using the Order object in our demo here.


Trigger on the Order Object:

Line 3: For when a brand new order is added with a tracking number

Line 6: For when the tracking number field is updated


The trigger Handler class:

This is where the work gets done.

Line 4: You will need to contact us to get the ModKey value that allows the creation of a Shipment Object (without actually going through our package for the shipment creation process).

Line 7-11: You need to create a custom setting to store the ID of the preference, so that when you move this code from your sandbox org to your production org, its easy to update the custom setting to your saved UPS preference.

Shipping Settings

Line 27-39: For any new Orders, create the new shipment with the zkups__MasterTrackingId__c and make sure its linked to your UPS Preference via the zkups__UPSShipmatePreference__c.

Line 40-63: If you are just updating the tracking number field (FB_Tracking_Numbers__c) on your Order, this lines take care of the shipment creation.

Line 67-69: If a shipment has been queued for insertion, then we insert the Shipments.

The @Test class, is needed for the code coverage to be able to deploy into production.

Any questions, please do not hesitate to contact us!

Continue reading »

Create a FedEx shipment from a trigger on the Account object

Published on 08 March 2017 by in salesforce fedex 

Today’s blog post explains how to create a FedEx shipment directly from a trigger on a standard Salesforce Account object. You will need our FedEx app and our Bulk Shipping package (sandbox install link, production install link, please be aware there are extra licensing costs for using the bulk package.) Contact us if you need any further information.


Firstly, create a checkbox on your account object. Let’s call it Create_Fedex__c. We will run the shipment creation process when this gets set to TRUE.

To store any validation errors (such as incorrect addresses), you need to create a custom object called Zenkraft_Validation_Error__c. Fill in the fields as you see here:

Custom Object Zenkraft Validation Error Salesforce Enterprise Edition

Next, create the trigger on the Account object. You can see the code below:



The trigger calls the AccountTriggerHandler that determines whether the checkbox has been set to TRUE, and if so, creates the shipment.

Lines 13-20: Get the address information from the account object that is needed to create the shipment.

Lines 25-33: Create the queued shipment.

Lines 35-43: Create the package, including the weight and declared value.

Lines 45-47: If the above have been generated successfully we use the processShipments method to start the creation process



FedexShipmentService is the class that allows the easy creation of the QueuedShipments, it gets the account details from the FedEx account that you have set up, and creates the BulkShipment where we store all the shipment information before we actually send it to be processed.

Lines 6-41: We set the zkfedex__ServiceType__c , zkfedex__PackagingType__c for the shipment along with the sender and recipient addresses.



To handle any errors, create another trigger. This time put it on the Queued Shipment Status object.



And the respective trigger handler code is below:



Happy coding.

Continue reading »

Multiple Package Returns for UPS and Auto Printing

Published on 28 February 2017 by in ups returns 

This weeks post will detail how to achieve the following using our package, and some apex code.

  • Multiple Package Returns for UPS
  • Auto Printing

Multiple Package Returns for UPS

Currently the UPS api only allows the creation of 1 return label at a time. So if you want to create 20 return labels at once you need to set up a batch process to create them individually but group them into a Bulk Shipment which then allows you to print them all off at once.

We first need a method to create our bulk shipments, which we then reference later on in a loop.

Line 2: create a new queuedShipment object.

Line 3: set this new queuedShipment to be in the bulkShipment object.

Line 4-9: Sets the payment type, service type, units, labeltype, packaging type and the account this shipment is related to.

Lines 12-20: sets the sender address from the shipping preference.

Lines 23-30: set the recipient address details from the account.

Liens 33-35: set the values needed to create a return shipment.


Then we utilise a loop for the number of labels we will be creating. The code to loop through and to eventually send the shipments to be created is here:

Line 5: Create the bulkShipmentId that we will then send for processing after we have created the queuedShipments

Lines 10-21: This is the for loop where we go through creating the list of queuedShipments and creating the packages that are also required.

Line 28: is where we send the bulkShipment to be processed.

Lines 44-55: show how to create the packages.


Auto Printing

Our package is already setup to auto print a shipment label and all related documents from the shipment view page. All you need is the salesforce id of the shipment that has been generated. After shipment creation, you need to redirect the user to the shipment using the code below, and as long as you have setup the users default printers in the “Manage Printers”, the printing of all the labels and documents related to that shipment will automatically print on the respective printers. For example if you have a thermal shipping label and an international document, they will be printed to the thermal printer and to the laser printer respectively.

String redirectUrl = ‘/apex/zkups__ShipmentViewV2?autoprint=1&id=’ & shipmentId;

Any questions, please contact us and we will be happy to help you out.

Continue reading »

Convert a GIF shipping label image to PDF

Published on 31 January 2017 by in apex salesforce 

In today’s blog post we’re going to show you the codes needed to convert a GIF shipping label into a PDF document.

We’re going to use pages, classes, and controllers.

APEX Class

The first method we need to look at is regenerateGifToPdfLabel (line 2). The steps are as follows:

The createPDFLabels (line 25) method in step 3 above calls the generatePDFLabel method (line 35).

Next create a new attachment object pdfLabel, which will be the PDF file (line 36). Line 38 is where we reference our VisualForce page, that will contain the original GIF file. The VisualForce page code can be found at the bottom of this post.

Line 41 sets the Body of the new attachment object as the blob that is returned from the standard SalesForce method getContentAsPDF();.

APEX Controller

Line 6-7 basically set the variable that will be used in the VisualForce page.

VisualForce Page

Line 25 is where the GIF shipping label is inserted, which is then rendered as a pdf from the code we have already looked at from above.

Happy coding.

Continue reading »

Part 3 of 3: Pick and Pack Station with ERP Integration

Published on 23 January 2017 by in salesforce 

A few weeks ago we wrote about our Pick and Pack implementation, detailing how we’ve created the system, the custom labels and automated custom printing.

Today we will expand on this to show you how we can integrate with one of the ERP solutions that are available on salesforce. We will use Rootstock as an example.

One function of ERP systems are to manage the process for inventory for Picking, Packing and Shipping. In this post we will discuss the Packing and Shipping part of the process and the API calls needed to the Rootstock system to achieve this.

The process that we use is as follows:

1. Put all packed items into Custom Objects called Shipping Containers.

2. Depending on whether all the items are being shipped at once (Full shipment) or in batches (Partial shipment) we make different calls to the Rootstock api and create the Rootstock Shipper object.

3. Create the Container Objects and attach the newly created Zenkraft Shipping label information to them.

Here are the steps in more detail:

1. If we look back at our pick and pack screenshot here:[caption id="" align="alignnone" width="1248"]

Pick and Pack Station in Salesforce[/caption]

We store the items you can see in the “In Progress Containers” section within our own Custom objects called Shipping Containers. There is no interaction with Rootstock at this stage as we are just preparing the information ready to create a Rootstock Shipper.

2. Once the user clicks the “Finish Button”, we make a call to the Rootstock API to signal the items that have been packed, and request a new shipper to be created.The two key points to keep in mind here are whether the shipment is a FULL or PARTIAL shipment.FULL:A FULL pack order is when ALL the items on the Sales Order have been packed and are ready to be shipped. On the Rootstock side, this gets processed straight away.

In the code example below, we set the transaction type (line 2) to ‘Sales Order Pack’, we set the background processing (line 5) to false, and the all lines variable (line 6) to true. Line 6 specifies that this is a full shipment type.


A partial shipment is when you might have a very large order, but there are some items that haven’t been picked as available yet in the packing warehouse meaning that the order cannot be completed in 1 shipping session.

As there could be hundreds of lines have been packed we need to be careful to not hit any Salesforce SOQL limits, which is why we use the code below to ensure these limits do not get hit and end up with an error.

Line 8 is where we specify this is a partial shipment by setting alllines__c = false, and line 9 is setting backgroundprocessing__c = true. For each of these individual line items that are being packed we need to create a transaction, which we then send to be processed by the Rootstock ERP on line 19.

3. Once the items have been marked as packed and the shipper has been created, we set our queued bulk shipping process to start creating the shipping label.The next set is to create the Rootstock Container Objects which we do using this code:  

We set all the container fields from line 2-19, with line 19 adding the new shipments tracking number.

And that is how we are able to integrate our Pick and PACK station with an ERP system.

Continue reading »