Code highlighting

Tuesday, September 16, 2014

Tutorial: Generating shipping labels using the GS1 SSCC-18 barcode format

As a follow up to my previous post about printing labels using the new WHS solution, I wanted to describe an extra feature that is available out of the box in the new Warehouse management solution and allows to generate the license plate shipping label in the format of an 18-digit serial shipping container code (SSCC), which is "used by many companies to identify a logistics unit, which can be any combination of trade items packaged together for storage and/or transport purposes; for example, a case, a pallet or parcel.", as quoted from GS1.

Here is an example of an SSCC-18 barcode (description of each of its components is provided here):

Configuring the SSCC in Dynamics AX

Let's take each part of the code above and see where we set it up in Dynamics AX:

  • Application Identifier for SSCC is always 00 and is therefore also hard-coded in the X++ code
  • Extension Digit in AX is used to specify the type of the logistics unit - pallet, case, etc. This is set up in the Unit sequence groups by specifying a digit 1-9 in the field License plate packing type, and is during work execution retrieved based on the item being processed. If no item is specified, Extension Digit will be set to 0.


There is currently no validation implemented for this field, meaning you can type in any integer. Typing in a value that is more than 1 digit will obviously compromise your SSCC integrity

Here is how I have set up my Unit sequence group "Ea PL" for this demonstration:

  • GS1 company prefix is set up in the Warehouse management parameters and thus will be unique per company in Dynamics AX.


There is currently no validation implemented for this field, meaning you can type in any string with a length of 8 or less characters. The requirement is of course that you only type in numerical data. Note also that according to the standard, the company prefix can be as large as 10 digits, which is not supported in AX right now, but is rather easy to customize if necessary.

Here is how I have set up the GS1 company prefix for this demonstration:

  • Serial reference is currently only set up to be generated based on a number sequence for License plate IDs. Many people request that the Container ID (used as part of manual packing or containerization flows) is used instead, but that's as of right now not possible and requires a customization. 


There is currently no validation implemented to ensure the length of the generated number is within the required 6-9 digits, or that the generated string actually only consists of digits. It is therefore your responsibility to ensure the corresponding number sequence segments are set up correctly, ensuring that the combined length of GS1 company prefix and generated license plate ID is always 16 digits.

Here is how I have set up the License Plate ID number sequence for this demonstration:

  • The check digit is calculated automatically based on the generated ID and appended as the last symbol. No extra setup is required for this.

Mobile device menu item configuration

In order for all of the above to work, we need to make sure that the license plate is generated automatically by selecting the "Generate LP" check-box on the corresponding mobile device menu item.

Here is how I have set up the menu item for executing sales picking work for this demonstration:

OK, that's pretty much it. Now every time that a new target license plate is generated as part of picking sales orders, it will be in the format of a serial shipping container code. All you need to do is actually configure the work template to print the license plates, as shown in the above-mentioned post about printing labels.

The same will apply not only to sales picking work, but to many other types of mobile device flows, which as part of the flow generate a new license plate, both inbound and outbound.

Actual demonstration

To start off, I have configured the work template for sales orders to include an additional step to print the label, as shown on the screenshot below:

Next, I created a new sales order for 75 ea of item 000148_202, where a unit conversion is set up so that 1 PL = 75 ea. The order line is to be dispatched from warehouse 42, as shown below:

I reserve the line (you need to ensure there is sufficient on-hand inventory available for item 000148_202, and it is in a location, which is part of your location directives setup for Sales order picking), and release the order to warehouse, which, in turn, based on my wave template, creates a new wave and processes it, resulting in the creation of picking work that is shown on the image below:

As you can see, the Print steps is there, and the work lines are for 1 PL, which means that when printing the label, PL will be used to determine the value of the Extension digit.

Since the actual printing is already described in my previous post, I will use a different approach this time and will not setup the document routing at all. This will generate the label for me, but won't actually print it.

OK, so now let's proceed and actually execute the work. At the Pick screen, you will see the generated license plate ID, and can confirm that the format is right.


The field is currently editable, so the work user can accidentally overwrite the generated value. This might improve in future AX releases to prevent human error.


I am afraid the contents of the generated ID are a bit off at the moment. If you type in the below SSCC code into a check digit calculator (e.g., here), you will see that the calculator produces a different check digit as compared to Dynamics AX. This is a product issue Microsoft is aware of, and it has been hot-fixed since RTM. The KB article number is 3001157 (should be available on LCS soon).

Once the Pick line is executed, the printing itself will happen, and will create a record in the License plate labels table. Go ahead and complete the Put, and let's review the label information that was persisted by navigating to Warehouse management \ Inquiries \ License plate labels. I took the liberty of hiding the uninteresting fields from the view.

As you can see, all the vital information about the license plate label, as well as the context in which this label was generated are stored, and can be used in the future.
You can, for example, reprint the label, if necessary, using a mobile device menu item with an Activity Code = Reprint label

That's it for today! Stay tuned for more.


  1. Hi,
    Currently when there are multiple items on a pallet, system does not populate the Item ID field on the Licence plate label.
    Is there a way to print multiple SSCC labels for the same pallet when there are multiple items on a pallet?

  2. Hi,
    Currently system does not populate the Item number field when there are multiple items on a pallet.
    Is there a way to print multiple SSCC labels for the same pallet when there are multiple items on a pallet?

    1. There is a new feature that will be available in 10.0.2 that allows to print the contents of the LP as part of the label, including all the work lines, and thus multiple Item numbers.
      Currently there is no way to print multiple labels at the same time iterating over the items. If you just want identical ones - that should be doable, see one of my later blog posts about custom work steps

    2. Hi Ivan, thank you for this blogpost

      What is the feature called that you are referring to here?

      If it is not available yet, can you please link me to the blog post you describe for the custom work steps.

      Matthew van der Zwan

    3. This is talking about the actual GS1 feature that we added support for -

  3. Hi Ivan, Would you have an example of a License Plate label which is generated from Dynamics 365?

    1. It generates ZPL, replacing the variables, so it'd look something like this, but any label is fine, really

      ^FT18,205^A0N,31,31^FH\^CI28^FD$AddressZipCodeIdFrom$ $AddressCityFrom$^FS^CI27
      ^FT423,205^A0N,31,31^FH\^CI28^FD$AddressZipCodeIdTo$ $AddressCityTo$^FS^CI27


Please don't forget to leave your contact details if you expect a reply from me. Thank you