Zenkraft Blog

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

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 »

The new Multi-Carrier Shipping App for Salesforce is now Live on AppExchange!

Published on 10 January 2017 by in multi-carrier ecommerce salesforce 


Shipping inside Salesforce just got better, with the introduction of the new Multi-Carrier Shipping app to the AppExchange. Users can now choose between 30+ carriers to manage their logistics within the CRM platform(Multi-Carrier supports all Salesforce Editions: Group, Professional, Enterprise, Unlimited,, Developer, Performance).

Today, Salesforce users can create shipments, schedule pickups, track, and set up automation rules for carriers such us: DHL, Parcel Post, Canada Post, Australia Post and TNT.

You can find a full list of the supported carriers on our multi-carrier product page. We aim to add several new carriers each month over the coming years.

Like our FedEx, UPS and USPS shipping apps for Salesforce®, the Multi-Carrier app also brings great features to businesses searching for solutions in the AppExchange ecosystem. Companies can benefit from:

  • Sending mail or shipping packages to any Lead, Contact, Account, Opportunity or any custom object
  • Saving time with One-click shipping
  • Calculating and comparing rates
  • Generating and printing labels to standard and thermal printers
  • Tracking shipments automatically
  • All this and more without ever leaving Salesforce

Because we build our apps natively on, users can seamlessly integrate with all the order management and supply chain management apps that businesses currently use, like Kenandy, Accounting Seed, Conga Composer, Glovia, Ascent, Cloud Conversion, ChikPea, Veeva, Rootstock and FinancialForce.

Sound interesting? Book a meeting with one of our team for a personalized demo.

Can’t wait? Get started now, go to Multi-Carrier in AppExchange and start your free trial today!

Continue reading »

Bulk Shipping From a List View in Salesforce

Published on 13 December 2016 by in apex salesforce bulk shipping 

Today we are going to create shipments in bulk from the Contacts list view. By the end of this tutorial you will be able to add a button to the contacts list view as you can see here:


This will take you to the preview and bulk processing page here:


Once the shipments have been processed you will be redirected to the printing page:


Below are the steps:

1. Create the visualforce page. Code is below:


Make a note of line 11 above, this is the poller that runs every 5 seconds once we have sent our shipments to be processed. It’s used to check the current status of the bulk processing. If there are errors it will display them, or if the process completes successfully you will be redirected to the printing page.

2. Now, the main part of the programming takes places, which is our controller. Here is the full code snippet, and we will explain sections of it below:


The controller retrieves the list of selected contacts and creates a queued shipment object for each of them. Once that’s completed, we add this list of queued shipments to a bulkshipment object and then request the processing of this bulkshipmentobject via the processbulkshipments method.

Lines 6-8 retrieves the IDs of the contacts that we have selected on the previous page and Lines 10-15 selects the relevant shipping information for each of those contacts:


The next code block gets called when we click on the CreateShipments button on the VisualForce page we created earlier. The first thing we need to do is to create the BulkShipmentID that we will be adding all the queued shipments to (Line 6).

Lines 7-12 is where we create one queued shipment for each contact that has been selected, and add it to the queuedPackagesList. Line 9 is where we call the createQueuedShipmentRecord method, and we will explain this method a little later in this blog post.


For each queued shipment we have to create the package information so that UPS knows the weight and value of each package (Line 14-23).

At Line 26 we set the bulk Shipment to start the validation process, and Line 28 is where we start the poller.

The next code block is used to check the status of the current bulk shipment once it’s been sent for processing.

Some important lines to note here are:

  • Line 4, retrieves the current BulkJob status.
  • Line 21, if there are no validation errors we can send the shipments to be created.
  • Line 37, which sets where the user should get redirected to once all the shipments have been generated. In this instance we are sending the user directly to the printing page. Code below:

Now we get to the createQueuedShipmentRecord method and this is where we set the ServiceType, Packaging Type, Send from and Send to addresses.


Lastly, we call the validate and process bulk shipment methods that are referenced in the checkStatus method.


3. Finally, we tie it all together by creating the custom button on the Contacts list view to link to our new visualforce page.

We need to create a custom button on the contacts object. We do this by going to Setup > Customize > Contacts > Buttons, Links, and Actions and clicking on “New Button or Link


Complete the fields as you see here:


Next, add this button to your Contacts list view, which you can do by first going to Setup > Customize > Contacts > Search Layouts and editing the “Contacts List View” layout. Once this is done, move the bulk processing button you just created across to the “Selected buttons” section.


Continue reading »

How to Create a Shipment off a Trigger on Salesforce

Published on 06 December 2016 by in salesforce 

Here we will show you how you can create a shipment directly via a trigger on your Account object. For this example we will use our UPS app with our ShipAutomate product.

First, set up a trigger on your account object. This trigger will run each time the account is updated.


The trigger calls this apex class “AccountTriggerHandler”. The full code can be found here, but we will walk through it further down:


  1. First thing we need to do is get the UPS Shipment Preference and the associated preference details needed to create a shipment. We just select the top preference as we are only going to be using one preference on our test org.


  1. To support the Salesforce bulk process, we need to create a bulk shipment map to store Accounts and Zenkraft bulk shipments. For example, if we update a list of Accounts in Salesforce, this code below ensures that all Accounts generate a shipment.


  1. The next step is to create our queued shipment objects. This is the main section of our code and where we set all the ship to/ship from and service type details. Line 6, determines the “Service Type” and Line 9 is the “Packaging Type”.

    As the Account is a standard object, all we have to do to link the shipments generated to the account is to add this line of code: queuedShipment.zkups__Account__c = accountId; (as you can see in line 10 below).


  1. After created all the queued shipments, we are able to go to the next step, which is creating a new list of packages for each of the queued shipments. We add a package with a value of $100 and a weight of 2 pounds for each queued shipment.


  1. Final step, we loop through the bulk shipment list and call the ‘processBulkShipment‘ method to create the shipment:


Continue reading »

Part 2 of 3: Pick and Pack station on Salesforce – Custom Labels and Packing Slips

Published on 29 November 2016 by in salesforce 

Last week we wrote a first post on how we created a Pick and Pack station on Salesforce. In that post we’ve covered UI, scanning barcodes and integrating weights and scales. Today we’re focused on label generation and custom printing.

  1. Labels


  • And how it looks once printed out:
  • The quickest way to test your ZPL coding is to load your code into, and press the Redraw button, it will then show you what the label will look like once printed out.
  1. Custom printing
    • By Using our Zenkraft Printing app we were able to send jobs to the pre-defaulted printers based on user actions. Here is some example code to show how we can send labels for printing:


  • In the code above, we can see that ‘line 18’ sends the label for printing, where “this.labelId” is the attachment id of the salesforce object where the label resides.
  • For example, once a box was packed successfully and the user set the box as closed, we automatically sent two print commands; one to the thermal label printer to print out the content label (we mentioned in the previous post), and secondly we send the command to the laser printer to print out the packing slip (our PDF page).
  • Hopefully in the future HTML5 will support native browser printing, but until then our desktop app works great for automating print jobs from the browser.

Continue reading »