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
  • Adding the stores
  • Adding the warehouses
  • Disclaimer

Was this helpful?

  1. Connecting to fulfillmenttools
  2. Integration Tutorial

Adding facilities

After receiving the login data for our tenant, we will start with creating facilities (locations) from where orders are fulfilled. This part of the tutorial shows you how.

PreviousIntegration TutorialNextAdding listings to facilities

Last updated 5 months ago

Was this helpful?

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

Adding the stores

After we set up our environment as mentioned above, we are ready for creating our facilities using the API. For a more detailed explanation on the topic, see Add and manage facilities. Let's add the first facility, the flagship store in Frankfurt, Germany.

We use the for adding facilities:

curl --location 'https://your.api.fulfillmenttools.com/api/facilities' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <TOKEN>' \
--data-raw '{
    "name": "LU.XY Fashion flagship store",
    "address": {
        "companyName": "lu.xy fashion GmbH",
        "country": "DE",
        "postalCode": "60316",
        "city": "Frankfurt",
        "street": "Sandweg",
        "houseNumber": "61",
        "phoneNumbers": [
            {
                "value": "+49 69 580775",
                "type": "PHONE",
                "label": "Landline"
            }
        ],
        "emailAddresses": [
            {
                "value": "lu.xy.flagship.FRA1@example.com",
                "recipient": "LU.XY Frankfurt 1"
            }
        ]
    },
    "locationType": "STORE",
    "tenantFacilityId": "1",
    "status": "ONLINE",
    "services": [
        {
            "type": "SHIP_FROM_STORE"
        },
        {
            "type": "PICKUP"
        }
    ],
    "pickingTimes": {
        "monday": [{
            "start": { "hour": 8, "minute": 0},
            "end": { "hour": 17, "minute": 0 },
            "capacity":20
        }],
        "tuesday": [{
            "start": { "hour": 8, "minute": 0 },
            "end": { "hour": 17, "minute": 0 },
            "capacity":20
        }],
        "wednesday": [{
            "start": { "hour": 8, "minute": 0 },
            "end": { "hour": 17, "minute": 0 },
            "capacity":20
        }],
        "thursday": [{
            "start": { "hour": 8, "minute": 0 },
            "end": { "hour": 17, "minute": 0 },
            "capacity":20
        }],
        "friday": [{
            "start": { "hour": 8, "minute": 0 },
            "end": { "hour": 17, "minute": 0 },
            "capacity":15
        }],
        "saturday": [{
            "start": { "hour": 8, "minute": 0 },
            "end": { "hour": 17, "minute": 0 },
            "capacity":10
        }]
    }
}'

Prior to looking at the response, let’s dive deeper into the properties:

name: That is the name you use for that facility, might be an internal name like "Frankfurt flagship store"

address: Where the facility is located.

locationType: Type of the location, could be either STORE, EXTERNAL or WAREHOUSE. Warehouses do not offer Click&Collect services.

tenantFacilityId: ID of that facility in your systems, optional but must be unique.

status: Status of the facility after creation: ONLINE facilities are ready to fulfill new orders. SUSPENDED facilities can fulfill the current workload but don't accept new orders. OFFLINE facilites can't fulfill new or current orders.

services: The services this facility is offering (e.g. PICKUP or SHIP_FROM_STORE). Warehouses usually don't allow the customer to pick up the goods.

pickingTimes: The times when the employees can pick incoming orders. They can differ from the opening hours. For each picking time a certain capacity can be defined, which defines the amount of orders that can be processed within this timeframe.

The platform should respond with a 201 CREATED response, indicating everything worked well and containing the facility in it's payload:

{
    "name": "LU.XY Fashion flagship store",
    "address": {
        "companyName": "lu.xy fashion GmbH",
        "country": "DE",
        "postalCode": "60316",
        "city": "Frankfurt",
        "street": "Sandweg",
        "houseNumber": "61",
        "phoneNumbers": [
            {
                "value": "+49 69 580775",
                "type": "PHONE",
                "label": "Landline"
            }
        ],
        "emailAddresses": [
            {
                "value": "lu.xy.flagship.FRA1@example.com",
                "recipient": "LU.XY Frankfurt 1"
            }
        ]
    },
    "locationType": "STORE",
    "tenantFacilityId": "1",
    "status": "ONLINE",
    "services": [
        {
            "type": "SHIP_FROM_STORE"
        },
        {
            "type": "PICKUP"
        }
    ],
    "pickingTimes": {
        "monday": [
            {
                "start": {
                    "hour": 8,
                    "minute": 0
                },
                "end": {
                    "hour": 17,
                    "minute": 0
                },
                "capacity": 20
            }
        ],
        "tuesday": [
            {
                "start": {
                    "hour": 8,
                    "minute": 0
                },
                "end": {
                    "hour": 17,
                    "minute": 0
                },
                "capacity": 20
            }
        ],
        "wednesday": [
            {
                "start": {
                    "hour": 8,
                    "minute": 0
                },
                "end": {
                    "hour": 17,
                    "minute": 0
                },
                "capacity": 20
            }
        ],
        "thursday": [
            {
                "start": {
                    "hour": 8,
                    "minute": 0
                },
                "end": {
                    "hour": 17,
                    "minute": 0
                },
                "capacity": 20
            }
        ],
        "friday": [
            {
                "start": {
                    "hour": 8,
                    "minute": 0
                },
                "end": {
                    "hour": 17,
                    "minute": 0
                },
                "capacity": 15
            }
        ],
        "saturday": [
            {
                "start": {
                    "hour": 8,
                    "minute": 0
                },
                "end": {
                    "hour": 17,
                    "minute": 0
                },
                "capacity": 10
            }
        ]
    },
    "fulfillmentProcessBuffer": 240,
    "capacityEnabled": false,
    "created": "2023-11-14T15:26:43.165Z",
    "lastModified": "2023-11-14T15:26:43.165Z",
    "version": 1,
    "id": "d286e108-698b-4f6c-97b7-21f090f17e46"
}

In the response you might have noticed the following properties which were not part of the creation request:

id: The ID the facility has in the fulfillmenttools platform.

version: The version the entity has in the database. This is important for locking mechanisms, usually it's version 1 when creating the facility.

fulfillmentProcessBuffer: Duration in minutes until an order is fully processed.

capacityEnabled: Indicates that configured capacity limits for picking times are considered.

created: Indicates the date and time the facility was created in the fulfillmenttools platform.

lastModified: indicates the date and time the facility was last modified.

Now that we have created the first facility, we can create the other facilities. To avoid an unneccesary long page, the other calls won't be logged on here. In our case, every store has the same picking times each day, except that German, Swiss and Austrian stores won't pick on Sundays.

Adding the warehouses

After we added the stores, we now want to add the warehouses as well. While the endpoint stays the same, the payload differs. Let's make the first call together. Warehouses are picking from 5 AM to 12 AM, monday to saturday in all countries. They also have higher capacities - even though we do not use them, yet. Currently, our platform does not support picking times until 12 AM, so 11.59PM is what we set.

curl --location 'https://ocff-cyanicsloth-git.api.fulfillmenttools.com/api/facilities' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <TOKEN>' \
--data-raw '{
    "name": "LU.XY Warehouse Frankfurt",
    "address": {
        "companyName": "lu.xy logistics GmbH",
        "country": "DE",
        "postalCode": "63303",
        "city": "Dreieich",
        "street": "Landsteinerstraße",
        "houseNumber": "5",
        "phoneNumbers": [
            {
                "value": "+49 69 96358078",
                "type": "PHONE",
                "label": "Landline"
            }
        ],
        "emailAddresses": [
            {
                "value": "lu.xy.warehouse.FRA@example.com",
                "recipient": "LU.XY Warehouse FRA"
            }
        ]
    },
    "locationType": "WAREHOUSE",
    "tenantFacilityId": "21",
    "status": "ONLINE",
    "services": [
        {
            "type": "SHIP_FROM_STORE"
        }
    ],
    "pickingTimes": {
        "monday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "tuesday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "wednesday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "thursday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "friday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "saturday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ]
    }
}'

The platform should now respond with a 201 CREATED response:

{
    "name": "LU.XY Warehouse Frankfurt",
    "address": {
        "companyName": "lu.xy logistics GmbH",
        "country": "DE",
        "postalCode": "63303",
        "city": "Dreieich",
        "street": "Landsteinerstraße",
        "houseNumber": "5",
        "phoneNumbers": [
            {
                "value": "+49 69 96358078",
                "type": "PHONE",
                "label": "Landline"
            }
        ],
        "emailAddresses": [
            {
                "value": "lu.xy.warehouse.FRA@example.com",
                "recipient": "LU.XY Warehouse FRA"
            }
        ]
    },
    "locationType": "WAREHOUSE",
    "tenantFacilityId": "21",
    "status": "ONLINE",
    "services": [
        {
            "type": "SHIP_FROM_STORE"
        }
    ],
    "pickingTimes": {
        "monday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "tuesday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "wednesday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "thursday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "friday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ],
        "saturday": [
            {
                "start": {
                    "hour": 5,
                    "minute": 0
                },
                "end": {
                    "hour": 23,
                    "minute": 59
                },
                "capacity": 100
            }
        ]
    },
    "fulfillmentProcessBuffer": 240,
    "capacityEnabled": false,
    "created": "2023-11-15T12:54:24.084Z",
    "lastModified": "2023-11-15T12:54:24.084Z",
    "version": 1,
    "id": "946f17d0-2d14-48f0-a912-d358f2c70e8f"
}

Now the facilites are set for us. In a further stage it is imaginable to periodically check with an ERP system whether there are new facilities which should be created in the platform as well or reacting to an event from the ERP on the integration layer. But for now, we are good.

Disclaimer

The addresses were randomly picked by looking up the city on Google Maps and zooming into a random place in that city. If one of the addresses is offending you in any way, please let us know and we will change it immediately.

https://docs.fulfillmenttools.com/documentation
POST facility endpoint