fulfillmenttools
  • Welcome to the fulfillmenttools Platform Documentation
  • Getting Started
    • Setup your access to fulfillmenttools
    • Make your first API Calls
      • Add your first facility
      • Add your first listing
      • Place your first order
    • Core concepts & terminology
      • Order Flow
    • Postman Collection
    • Client SDKs
    • FAQ
  • Clients
    • Backoffice
      • First steps - Registration
      • Network view
        • Home
        • Orders
          • Unroutable orders
          • Pre-orders & Backorders
          • Order History
        • Inventory Management
          • Stock Overview
          • Channel Inventory
        • Facilities
        • Users
        • Returns
        • DOMS configuration
        • Settings
        • Analytics
          • DOMS Pages
          • Fulfillment Operations Pages
          • Inventory Pages
          • Downloads Page
      • Facility view
        • Home
        • Inbound
        • Tasks
        • Listings
        • Storage Locations
        • Facility
        • Users
    • Inventory app
      • Registration Inventory App
      • App sections
        • Inbound
        • Storage and relocation
    • Operations app
      • Android
        • Manual Registration
        • Android Enterprise Registration
        • Sections
          • Picking
            • Load Units (legacy)
            • Substitute items
            • Weighed or measured products
            • Scanning configuration
            • Picking Methods
              • Batch Picking
              • Multi Order Picking
          • Packing
          • Handover
          • Returns (legacy)
        • Printing
        • Notifications
      • Webapp
        • Packing
      • Overview features Android & Webapp
    • Technical requirements
      • Zebra Hardware Scanner Configuration
      • Honeywell Hardware Scanner Configuration
      • Supported barcodes for camera scanning
      • Requirements for fft applications
      • Zebra printer
    • Returns app
      • Handle unannounced returns
      • Handle announced returns
  • Products
    • Core Functionality
      • Process
        • External actions
      • Add and manage facilities
      • Notification Center
      • Checking on features
      • Tags and Stickers Concept
      • GDPR
      • Remote Configuration
      • Expiry
      • Target time
      • Time calculation for queries of future availabilities (LPS-calculation)
      • Interfacility Transfer
    • Carrier Management
      • Overview
        • Available Carriers
      • Concepts
        • Carrier Country Service Mapping (CCSM)
        • Non-delivery-days
        • Custom Carrier & Headless operation of Carriers
      • Providing needed data
    • Fulfillment Options
      • Fulfillability Check
      • Checkout Options
        • Available fulfillment options based on basket
        • Earliest possible delivery date
        • Available delivery dates within time-period
        • Availability for delivery date
      • Delivery Promise
    • Inventory Management
      • Configurations
      • Entities
        • Listing
        • Stock
          • Stock Properties
        • Storage Location
        • Zone
      • Global Inventory
        • Stock availability
        • Channel Inventory
        • Expected stock
        • Inbound Process
        • Reservations
        • Safety Stock
      • Inventory Control
        • Inventory Traits
        • Measurement Units
        • Outbound Inventory Tracking
        • Storage Location Recommendations
    • Order Fulfillment
      • Headless Order Fulfillment
      • Pick Jobs
      • Zone picking
      • Load Units
      • Custom Service
      • Handover Jobs
      • Add External Documents
      • Configurations
        • Picking Configuration
          • Picking methods
          • Short Pick Reasons
        • Packing Configuration
          • Packing Container Types
        • Print / Document Configuration
        • Tag Configurations
          • Parcel Tag Configuration
        • Handover Configuration
        • Operative Container Types
    • Order Routing
      • Entities
        • Ship-from-Store Orders
        • Click-and-Collect Orders
        • Locked Orders
        • Custom Services Orders
          • Simple Custom Service Order
          • Complex Custom Service Order
      • Fences
      • Ratings
      • Order Split
        • Order split - initial routing
        • Order split after shortpick
        • Item bundles
      • Reroute
      • Shape the routing with the DOMS Toolkit
      • Decision logs
    • Returns Management
      • Returns legacy
        • Available status
      • Returns 2.0
        • Return Reasons
        • Item Conditions
        • Integrating Returns with Events
    • Use Cases
      • Demand-Driven Replenishment
      • Expected stock in availability
      • Multi Order Picking
      • Interfacility transfer
      • Assigned Users
  • Connecting to fulfillmenttools
    • General Topics
      • Use external identity providers to authenticate to fulfillmenttools
        • Microsoft Entra ID / Azure Active Directory (AD)
      • Public Event Export
      • Available Regions
      • Backup Policies
    • GraphQL API
    • RESTful API
      • General Topics
        • API Release Life Cycle
        • Versioning
        • Authorization
        • Customization via Attributes
        • Update Guarantees
        • Rate Limits
        • Resource Timestamps
        • Pagination Interface
        • Localization
        • Custom Attributes
      • OpenAPI Specification
        • Swagger UI
        • OpenAPI 3.0 Spec
    • Eventing
      • Structure of an Event
      • Available Events
      • Tutorial
    • commercetools Connect
    • Integration Tutorial
      • Adding facilities
      • Adding listings to facilities
      • Configuring stocks
      • Carrier configuration
      • Placing orders
      • Checkout Options
      • Distributed Order Management System (Routing)
      • Local fulfillment configuration
  • Incident Reporting
    • How to report incidents in fulfillmenttools
    • How to define incident priorities
  • Release Notes
    • Release Summary – May 2024
    • Release Summary – June 2024
    • Release Summary – July 2024
    • Release Summary – August 2024
    • Release Summary – September 2024
    • Release Summary – October 2024
Powered by GitBook
On this page

Was this helpful?

  1. Products
  2. Carrier Management

Overview

fulfillmenttools offers a convenient way to send and track parcels. This page tells you more about the utilization of this feature.

PreviousCarrier ManagementNextAvailable Carriers

Last updated 5 months ago

Was this helpful?

This page is outdated. Please go to our new documentation under .

fulfillmenttools can connect to various carriers allowing you to create shipments and corresponding parcels. Please clarify beforehand which carriers should be made available to your instance.

However, the usage of existing & ready to use carriers is similar and can be used no matter how many carriers you operate.

Carrier

Good to know

By default, a freshly created tenant system does not show the available carriers within the backoffice since most of the carriers are country-specific. Activating a carrier has to be done via API. After that, it can be configured within the backoffice.

To get a list of available carriers you can issue the following call:

curl -sSL 'https://your.api.fulfillmenttools.com/api/carriers' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
{
    "total": 5,
    "carriers": [
        {
            "id": "5s6fF85BaTnQ9f5uT6uaSC",
            "name": "GLS",
            "key": "GLS",
            "deliveryType": "DELIVERY",
            "status": "INACTIVE",
            "version": 2
        },
        {
            "id": "9GvnfJQxdzBcQThaawZjgm",
            "name": "ANGEL",
            "key": "ANGEL",
            "deliveryType": "SAMEDAY",
            "status": "ACTIVE",
            "version": 1
        },
        {
            "id": "b20fbff2-3443-4969-9b9b-f59dff9e875e",
            "name": "DHL_V2",
            "key": "DHL_V2",
            "deliveryType": "DELIVERY",
            "status": "ACTIVE",
            "version": 2
        },
        {
            "id": "b1d65915-6fac-43a5-ac73-695b9f99dfef",
            "name": "Local Delivery Partner in Cologne",
            "key": "CUSTOM",
            "deliveryType": "DELIVERY",
            "status": "ACTIVE",
            "version": 1
        },
        {
            "id": "703f43cb-b15e-44ca-bbb4-56e403e59740",
            "name": "FEDEX",
            "key": "FEDEX",
            "deliveryType": "DELIVERY",
            "status": "ACTIVE",
            "version": 3
        }
    ]
}

The response gives you a list of configured carriers, along with some general information and their key, which describes which kind of implementation is chosen by fulfillmenttools whenever this carrier is used to, for example, issue a label request or setup track and trace connection for a parcel. You can get a more detailed look at a configured carrier by requesting one identified carrier instance, for example:

curl -sSL 'https://your.api.fulfillmenttools.com/api/carriers/b20fbff2-3443-4969-9b9b-f59dff9e875e' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
{
    "key": "DHL_V2",
    "name": "DHL_V2",
    "status": "ACTIVE",
    "defaultParcelWeightInGram": 1000,
    "parcelLabelClassifications": [
        {
            "nameLocalized": {
                "en_US": "Parcel 2 kg",
                "de_DE": "Paket 2 kg"
            },
            "dimensions": {
                "weight": 2000,
                "length": 60,
                "height": 15,
                "width": 30
            },
            "name": "Paket 2 kg"
        },
        {
            "nameLocalized": {
                "en_US": "Parcel 5 kg",
                "de_DE": "Paket 5 kg"
            },
            "dimensions": {
                "weight": 5000,
                "length": 120,
                "height": 60,
                "width": 60
            },
            "name": "Paket 5 kg"
        },
        {
            "nameLocalized": {
                "en_US": "Parcel 10 kg",
                "de_DE": "Paket 10 kg"
            },
            "dimensions": {
                "weight": 10000,
                "length": 120,
                "height": 60,
                "width": 60
            },
            "name": "Paket 10 kg"
        },
        {
            "nameLocalized": {
                "en_US": "Parcel 31,5 kg",
                "de_DE": "Paket 31,5 kg"
            },
            "dimensions": {
                "weight": 31500,
                "length": 120,
                "height": 60,
                "width": 60
            },
            "name": "Paket 31,5 kg"
        }
    ],
    "lifecycle": "GA",
    "deliveryType": "DELIVERY",
    "id": "b20fbff2-3443-4969-9b9b-f59dff9e875e",
    "version": 2,
    "created": "2023-03-07T10:53:32.237Z",
    "lastModified": "2023-03-20T10:27:46.231Z"
}

A Carrier instance is a singleton in any given fulfillmenttools platform. That means in general it can exist exactly once per tenant.

Creation of a carrier

A carrier can be created by issuing the following call:

curl -sSL -X POST 'https://your.api.fulfillmenttools.com/api/carriers' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
                "key": "DHL_V2",
                "name": "DHL",
                "status": "ACTIVE",
                "defaultParcelWeightInGram": 1000,
                "credentials": {
                        "key": "DHL_V2",
                        "apiKey": "myApiKey",
                        "fallback": {
                            "key": "DHL_V2",
                            "billingNumber": "XYZ",
                            "retoureBillingNumber": "optionalXYZ",
                            "dhlBusinessUsername": "Username from DHL Business customer portal (Geschäftskundenportal)",
                            "dhlBusinessPassword": "Password from DHL Business customer portal (Geschäftskundenportal)"
                        }
                    },
                "parcelLabelClassifications": [
                    {
                        "nameLocalized": {
                            "en_US": "Parcel 2 kg",
                            "de_DE": "Paket 2 kg"
                        },
                        "dimensions": {
                            "weight": 2000,
                            "length": 60,
                            "height": 15,
                            "width": 30
                        },
                        "name": "Paket 2 kg"
                    },
                    {
                        "nameLocalized": {
                            "en_US": "Parcel 5 kg",
                            "de_DE": "Paket 5 kg"
                        },
                        "dimensions": {
                            "weight": 5000,
                            "length": 120,
                            "height": 60,
                            "width": 60
                        },
                        "name": "Paket 5 kg"
                    },
                    {
                        "nameLocalized": {
                            "en_US": "Parcel 10 kg",
                            "de_DE": "Paket 10 kg"
                        },
                        "dimensions": {
                            "weight": 10000,
                            "length": 120,
                            "height": 60,
                            "width": 60
                        },
                        "name": "Paket 10 kg"
                    },
                    {
                        "nameLocalized": {
                            "en_US": "Parcel 31,5 kg",
                            "de_DE": "Paket 31,5 kg"
                        },
                        "dimensions": {
                            "weight": 31500,
                            "length": 120,
                            "height": 60,
                            "width": 60
                        },
                        "name": "Paket 31,5 kg"
                    }
                ]
            }'

As you can see there are already some configurations to this carrier provided upon creation. Some of the interesting data is

Attribute
Description

defaultParcelWeightInGram

parcelLabelClassifications

This array of values describes which parcel dimensions should be selectable by a client when issuing a parcel. Please see, that these values are dependent on the carrier and your contract with it. It also maybe not be a mandatory value and could possibly be omitted.

credentials

The credentials that are used to connect to the carriers' API. Which kind of credentials is needed depends on the carrier (selected by the attribute key. In this case the DHL API in Version 2 is selected. Thus we need to provide an API Key. Also there is (especially for DHL) the possibility to provide Fallback Credentials using the legacy DHL API ("DHL Geschäftskunden API" in this case.)

logoUrl

This optional attribute can be used to set a specific logo to a custom carrier or to overwrite the fallback logos for standard carriers provided by fulfillmenttools if needed.

Carrier specific configuration

Depending on the used Carrier implementation (depicted by the tag key) some additional configuration can be used to successfully operate a carrier:

curl -sSL 'https://your.api.fulfillmenttools.com/api/carriers/488bd1a6-6c76-4407-8dab-ece716dac14d/configuration' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
{
    "id": "DHL_V2",
    "version": 9,
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "created": "2022-10-19T10:02:03.545Z",
    "lastModified": "2023-04-03T11:07:21.169Z",
    "returnLabel": false,
    "mustBeWeighed": false
} 

One of the most important configurations is the attribute returnLabel in a given configuration. It tells fulfillmenttools whether a return label should be created with every label requested from the given carrier.

Facility

In this carrier services related use case a facility is a place where CEP services pick up parcels or inter facility transfers are started / finished.

Connection between a Facility and a Carrier

Attribute
Description

cutoffTime

Value (hour and minute) describe the time when the carrier (usually) shows up to take parcels with him. This information is especially useful when configuring SAMEDAY deliveries as it is crucial to have finished any fulfillment process until the arrival of the carrier.

deliveryAreas

This optional value might be of special interest to Custom Carriers and specific SAMEDAY carriers. It shows which target addresses (identified by an array of ISO 3166-1 alpha-2 conform country codes and their respective postalcodes) can be a valid target to a parcel sent via this carrier from the facility.

Connect an existing carrier to a facility

The Carrier

curl -sSL 'https://your.api.fulfillmenttools.com/api/carriers/488bd1a6-6c76-4407-8dab-ece716dac14d' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
{
    "id": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "key": "DHL_V2",
    "name": "DHL",
    "status": "ACTIVE",
    "lifecycle": "GA",
    "deliveryType": "DELIVERY",
    "version": 11,
    "created": "2022-10-19T10:02:03.150Z",
    "lastModified": "2023-03-29T08:44:51.484Z",
    "credentials": {
        "key": "DHL_V2"
    }
    ...
}

The Facility

curl -sSL 'https://your.api.fulfillmenttools.com/api/facilities/a81a1c85-cfe5-49d3-81d3-675154ef323e' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
{
    "id": "a81a1c85-cfe5-49d3-81d3-675154ef323e",
    "name": "Darkstore Cologne",
    "address": {
        "street": "Schanzenstr.",
        "houseNumber": "8-20",
        "postalCode": "51063",
        "city": "Cologne",
        "country": "DE",
        "companyName": "fulfillmenttools",
        "resolvedCoordinates": {
            "lon": 7.013988,
            "lat": 50.964969
        },
        "resolvedTimeZone": {
            "offsetInSeconds": 3600,
            "timeZoneId": "Europe/Berlin",
            "timeZoneName": "W. Europe Standard Time"
        },
        ...
    },
    "locationType": "WAREHOUSE",
    "services": [
        {
            "type": "PICKUP"
        },
        {
            "type": "SHIP_FROM_STORE"
        }
    ],
    "status": "ONLINE",
    "created": "2022-12-20T10:00:48.419Z",
    "lastModified": "2023-03-27T14:13:51.213Z",
    "version": 6,
    ...
}

Please take note of two important parameters we are going to use in the following: The id of the facility (a81a1c85-cfe5-49d3-81d3-675154ef323e in this case) and the id of the carrier (488bd1a6-6c76-4407-8dab-ece716dac14d). We need both values in order to create a connection between those two entities.

The Connection

By using both values in our target URL the following call we configure the carrier to said facility:

curl -sSL -X POST 'https://your.api.fulfillmenttools.com/api/facilities/a81a1c85-cfe5-49d3-81d3-675154ef323e/carriers/488bd1a6-6c76-4407-8dab-ece716dac14d' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "status": "ACTIVE",
    "cutoffTime": {
        "hour": 16,
        "minute": 30
    }
}'

200 OK
{
    "version": 1,
    "name": "DHL_V2",
    "status": "ACTIVE",
    "cutoffTime": {
        "hour": 16,
        "minute": 30
    },
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "key": "DHL_V2",
    "deliveryType": "DELIVERY",
    "deliveryAreas": [],
    "facilityRef": "a81a1c85-cfe5-49d3-81d3-675154ef323e",
    "id": "a81a1c85-cfe5-49d3-81d3-675154ef323e_488bd1a6-6c76-4407-8dab-ece716dac14d",
    "created": "2023-04-13T12:57:46.254Z",
    "lastModified": "2023-04-13T12:57:46.254Z"
}

The empty array of the attribute deliveryAreas indicates, that there are no restrictions regarding delivery targets.

We also conveniently set the cutoff time to 16:30, because in our fictive case this is the time when the DHL driver typically arrives at the Darkstore to pick up the parcels.

Create a shipment with parcels to track

Before we dive into the process of sending a parcel we need to clarify two more entities: Shipment and Parcel.

Entity
Description

Parcel

A parcel is the digital representation of one physical parcel that is avised / on its way to the consumer.

Shipment

A shipment is the bracket around all parcels sent within a process using the same carrier. Please note: Certain data could vary from parcel to parcel: dimensions or targetAddress of the shipment can be overwritten in a parcel instance.

Create Shipment for pickup in a facility and by a carrier

With the following call we create a shipment to be picked up in facility with ID 4fd70a59-9efe-40fd-808b-08ae86ca558f using the DHL Carrier with ID 488bd1a6-6c76-4407-8dab-ece716dac14d:

curl -sSL -X POST 'https://your.api.fulfillmenttools.com/api/shipments' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "facilityRef":"4fd70a59-9efe-40fd-808b-08ae86ca558f",
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "orderDate":"2023-04-13T13:58:46.254Z",
    "targetAddress":{
        "firstName":"Luke",
        "lastName":"Skywalker",
        "street":"Planetenstraße",
        "houseNumber":"13",
        "postalCode":"40223",
        "city":"Düsseldorf",
        "country":"DE"
    },
    "targetTime":"2023-04-13T13:58:46.254Z"
}
'

201 Created
{
    "facilityRef": "4fd70a59-9efe-40fd-808b-08ae86ca558f",
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "orderDate": "2023-04-13T13:58:46.254Z",
    "targetAddress": {
        "firstName": "Luke",
        "lastName": "Skywalker",
        "street": "Planetenstraße",
        "houseNumber": "13",
        "postalCode": "40223",
        "city": "Düsseldorf",
        "country": "DE"
    },
    "targetTime": "2023-04-13T13:58:46.254Z",
    "id": "3e62db41-af9e-4ce1-8c44-1ef340457057",
    "hasActiveCarrier":true
    "status": "INITIAL",
    "_order": "0",
    "processId": "3af2e1a7-d104-4ef9-a43b-13890ae318cf",
    "created": "2023-04-13T13:20:27.282Z",
    "lastModified": "2023-04-13T13:20:27.282Z",
    "version": 1
}

As you can see: The shipment has knowledge about the facility, the CEP and the address where to deliver.

As mentioned above: This shipment is not connected to any existing process! If you want to create a shipment to a specific process you need to provide the attribute processId within the request. Also shipments can be created during preceding processes. In that case data like the target address is provided via the order or the pickjob to the shipment which is created by fulfillmenttools.

Having the Shipment in place we are now ready to create a parcel via this shipment by issuing the following request:

curl -sSL -X POST 'https://your.api.fulfillmenttools.com/api/shipments/3e62db41-af9e-4ce1-8c44-1ef340457057/parcels' \
  --header 'Authorization: Bearer <TOKEN>'

201 Created
{
    "loadUnitRefs": [],
    "version": 1,
    "id": "713b9cd8-6d47-45ff-a12a-ef3acb270180",
    "status": "OPEN",
    "shipmentRef": "3e62db41-af9e-4ce1-8c44-1ef340457057",
    "processRef": "3af2e1a7-d104-4ef9-a43b-13890ae318cf",
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "recipient": {
        "firstName": "Luke",
        "lastName": "Skywalker",
        "street": "Planetenstraße",
        "houseNumber": "13",
        "postalCode": "40223",
        "city": "Düsseldorf",
        "country": "DE"
    },
    "sender": {
        "street": "Carlsplatz",
        "houseNumber": "3",
        "postalCode": "40213",
        "city": "Düsseldorf",
        "country": "DE",
        "companyName": "ptdus",
        "resolvedCoordinates": {
            "lon": 6.77285093516085,
            "lat": 51.2263665950437
        },
        "emailAddresses": null,
        "additionalAddressInfo": null,
        "phoneNumbers": null,
        "resolvedTimeZone": {
            "offsetInSeconds": 3600,
            "timeZoneId": "Europe/Berlin",
            "timeZoneName": "W. Europe Standard Time"
        }
    },
    "dimensions": {
        "weight": 2000
    },
    "created": "2023-04-14T15:03:07.982Z",
    "lastModified": "2023-04-14T15:03:07.982Z"
}

Please take note that we are issuing a parcel the most simple way in which fulfillmenttools will use all necessary information from the corresponding shipment. However, you are also able to overwrite certain data from the shipment for each created parcel, such as the dimensions, the recipient, the sender or return address.

We just created the entity that represents the parcel in status OPEN. Now, in an async matter, fulfillmenttools is automatically taking care of the actual advising of the parcel label. During the time it takes fulfillmenttools and the CEPs API to negotiate and create a parcel, the status of the parcel changes from OPEN via PROCESSING to finally DONE. The shipment also transparently changes its status to CONFIRMED as soon as all created parcels of the shipment reached the status DONE.

Interpreting the result of a parcel request

Once the parcel reached one of the status DONE (happy case) or FAILED it is time to take a look at the result attribute of the parcel:

curl -sSL 'https://your.api.fulfillmenttools.com/api/parcels/713b9cd8-6d47-45ff-a12a-ef3acb270180' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
{
    "loadUnitRefs": [],
    "version": 3,
    "id": "713b9cd8-6d47-45ff-a12a-ef3acb270180",
    "status": "DONE",
    "shipmentRef": "3e62db41-af9e-4ce1-8c44-1ef340457057",
    "processRef": "3af2e1a7-d104-4ef9-a43b-13890ae318cf",
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "result": {
        "summary": "",
        "carrierTrackingNumber": "222201010030668852",
        "trackingUrl": "https://nolp.dhl.de/nextt-online-public/set_identcodes.do?lang=de&idc=222201010030668852",
        "sendLabelUrl": "https://storage.googleapis.com/ocff-greycat-git-shipment-label-bucket/713b9cd8-6d47-45ff-a12a-ef3acb270180_send.pdf",
        "labelUrl":"https://storage.googleapis.com/ocff-greycat-git-shipment-label-bucket/713b9cd8-6d47-45ff-a12a-ef3acb270180_all.pdf"
    },
    ...
}

The result in general shows details about the outcome of the request:

  • In case of a successful termination of the request towards this specific CEP API (see above) we can find the trackingNumber, a tracking URL, a label to download the sendLabel and also with the attribute labelUrl a document that consists of all the documents that are of importance to this parcel (such as for example deliveryNotes, return labels, etc.).

  • In case of a unsuccessful termination of the request the summary attribute carries information about the root cause of the failure. The contents of this error message usually originates from the carrier - fulfillmenttools has limited control about the data.

In this case we are ready to download the avised label using the following call:

curl -sSL 'https://your.api.fulfillmenttools.com/api/parcels/713b9cd8-6d47-45ff-a12a-ef3acb270180/labels/all.pdf' \
  --header 'Authorization: Bearer <TOKEN>'

200 OK
Content-Type: application/pdf
Content-Disposition: attachment; filename=all.pdf

<binary data>

Be aware that the response has the Content-Type application/pdf and contains binary data.

Requesting a special service from the carrier

If a special is required, this can be requested either when creating a parcel by passing the service object with the desired service set to true:

// curl -sSL -X POST 'https://your.api.fulfillmenttools.com/api/shipments/3e62db41-af9e-4ce1-8c44-1ef340457057/parcels' \
  --header 'Authorization: Bearer <TOKEN>'

201 Created
{
    "services": {
        "signature": true
        "bulkyGoods": true
    },
    "loadUnitRefs": [],
    "version": 1,
    "id": "713b9cd8-6d47-45ff-a12a-ef3acb270180",
    "status": "OPEN",
    "shipmentRef": "3e62db41-af9e-4ce1-8c44-1ef340457057",
    "processRef": "3af2e1a7-d104-4ef9-a43b-13890ae318cf",
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "recipient": {
        "firstName": "Luke",
        "lastName": "Skywalker",
        "street": "Planetenstraße",
        "houseNumber": "13",
        "postalCode": "40223",
        "city": "Düsseldorf",
        "country": "DE"
    },
    "sender": {
        "street": "Carlsplatz",
        "houseNumber": "3",
        "postalCode": "40213",
        "city": "Düsseldorf",
        "country": "DE",
        "companyName": "ptdus",
        "resolvedCoordinates": {
            "lon": 6.77285093516085,
            "lat": 51.2263665950437
        },
        "emailAddresses": null,
        "additionalAddressInfo": null,
        "phoneNumbers": null,
        "resolvedTimeZone": {
            "offsetInSeconds": 3600,
            "timeZoneId": "Europe/Berlin",
            "timeZoneName": "W. Europe Standard Time"
        }
    },
    "dimensions": {
        "weight": 2000
    },
    "created": "2023-04-14T15:03:07.982Z",
    "lastModified": "2023-04-14T15:03:07.982Z"
}

It is also possible to pass the information directly when creating an order. In the order the services can be directly listed for each preferredCarrierWithProducts:

curl --location --globoff '{{host}}/api/orders' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer {{authToken}}' \
--data-raw '{
    "orderDate": "2023-03-11T08:16:07.000Z",
    "deliveryPreferences": {
        "shipping": {
            "preferredCarriersWithProduct": [
                {
                    "carrierKey": "BPOST",
                    "carrierServices": [
                        "SIGNATURE"
                    ]
                }
            ]
        }
    },
    "consumer": {
        "email": "ulf.steinke@ocff.de",
        "addresses": [
            {
                "salutation": "Dhr.",
                "firstName": "Jean",
                "lastName": "Peeters",
                "street": "Breidelstraat",
                "houseNumber": "2",
                "postalCode": "8000",
                "city": "Brugge",
                "country": "BE",
                "emailAddress": "Jean.Peeters@yahoo.com",
                "additionalAddressInfo": "637148",
                "phoneNumber": "526-640-7512",
                "addressType": "POSTAL_ADDRESS"
            }
        ]
    },
    "tenantOrderId": "FC-4711-2361",
    "status": "OPEN",
    "orderLineItems": [
        {
            "article": {
                "tenantArticleId": "2020249",
                "title": "T-Shirt \"Am Sonnenhut\"",
                "imageUrl": "https://d358g9injarr4u.cloudfront.net/res/product_1000/240eadd8-8f50-479d-b0d8-74412bd4a9f9.jpg",
                "attributes": [
                    {
                        "category": "miscellaneous",
                        "key": "BRAND",
                        "value": "Adidas"
                    },
                    {
                        "category": "descriptive",
                        "priority": 100,
                        "key": "%%subtitle%%",
                        "value": "Neu!"
                    },
                    {
                        "category": "descriptive",
                        "priority": 200,
                        "key": "Mitgliederpreis",
                        "value": "17,96 EUR"
                    },
                    {
                        "category": "descriptive",
                        "priority": 300,
                        "key": "Schnitt",
                        "value": "Frauen"
                    },
                    {
                        "category": "descriptive",
                        "priority": 400,
                        "key": "Material",
                        "value": "100% Baumwolle"
                    },
                    {
                        "category": "descriptive",
                        "priority": 500,
                        "key": "Artikelnummer",
                        "value": "2020249"
                    },
                    {
                        "category": "descriptive",
                        "priority": 600,
                        "key": "Größe",
                        "value": "S"
                    },
                    {
                        "category": "descriptive",
                        "priority": 700,
                        "key": "Beschreibung",
                        "value": "Rotes T-Shirt mit weißen Streifen an den Ärmeln, Blockdruck mit Schriftzug auf der Brust"
                    }
                ]
            },
            "quantity": 1,
            "scannableCodes": [
                "2020249"
            ]
        },
        {
            "article": {
                "tenantArticleId": "2010681",
                "title": "Steppjacke \"Mühlenbach\"",
                "imageUrl": "https://d358g9injarr4u.cloudfront.net/res/product_1000/9fcb7e42-7c84-4ab0-999a-869efe077e0a.jpg",
                "attributes": [
                    {
                        "category": "descriptive",
                        "priority": 100,
                        "key": "%%subtitle%%",
                        "value": "Neu!"
                    },
                    {
                        "category": "descriptive",
                        "priority": 200,
                        "key": "Größe",
                        "value": "L"
                    },
                    {
                        "category": "descriptive",
                        "priority": 300,
                        "key": "Oberstoff",
                        "value": "100% Polyester"
                    },
                    {
                        "category": "descriptive",
                        "priority": 400,
                        "key": "Futter",
                        "value": "100% Polyester"
                    },
                    {
                        "category": "descriptive",
                        "priority": 500,
                        "key": "Füllung",
                        "value": "100% Polyester"
                    },
                    {
                        "category": "descriptive",
                        "priority": 600,
                        "key": "Beschreibung",
                        "value": "Dreifarbige Steppjacke mit verstaubarer Kapuze, Zwei Eingriffstaschen, Gesticktes Logo auf der Brust"
                    },
                    {
                        "category": "descriptive",
                        "priority": 700,
                        "key": "Artikelnummer",
                        "value": "2010681"
                    }
                ]
            },
            "quantity": 1,
            "scannableCodes": [
                "2010681"
            ]
        },
        {
            "article": {
                "tenantArticleId": "5020064",
                "title": "Wandtattoo Stadion",
                "imageUrl": "https://d358g9injarr4u.cloudfront.net/res/product_1000/343f4569-66bb-4b0c-aa2b-20011a51b620.jpg",
                "attributes": [
                    {
                        "category": "descriptive",
                        "priority": 100,
                        "key": "Maße",
                        "value": "70 x 50 cm"
                    },
                    {
                        "category": "descriptive",
                        "priority": 200,
                        "key": "Beschreibung",
                        "value": "Wandtattoo in Ziegelwand-Optik, Mit tollem Blick aufs Stadion"
                    },
                    {
                        "category": "descriptive",
                        "priority": 300,
                        "key": "Anwendung",
                        "value": "Für die Beklebung sollte die Fläche staub- und fetfrei sein. Bringen Sie den Aufkleber in Position und reiben Sie diese gleichmäßig mit der flachen Hand an den Untergrund, um sie zu fixieren. Jede Stelle nochmals gest andrücken. Fertig! Für auftretende Schäden nach der Verklebung auf dem Untergrund etc. ist eine Haftung ausgeschlossen."
                    },
                    {
                        "category": "descriptive",
                        "priority": 400,
                        "key": "Artikelnummer",
                        "value": "5020064"
                    }
                ]
            },
            "quantity": 2,
            "scannableCodes": [
                "5020064"
            ]
        }
    ],
    "paymentInfo": {
        "currency": "EUR"
    }
}'

Only services offered by the chosen carrier will be taken when creating a parcel. Providing a service for a carrier which does not offer that service will be ignored.

Setting Carrier URLs

Whether you want to operate against sandbox URLs or against real URLs provided by CEPs can be configured on different levels.

You can set carrier specific URLs tenant-wide, so they are being used in every facility or you can decide to set URLs for specific facilities separately. In order to achieve this, set the URLs as shown in the following by setting the carrier configuration and/or the facility carrier configuration.

Carrier Level URLs

Setting the carrier URLs on carrier level will result in these URLs being used whenever this carrier is used in a facility. Use the following endpoint to set the URL.

The following example demonstrates how to set the service url and track and trace url for a DHL carrier.

curl -sSL -X PUT 'https://your.api.fulfillmenttools.com/api/carriers/[DHL-CARRIER-ID]/configuration' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "carrierRef": "488bd1a6-6c76-4407-8dab-ece716dac14d",
    "returnLabel": true,
    "version": 1,
    "serviceUrl": "https://api-sandbox.dhl.com/parcel/de/shipping",
    "trackAndTraceUrl": "https://api-eu.dhl.com/track/shipments"
}
'

Facility Carrier Level URLs

Setting the carrier URLs on facility level will overwrite any URL that has been set on carrier level for the respective carrier. The URLs on facility carrier level can be set by updating the configuration in the facility carrier connection. The following endpoint can be used for this purpose.

This example shows how to set the urls for a GLS carrier.

curl -sSL -X PUT 'https://your.api.fulfillmenttools.com/api/facilities/[FACILITY-ID]/carriers/[CARRIER-REF]' \
--header 'Authorization: Bearer <TOKEN>' \
--header 'Content-Type: application/json' \
--data-raw '{
    "status": "ACTIVE",
    "name": "GLS",
    "version": 1,
    configuration: {
        "key": "GLS",
        "serviceUrl": "https://shipit-wbm-test01.gls-group.eu:443/backend/rs/shipments",
        "trackAndTraceUrl": "https://gls-group.eu/GROUP/en/parcel-tracking?match=",
        "trackAndTraceWsdlUrl": "http://www.gls-group.eu/276-I-PORTAL-WEBSERVICE/services/Tracking/wsdl/Tracking.wsdl"
    }
}
'

Courier, Express and Parcel Services (or in Short: CEP) refer to entities, that are in general configured in fulfillmenttools. It depends on your setup which CEP Providers are available & ready to use. The API description including some documentation about the used attributes can be found

As you can see in the above response there are some configurations made to this exact carrier (DHL in this case). These configurations can be done on every carrier instance (check for details or continue reading.

This value depicts, no surprise here, the default value (1000 gram) to a parcel advised using this carrier. However, the actual weight might be overwritten by the actual call for the creation of a parcel (see in our API Specification).

Please refer to and in our Swagger Documentation to understand which kind of configuration is necessary / advised.

This resource describes the stores, warehouses, popup stores, locations, etc. of the fulfillment network. In general, a facility is a place where fulfillment processes take place or should be considered. Details see use case

Users can assign different carriers to one facility. With this information a can be implemented where orders which need to be shipped by a chosen carrier are routed to a facility where this carrier is active. Carrier that are enabled on tenant level must also be enabled for the facilities in which this carrier is available.

The Facility-To-Carrier-Connection is (some people already understood) the connection between a and a . Many configurations that allow for frictionless carrier services have to be configured here. Please refer to for detailed information on every attribute. Here are some of the attributes worth mentioning:

Let's assume that we have a facility (see ) and a carrier (see ) already created. Lets receive the correspondent entities first (omitting some of the attributes):

That's it: As long as the Carrier and the FacilityCarrierConnection stays in status "ACTIVE", it should be possible to create shipments and in the end also parcels using DHL as a CEP (see ) originating from this facility.

Let's assume we already connected a Facility with a Carrier using a FacilityCarrierConnection (see ). In this use case we are going to create a standalone shipment and two parcels - without having a Pickjob or any other leading entity. This is a perfect example on how flexible fulfillmenttools is: There might be standard processes, but you are also able to use parts of the system to suit your operational needs - like for example the need of dynamically create a Shipment Label for further use in other systems.

in our API reference
Add Carrier
Get Carrier Configuration from API
Change Configuration via API
Add and Manage Facilities
fencing
FacilityCarrierConnection
facility
carrier
Add and Manage Facilities
Creation of a carrier
Create a shipment with parcels to track
Connect an existing carrier to a facility
Add Parcel
https://docs.fulfillmenttools.com/documentation
Drawing
Drawing
Drawing
Drawing
  • Carrier
  • Creation of a carrier
  • Carrier specific configuration
  • Facility
  • Connection between a Facility and a Carrier
  • Connect an existing carrier to a facility
  • Create a shipment with parcels to track
  • Setting Carrier URLs
  • PUTUpdate a carrier configuration with the given ID
  • PUTConnect a configured carrier to the facility with given ID

Update a carrier configuration with the given ID

put
Authorizations
Path parameters
carrierIdstringRequired

ID of the carrier you want to update the configuration

Body
any ofOptional
or
or
or
or
or
Responses
200
Carrier Configuration was found & you were allowed to access it. The result is in the body.
application/json
Responseany of
or
or
or
or
or
401
Your user is not allowed to operate against this API instance
application/json
403
Your user, although recognized, is not authorized to use this endpoint
application/json
404
Carrier Configuration not found
application/json
put
PUT / HTTP/1.1
Host: %%HOST%%
Content-Type: application/json
Accept: */*
Content-Length: 987

{
  "id": "text",
  "carrierRef": "text",
  "returnLabel": false,
  "additionalWeightInPercent": 1,
  "mustBeWeighed": false,
  "fallBackTrackAndTraceEmail": "max@speedyboxales.com",
  "countryServiceMappings": [
    {
      "id": "bc5b581a-8f65-45b0-9f81-6e0d4babbcb2",
      "source": {
        "countryCode": "DE",
        "postalCodes": [
          "text"
        ]
      },
      "destinations": [
        {
          "countryCode": "DE",
          "postalCodes": [
            "text"
          ]
        }
      ],
      "mandatoryShippingAttributes": [
        {
          "referencedField": "dimensions.weight",
          "dataType": "Number",
          "description": "text",
          "descriptionLocalized": {
            "de_DE": "Wert",
            "en_US": "Value",
            "ru_RU": "значение"
          }
        }
      ],
      "mandatoryShippingItemAttributes": [
        {
          "referencedField": "description",
          "dataType": "Number",
          "description": "text",
          "descriptionLocalized": {
            "de_DE": "Wert",
            "en_US": "Value",
            "ru_RU": "значение"
          }
        }
      ],
      "product": "EXPRESS",
      "carrierProductCategory": "STANDARD",
      "transitTime": {
        "minTransitDays": 1,
        "maxTransitDays": 3
      },
      "deliveryCosts": [
        {
          "cost": 10.99,
          "currency": "EUR"
        }
      ]
    }
  ],
  "created": "2020-02-03T08:45:51.525Z",
  "lastModified": "2020-02-03T09:45:51.525Z",
  "version": 42
}
{
  "id": "text",
  "carrierRef": "text",
  "returnLabel": false,
  "additionalWeightInPercent": 1,
  "mustBeWeighed": false,
  "fallBackTrackAndTraceEmail": "max@speedyboxales.com",
  "countryServiceMappings": [
    {
      "id": "bc5b581a-8f65-45b0-9f81-6e0d4babbcb2",
      "source": {
        "countryCode": "DE",
        "postalCodes": [
          "text"
        ]
      },
      "destinations": [
        {
          "countryCode": "DE",
          "postalCodes": [
            "text"
          ]
        }
      ],
      "mandatoryShippingAttributes": [
        {
          "referencedField": "dimensions.weight",
          "dataType": "Number",
          "description": "text",
          "descriptionLocalized": {
            "de_DE": "Wert",
            "en_US": "Value",
            "ru_RU": "значение"
          }
        }
      ],
      "mandatoryShippingItemAttributes": [
        {
          "referencedField": "description",
          "dataType": "Number",
          "description": "text",
          "descriptionLocalized": {
            "de_DE": "Wert",
            "en_US": "Value",
            "ru_RU": "значение"
          }
        }
      ],
      "product": "EXPRESS",
      "carrierProductCategory": "STANDARD",
      "transitTime": {
        "minTransitDays": 1,
        "maxTransitDays": 3
      },
      "deliveryCosts": [
        {
          "cost": 10.99,
          "currency": "EUR"
        }
      ]
    }
  ],
  "created": "2020-02-03T08:45:51.525Z",
  "lastModified": "2020-02-03T09:45:51.525Z",
  "version": 42
}

Connect a configured carrier to the facility with given ID

put
Authorizations
Path parameters
facilityIdstringRequired

ID of facility you want to get

carrierRefstringRequired

The referenced carrier ID

Query parameters
localestringOptional

Provide the localized names and descriptions for the parcel label classifications. If not provided the default locale is used., for example de_DE.

Body
credentialsany ofOptional

Facility specific credentials for this carrier

all ofOptional
and
or
all ofOptional
or
all ofOptional
or
all ofOptional
configurationany ofOptional

Facility specific configuration for this carrier

all ofOptional
or
all ofOptional
or
all ofOptional
or
all ofOptional
or
or
namestringOptional

This is the well known name for a supported CEP partner. Can be adapted to the clients needs.

Example: DHL Köln
statusstring · enumOptional

It is taken into consideration for all carriers. Default: INACTIVE

Possible values:
versionnumberRequired
Responses
200
Modification was successful.
application/json
401
Your user is not allowed to operate against this API instance
application/json
403
Your user, although recognized, is not authorized to use this endpoint
application/json
404
There is no connection to a carrier with this facility referenced by the provided facilityCarrierConnectionId.
application/json
put
PUT / HTTP/1.1
Host: %%HOST%%
Content-Type: application/json
Accept: */*
Content-Length: 675

{
  "credentials": {
    "key": "text",
    "billingNumber": 22222222220101,
    "retoureBillingNumber": 22222222220701,
    "internationalBillingNumber": 22222222220701,
    "dhlBusinessPassword": "text",
    "dhlBusinessUsername": "text",
    "dhlBusinessUsergroup": "text"
  },
  "configuration": {
    "key": "text",
    "contactId": "text",
    "returnContactId": "text"
  },
  "cutoffTime": {
    "hour": 16,
    "minute": 30
  },
  "deliveryAreas": [
    {
      "country": "DE",
      "postalCode": "40764"
    }
  ],
  "name": "DHL Köln",
  "status": "ACTIVE",
  "parcelLabelClassifications": [
    {
      "nameLocalized": {
        "de_DE": "S-Paket",
        "en_US": "S-Parcel",
        "ru_RU": "S-пакет"
      },
      "dimensions": {
        "height": 50,
        "length": 100,
        "weight": 1700,
        "width": 25
      }
    }
  ],
  "tags": [],
  "version": 1,
  "validDeliveryTargets": [
    "SHIP_TO_STORE"
  ]
}
{
  "carrierRef": "text",
  "deliveryType": "SAMEDAY",
  "key": "text",
  "configuration": {
    "key": "text",
    "contactId": "text",
    "returnContactId": "text"
  },
  "credentials": {
    "key": "text",
    "billingNumber": 22222222220101,
    "retoureBillingNumber": 22222222220701,
    "internationalBillingNumber": 22222222220701,
    "dhlBusinessPassword": "text",
    "dhlBusinessUsername": "text",
    "dhlBusinessUsergroup": "text"
  },
  "cutoffTime": {
    "hour": 16,
    "minute": 30
  },
  "deliveryAreas": [
    {
      "country": "DE",
      "postalCode": "40764"
    }
  ],
  "name": "DHL Köln",
  "status": "ACTIVE",
  "parcelLabelClassifications": [
    {
      "name": "S-Parcel",
      "nameLocalized": {
        "de_DE": "S-Paket",
        "en_US": "S-Parcel",
        "ru_RU": "S-пакет"
      },
      "dimensions": {
        "height": 50,
        "length": 100,
        "weight": 1700,
        "width": 25
      }
    }
  ],
  "tags": [],
  "validDeliveryTargets": [
    "SHIP_TO_STORE"
  ],
  "created": "2020-02-03T08:45:51.525Z",
  "lastModified": "2020-02-03T09:45:51.525Z",
  "version": 42
}