Pelican Picking FAQ
Partner Picking FAQ
Catalog API FAQ
Promotion API FAQ
Catalog SFTP FAQ
Promotion SFTP FAQ

Picking through Pelican device#

Frequently Asked Questions about Picking through Pelican device

How do I generate credentials to use Partner API/Orders?#

Please see the token management section here

How many tokens can I generate?#

There are no limitation of the amount of tokens. However they have an expiry time, each token can be used for 2 hours.

If an existing chain wants to onboard new outlets or scale, what is the process to integration?#

To scale the integration at chain level, following things are to be considered from your side

  • Verify access to your new stores in Partner Portal and review webhook configurations

  • (Optional) If you have any internal mapping for your store, it is possible for you to configure directly from the Shop Integrations plug-in. Use the new configured store-id or vendor id in your API requests.

Can I generate API tokens myself?#

Yes, you can generate tokens on your own. You just need to have client ID and client Secret , which you can get from your Account Manager.

How do I find my Foodpanda Vendor/store ID?#

You can get it directly Partner Portal>Shop Integrations>Settings>Vendor Identifier section or check with your Account manager.

What If I already have internal storeID and I don’t want to use Platform storeID?#

You can configure your internal storeID in Partner Portal>Shop Integrations>Settings>Vendor Identifier section. Please note to use the newly mapped storeID in your API requests.

How to configure webhook and secret?#

To secure your webhook communication between DH and Partner– a secret can be utilised for the purpose, it can be any string or its possible to have basic authentication mechanism. Secret is mandatory field in enabling the integrations.

Example of Basic authentication:

If your webhook service uses "partner" as the username and randompassword as the password, then the value in Base64 encoding of partner: randompassword, is cmFuZG9tcGFzc3dvcmQ=

Basic cmFuZG9tcGFzc3dvcmQ= needs to be added to the secret field in the Partner Portal to enable the integrtaions.

Which order statuses are sent to the webhook for Pelican Picking Integrations ?#

For Pelican Picking Integrations, the following order statuses are sent to the webhook:

  • READY_FOR_PICKUP: This status indicates that order picking and packing has been completed and the order is ready for pickup by a delivery rider.

  • CANCELLED: An order is marked as CANCELLED if it is canceled by the customer, delivery rider, or by you.

  • DELIVERED(optional): This status will be sent after the READY_FOR_PICKUP status. Since this status comes from the logistics flow, you can expect a delay of approximately 30 minutes. Please confirm with your Account Manager that the DELIVERED status is enabled in your market.

How do I get the best out of the Pelican picking integration using my webhook?#

  • READY_FOR_PICKUP and CANCELLED order statuses to be consumed by your webhook

  • Configurations: To secure your webhook configurations in Partner Portal, secrets can be utilised for the purpose it can be any string, we also accommodate basic authentication mechanism.

    • For example, if the webhook service uses partner as the username and randompassword as the password, then the value in Base64 encoding of partner: *randompassword, is cmFuZG9tcGFzc3dvcmQ=

    • Then the Authorization header field will appear as: Basic cmFuZG9tcGFzc3dvcmQ= (this needs to be added to the secret field in the Partner Portal)

Securing your webhook using secret is mandatory

What are the limitations of the Partner API/Orders (Pelican)?#

  • New orders created by customers on the Platform App are not forwarded to the webhook directly, only orders fulfilled and checkout by pickers are transmitted to the webhook with READY_FOR_PICKUP status

  • You can expect to receive only READY_FOR_PICKUP DELIVERED(optional) and CANCELLED as order status

What are the fields in the order payload and how can I use them?#

sample order payload

{
"order_id": "85649d5b-fc07-4c96-8ddb-91e03525ae35",
"external_order_id": "lt8g-2543-em09",
"order_code": "5724",
"client": {
"id": "5ffb4f4d-32a3-45a6-a0ee-34bc76a3ccfd",
"chain_id": "702953eb-c22a-43a3-b65b-86fea6ab8243",
"name": "xxx",
"country_code": "tw",
"store_id": "lt8g",
"external_partner_config_id": "254900"
},
"customer": {
"_id": "i2obq4lo",
"national_id": "",
"tax_id": "",
"first_name": "***",
"last_name": "***",
"phone_number": "+88696****752",
"delivery_address": {
"country": "",
"city": "",
"street": "",
"number": "",
"latitude": 0,
"longitude": 0,
"company": "",
"block": "",
"building": "",
"apartment": "",
"entrance": "",
"intercom": "",
"floor": "",
"suburb": "",
"zipcode": "",
"instructions": "",
"formattedAddress": ""
},
"invoicing_information": {
"carrier_type": "business",
"carrier_value": "88370484"
}
},
"comment": "",
"items": [
{
"_id": "23026c2d-16de-4cf4-96bc-e21af4efd53f",
"sku": "4710088823342",
"barcode": [
"04710088823342"
],
"name": "xx| 1858 ml",
"pricing": {
"pricing_type": "UNIT",
"unit_price": 0,
"vat_percent": 0,
"total_price": 0,
"quantity": 0,
"min_quantity": 0,
"max_quantity": 1
},
"original_pricing": {
"pricing_type": "UNIT",
"unit_price": 68,
"vat_percent": 0,
"total_price": 68,
"quantity": 1,
"min_quantity": 0,
"max_quantity": 1,
"list_price": 68
},
"container_deposit": 0,
"discount": 0,
"instructions": "",
"status": "NOT_FOUND",
"image_url": "https://images.deliveryhero.io/image/nv/Taiwan/cp3jx-4710088823342.jpg",
"promotion": [],
"replacement_preferences": {
"reconciliation_option": "PICKER_REPLACE",
"products": []
}
},
{
"_id": "5c6976d3-6e49-4515-88cc-0e12ff9b9a7a",
"sku": "4710784965544",
"barcode": [
"04710784965544"
],
"name": "xxx | 500 g",
"pricing": {
"pricing_type": "UNIT",
"unit_price": 89,
"vat_percent": 0,
"total_price": 267,
"quantity": 3,
"min_quantity": 0,
"max_quantity": 3
},
"original_pricing": {
"pricing_type": "UNIT",
"unit_price": 89,
"vat_percent": 0,
"total_price": 267,
"quantity": 3,
"min_quantity": 0,
"max_quantity": 3,
"list_price": 89
},
"container_deposit": 0,
"discount": 0,
"instructions": "",
"status": "IN_CART",
"image_url": "https://images.deliveryhero.io/image/nv/Taiwan/cp3jx-4710784965544.jpg",
"promotion": [],
"replacement_preferences": {
"reconciliation_option": "PICKER_REPLACE",
"products": []
}
}
],
"order_type": "",
"transport_type": "LOGISTICS_DELIVERY",
"payment": {
"sub_total": 267,
"order_total": 217,
"delivery_fee": 0,
"service_fee": 0,
"difference_to_minimum": 0,
"discounts": [
{
"name": "Delivery Fee Discount",
"value": -55
}
],
"discount": -55,
"container_charge": 5,
"total_taxes": 16,
"type": "PAID"
},
"cancellation": {
"reason": "",
"cancelled_by": ""
},
"status": "READY_FOR_PICKUP",
"sys": {
"created_at": "2025-10-20T23:58:44.204Z",
"created_by": "Order Fulfilment",
"updated_at": "2025-10-21T00:54:01.478Z",
"updated_by": "Order Fulfilment",
"webhook_status": ""
},
"promised_for": "2025-10-21T01:01:54.000Z",
"isPreorder": false,
"promotion_status": "AVAILABLE"
}

Should I validate the client details provided in the order payload?#

Depending on how you intend to route orders to a specific store, you can use the following field information to accurately identify and validate the store. store_idxxxx, – Identifier of the store on Platform systems 

external_partner_config_idxxxx– if the Partner store/outlet has any internal identifier it must be mapped to this field.

What is the difference between 'order_id', 'external_order_id' and 'order_code' and which one shall the Partner use for reconciliation purposes?#

order_id7384a9e4-c4e1-4820-873e-2cc637acec78– Unique identifier for order used in our backend services. If you want to query a single order using the GET endpoint you should use order_id

external_order_idmxuv-2439-9sa5– platform order id, shown on Pelican device, external_order_id could be used in your reconciliation process

order_code: its an incremental value(resets after 9999) on orders used by riders for picking orders from store

What is the difference between 'sub_total' and 'order_total' ? Which is the final order total Partner should consider?#

  • sub_total:Refers to the total value of the order items, including item-level taxes but excluding any order-level discounts (such as coupon codes or discounts applied at the overall order level). You should use sub_total when you want to validate the cumulative value of all items in the order

  • order_total: This is the final amount paid by the customer for the order. It includes all item prices, delivery fees, and discounts(such as coupon codes or discounts applied at the overall order level)

What if the item has weight-based pricing?#

When an item has weight-based pricing, pricing_type will be "KG" at item level in the order payload. For such items, the quantity field will always have a default value of 1, and a weight field will be present with a decimal value to indicate the item's weight.

How do I access the shop Integrations Plugin?#

  • All current Shops partners of any size can access the Shops Integrations plugin in Partner Portal, you will be given access by your account manager or during registration with us.

  • It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e. webhook configurations

  • Please reach out to your account manager if you do not know how to gain access to Partner Portal

How to identify the items with finite quantity and items with KG / weighted quantities in order payload?#

  • Each item in the order has pricing and original_pricing objects, & both objects have quantity field

  • pricing object contain picked quantity (adjusted by the picker) refer to the field Items.pricing.quantity

  • original_pricing object contains ordered quantity by the customer, refer to the field Items.original_pricing.quantity

  • For items with finite quantity, pricing_type will be UNIT, sharing both pricing and original_pricing objects. The pricing object contains the picked quantity by the picker. Items.pricing.quantity

{
"pricing": {
"pricing_type": "UNIT",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 0.69,
"quantity": 1,
"min_quantity": 0,
"max_quantity": 2
},
"original_pricing": {
"pricing_type": "UNIT",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 1.38,
"quantity": 2,
"min_quantity": 0,
"max_quantity": 2
},
}

For items with weightpricing_type will be KG, sharing both pricing and original_pricing objects. The pricing object contains the actual picked/fulfilled weight(decimal value) by the picker i.e Items.pricing.weight. We also share quantity for weighted items however this will be default value 1 (can be ignored if you find it not useful)

{
"pricing": {
"pricing_type": "KG",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 0.69,
"quantity": 1,
"weight": 1.0,
"min_quantity": 0,
"max_quantity": 2
},
"original_pricing": {
"pricing_type": "KG",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 0.69,
"quantity": 1,
"weight": 1.0,
"min_quantity": 0,
"max_quantity": 2
}
}

How can I tell if an order was actually picked up after being cancelled? I need to know whether it should be treated as a final sale.#

Request to Account Manager to enable the post_pick_up field. This is an addition to the existing cancellation object specific to the usecase for order cancellation after rider pickup. For all other cancelations scenarios– NO CHANGE, post_pick_up field is not visible.

Scenario: order cancelation after rider pickup:
"cancellation": {
"reason": "TECHNICAL_PROBLEM",
"cancelled_by": "CUSTOMER",
"post_picked_up": true
},
..
For other cancelation scenarios:
"cancellation": {
"reason": "TECHNICAL_PROBLEM",
"cancelled_by": "CUSTOMER",
},
..

How do I validate order cancellation? Should I use the same webhook or a different endpoint?#

Cancellation can occur from customer, vendor and logistics. When the cancellation event occurs during the life cycle of order. CANCELLED status will be sent to the same webhook configured in the Partner Portal

What happens if my webhook service is not reachable does pelican picking integration support retries to our webhook?#

We support retry mechanisms in cases where your webhook service does not respond within 10 seconds. The system will attempt up to 5 retries, each spaced 10 seconds apart. It is important that you implement appropriate handling on your end to manage potential duplicate order payloads, so that repeated webhook deliveries don't result in processing the same order multiple times

What is Promotion information at item level?#

You can track promotions applied to individual items in the order. promotion information is sent to the partners in items object of order payload.

  • Campaign/promotion name

  • Promotion Type

    • Strikethrough

    • Same item bundle

  • Discount sponsor (VENDOR)

    • sponsor amount

    • Discount amount

What are different way for testing the integrations?#

  1. Sandbox testing: During development stage Partner can utilise this environment to test directly from Partner Portal. To be used only for testing the communication between Partner API and your webhook

  2. E2E testing: After Partner completes the development they can perform live End to End integration testing coordinating with Platform teams. We have list of test cases which can be covered

How can I use a testing environment for order management integrations?#

  • We have a sandbox environment which will be enabled automatically when a webhook is configured in the Partner Portal(Prerequisite: store POS integrations to be enabled & webhook should be configured in Partner Portal ).

  • Orders created from the sandbox environment can also be retrived via GET endpoint.

  • You can support the AM by identifying a test store or onboarding a new test store that can be utilised for testing purposes before going Live.

  • The Sandbox environment will push simulated statues i.e. expect to receive RECEIVEDREADY_FOR_PICKUPCANCELLED and DISPATCHED statuses.

  • However, in E2E testing for Pelican Picking scope you will receive only either statuses READY_FOR_PICKUP & CANCELLED

How End to End live testing performed?#

In order to perform E2E live integration testing, you’ll need to do the following: 

  1. Identify a test store and enable the integration configurations 

  2. Coordinate with KAIT, AM & Partner teams, to place an new order on platform and fulfill it from Pelican picking device  

  3. Follow the Integration Test cases document to test the integration usecases

What is Partner Portal and how do I get access?#

Partner Portal is a back office tool by which you can manage your stores. When you are onboarded to our platform our Account Management team will be providing you the access. Depending on your use privileges you can also manage the webhook and token configurations.

Following activities can be managed from Partner portal:

  • Integration configurations

    • Store operations

    • Create promotions

    • Update product availability & prices

    • Review orders across your stores

    • Identify issues and perform initial troubleshooting

How do I access the Shops Integrations Plugin?#

  1. All current Shops Partners of any size can access the Shops Integrations plugin in Partner Portal, you will be given access by your Account Manager or during registration with us.

  2. It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e webhook configurations 

  3. Please reach out to your account manager if you do not know how to gain access to Partner Portal

Where can I go for further support?#

If you have any questions regarding the integration or if you are facing errors, please contact your Account Manager or drop an email to Key Account integration Team: keyaccountsQC@deliveryhero.com

Picking through Self Solution#

Frequently Asked Questions about Picking through Self Solution

Can I generate API tokens myself?#

Yes, you can generate tokens on your own. You just need to have client ID and client Secret , which you can get from your Account Manager.

How many tokens can I generate?#

There are no limitation of the amount of tokens. However they have an expiry time, each token can be used for 2 hours.

Which account details required to establish API communication?#

  • Ensure that you have access to Partner Portal with Integration plugin, check with Account Manager to get access to required users

  • Post which API token can be generated and can be used to communicate with our API (Prerequisite: POS integrations to be enabled in Catalog & webhook should be configured in Partner Portal )

If an existing chain wants to onboard new outlets or scale, what is the process to integration?#

To scale the integration at chain level, following things are to be considered from your side

  • Verify access to your new stores in Partner Portal and review webhook configurations

  • (Optional) If you have any internal mapping for your store, it is possible for you to configure directly from the Shop Integrations plug-in. Use the new configured store-id or vendor id in your API requests

How do I find my Foodpanda Vendor/store ID?#

You can get it directly Partner Portal>Shop Integrations>Settings>Vendor Identifier section or please check with your Account manager.

What If I already have internal storeID and I don’t want to use Platform storeID?#

You can configure your internal storeID in Partner Portal>Shop Integrations>Settings>Vendor Identifier section. Please note to use the newly mapped storeID in your API requests.

How to configure webhook and secret?#

To secure your webhook communication between DH and Partner– a secret can be utilised for the purpose, it can be any string or its possible to have basic authentication mechanism. Secret is mandatory field in enabling the integrations.

Example of Basic authentication:

If your webhook service uses "partner" as the username and randompassword`\` as the password, then the value in Base64 encoding of \partner: randompassword\, is ``cmFuZG9tcGFzc3dvcmQ=

Basic cmFuZG9tcGFzc3dvcmQ= needs to be added to the secret field in the Partner Portal to enable the integrtaions.

Which order statuses are sent to the webhook for Partner Picking Integrations ?#

For Partner Picking Integrations, the webhook receives notifications for the following order statuses:

  • RECEIVED: This is the initial status of an order, indicating that order processing by the partner has not yet started. It is sent by Delivery Hero automation to the vendor's webhook when an order is received.

  • READY_FOR_PICKUP: This status signifies that order picking and packing has been completed by the partner, and the order is ready for pickup by a delivery rider. This status is set by the vendor using a PUT endpoint.

  • DISPATCHED: The order has been dispatched. For Platform Delivery, this status is sent by Delivery Hero automation to partner webhooks when riders pick up the order from the store.

  • CANCELLED: An order is marked as CANCELLED if the order is canceled by the customer, delivery rider, or you. No webhook will be sent on cancellations originating from the Partner Picking solution.

  • DELIVERED: This status will be sent after the READY_FOR_PICKUP status. Since this status comes from the platform logistics flow, you can expect a delay of approximately 30 minutes. Please confirm with your Account Manager that the DELIVERED status is enabled in your market.

How do I get the best out of the Partner picking integration using my webhook?#

  • RECEIVED READY_FOR_PICKUP DISPATCHED and CANCELLED order statuses are to be consumed by your webhook

  • Configurations: To secure your webhook configurations in Partner Portal, secrets can be utilised for the purpose it can be any string, we also accommodate basic authentication mechanism.

    • For example, if the webhook service uses partner as the username and randompassword as the password, then the value in Base64 encoding of partner: *randompassword, is cmFuZG9tcGFzc3dvcmQ=

    • Then the Authorization header field will appear as: Basic cmFuZG9tcGFzc3dvcmQ= (this needs to be added to the secret field in the Partner Portal)\

  • Leveraging PUT endpoint, ensure that you have covered below use cases with your own picking solution

    1. Complete order fulfilment

    2. Partial order fulfilment

    3. Item replacements

    4. Item additions

    5. Cart updates

    6. Fulfil order containing weighted items i.e pricing_type: "KG"

    7. Modify order quantity on items with pricing_type: "UNIT" (price adjustments are possible to a lower value on either of the fields unit_pice or total_price but not both)

    8. Order cancellation including appropriate cancellation reasons

What are the limitations of the Partner Picking Integration ?#

  1. Price modifications are not allowed on weighted items i.e pricing_type: "KG"

  2. Platform external_order_id doesn’t work to retrieve the order, while using the get endpoint to retrive single order, you should use the order_id (type uuid) from the order payload.

  3. Kindly ensure that your API requests(GET or PUT) to our service do not exceed 60 requests per minute.

What are the fields in the order payload and how can I use them?#

sample order payload

{
order_id: "807c225f-ac6d-445d-a074-ea960c892ca7",// used in GET endpoint
external_order_id: "qktu-ul1p", // visible on pelican
order_code: "546",
client: { //contains store information
id: "22438",
chain_id: "0aa64dc1-280b-4d1c-972a-28a15a14382a",
name: "qktu - chainname",
country_code: "tw",
store_id: "qktu",
external_partner_config_id: "462" //internal mapping for your stores
},
customer: { // customer information is masked
_id: "twxqg33o",
national_id: "",
tax_id: "",
first_name: "于**",
last_name: "**",
phone_number: "+88693****651",
delivery_address: {
country: "",
city: "",
street: "",
number: "",
latitude: 0,
longitude: 0,
company: "",
block: "",
building: "",
apartment: "",
entrance: "",
intercom: "",
floor: "",
suburb: "",
zipcode: "",
instructions: "",
formattedAddress: ""
}
},
comment: "",
items: [ // item level information
{
_id: "796ee50e-2cb5-41ec-8a06-4208fe15dcb3",
sku: "222316",
barcode: [
4710036604597
],
name: "#222316 | 靠得住冰爽棉28cm | 15 片 | #4710036604597",
pricing: { // contains information of fulfilled items
pricing_type: "UNIT",
unit_price: 85,
vat_percent: 0,
total_price: 170,
quantity: 2,
min_quantity: 0,
max_quantity: 2
},
original_pricing: { // contain information of item at order placement
pricing_type: "UNIT", // fo UNIT quatity hold information of any changes
unit_price: 85,
vat_percent: 0,
total_price: 170,
quantity: 2,
min_quantity: 0,
max_quantity: 2
},
container_deposit: 0,
discount: 0,
instructions: "",
status: "NOT_PROCESSED" // item level status
},
{
_id: "a5e42c90-351f-4c64-be7a-7dace4b96033",
sku: "146344",
barcode: [
4710098163773
],
name: "#146344 | 77脆可穀麥巧克力 | 36 g | #4710098163773",
pricing: {
pricing_type: "KG",–> // when pricing type is KG, weight field is availble in the pricing object, qunatity defualts to 1
unit_price: 7,
vat_percent: 0,
total_price: 14,
weight: 2.0,
quantity: 1,
min_quantity: 0,
max_quantity: 1
},
original_pricing: {
pricing_type: "KG",
unit_price: 7,
vat_percent: 0,
total_price: 14,
weight: 2.0,
quantity: 1,
min_quantity: 0,
max_quantity: 2
},
container_deposit: 0,
discount: 0,
instructions: "",
status: "NOT_PROCESSED" // item level status
}
],
order_type: "DELIVERY",
transport_type: "LOGISTICS_DELIVERY", // type delivery flow
payment: {
sub_total: 184, // sum of total items
order_total: 177, // amount paid by the customer contains fees,discounts
delivery_fee: 0,
service_fee: 2.39,
difference_to_minimum: 0,
discounts: [
{
name: "vh8o1buy",
value: -9.2
}
],
discount: -9.2,
container_charge: 0,
total_taxes: 8.32,
additional_fees: {
PriorityDeliveryFee: 0
},
type: "PAID"
},
cancellation: {
reason: "",
cancelled_by: "",
post_pickup: true // only visible for cancelled orders post order fulfilment
},
status: "CANCELLED", // order status
sys: {
created_at: "2023-09-01T07:41:17.733Z",
created_by: "Order Fulfilment",
updated_at: "2023-09-01T07:45:45.863Z",
updated_by: "Order Fulfilment",
webhook_status: ""
},
promised_for: "2023-09-01T08:06:11Z",
isPreorder: false
}

Should I validate the client details provided in the order payload?#

Depending on how you intend to route orders to a specific store, you can use the following field information to accurately identify and validate the store. store_id: xxxx, – Identifier of the store on Platform systems external_partner_config_id: xxxx– if the Partner store/outlet has any internal identifier it must be mapped to this field. Depending on how you want to direct the orders to specific store you can use below field information to validate the store

What is the difference between 'order_id', 'external_order_id' and 'order_code' and which one shall the Partner use for reconciliation purposes?#

order_id: 7384a9e4-c4e1-4820-873e-2cc637acec78– Unique identifier for order used in our backend services. If you want to query a single order using the GET endpoint you should use order_id

external_order_id: mxuv-2439-9sa5– platform order id, shown on Pelican device, external_order_id could be used in your reconciliation process

order_code: its an incremental value(resets after 9999) on orders used by riders for picking orders from store

What is the difference between 'sub_total' and 'order_total' ? Which is the final order total Partner should consider?#

  • sub_total:Refers to the total value of the order items, including item-level taxes but excluding any order-level discounts (such as coupon codes or discounts applied at the overall order level). You should use sub_total when you want to validate the cumulative value of all items in the order

  • order_total: This is the final amount paid by the customer for the order. It includes all item prices, delivery fees, and discounts(such as coupon codes or discounts applied at the overall order level)

What if the item has weight-based pricing?#

When an item has weight-based pricing, pricing_type will be "KG" at item level in the order payload. For such items, the quantity field will always have a default value of 1, and a weight field will be present with a decimal value to indicate the item's weight.

How to identify the items with finite quantity and items with KG / weighted quantities in order payload?#

  • Each item in the order has pricing and original_pricing objects, & both objects have quantity field

  • pricing object contain picked quantity (adjusted by the picker) refer to the field Items.pricing.quantity

  • original_pricing object contains ordered quantity by the customer, refer to the field Items.original_pricing.quantity

  • For items with finite quantity, pricing_type will be UNIT, sharing both pricing and original_pricing objects. The pricing object contains the picked quantity by the picker. Items.pricing.quantity

{
"pricing": {
"pricing_type": "UNIT",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 0.69,
"quantity": 1,
"min_quantity": 0,
"max_quantity": 2
},
"original_pricing": {
"pricing_type": "UNIT",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 1.38,
"quantity": 2,
"min_quantity": 0,
"max_quantity": 2
},
}

For items with weight, pricing_type will be KG, sharing both pricing and original_pricing objects. The pricing object contains the actual picked/fulfilled weight(decimal value) by the picker i.e Items.pricing.weight. We also share quantity for weighted items however this will be default value 1 (can be ignored if you find it not useful)

{
"pricing": {
"pricing_type": "KG",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 0.69,
"quantity": 1,
"weight": 1.0,
"min_quantity": 0,
"max_quantity": 2
},
"original_pricing": {
"pricing_type": "KG",
"unit_price": 0.69,
"vat_percent": 0,
"total_price": 0.69,
"quantity": 1,
"weight": 1.0,
"min_quantity": 0,
"max_quantity": 2
}
}

How can I tell if an order was actually picked up after being cancelled? I need to know whether it should be treated as a final sale.#

Request to Account Manager to enable the post_pick_up field. This is an addition to the existing cancellation object specific to the usecase– order cancellation after rider pickup. For all other cancelations scenarios– NO CHANGE, post_pick_up field is not visible.

Scenario: order cancelation after rider pickup:
"cancellation": {
"reason": "TECHNICAL_PROBLEM",
"cancelled_by": "CUSTOMER",
"post_picked_up": true
},
..
For other cancelation scenarios:
"cancellation": {
"reason": "TECHNICAL_PROBLEM",
"cancelled_by": "CUSTOMER",
},

How do I validate order cancellation? Should I use the same webhook or a different endpoint?#

Cancellation can occur from customer, vendor and logistics. When the cancellation event occurs during the life cycle of order. CANCELLED status will be sent to the same webhook configured in the Partner Portal.

What happens if my webhook service is not reachable does integration support retries to our webhook?#

We support retry mechanisms in cases where your webhook service does not respond within 10 seconds. The system will attempt up to 5 retries, each spaced 10 seconds apart. It is important that you implement appropriate handling on your end to manage potential duplicate order payloads, so that repeated webhook deliveries don't result in processing the same order multiple times.

What is Pre-checkout item replacement preference?#

In the RECEIVED order status, you can find additional field at item level which includes information on items suggested by customers for replacements.

If customer suggests the items for replacement, reconciliation_option will be  SUGGESTED_ITEMS 

"replacement_preferences":{
"reconciliation_option":"SUGGESTED_ITEMS",
"products":[
{
"sku":"sku",
"name":"name",
"unit_price":1.0,
"image_url":"http://www.example.org/pizza-salami.jpg"
"max_quantity": 10
}
]
}

If customers doesn't choose any items the default option will be Picker replacement. reconciliation_option will be  PICKER_REPLACE 

"replacement_preferences":{
"reconciliation_option":"PICKER_REPLACE",
"products":[
]
}

Sample order payload with RECEIVED status and customer item suggestion for replacement.reconciliation_option asSUGGESTED_ITEMS

{
"order_id": "f7bec72c-42e8-44db-a3ff-461335ddfa16",
"external_order_id": "xxx-2537-8pin",
"order_code": "44",
"client": {
"id": "a60de387-ca73-40b7-85c3-22341801c6f4",
"chain_id": "946735a9-1729-4b7c-a457-1cacc8718ff7",
"name": "xx",
"country_code": "xx",
"store_id": "xxx",
"external_partner_config_id": "xx"
},
"customer": {
"_id": "phl54ecn",
"national_id": "",
"tax_id": "",
"first_name": "xx",
"last_name": "xx",
"phone_number": "+xx",
"delivery_address": {
"country": "",
"city": "",
"street": "xx",
"number": "xx",
"latitude": xx,
"longitude": xx,
"company": "",
"block": "",
"building": "",
"apartment": "",
"entrance": "",
"intercom": "",
"floor": "",
"suburb": "",
"zipcode": "1000",
"instructions": "Test Order Only Sept 4 UAT Testing",
"formattedAddress": ""
},
"invoicing_information": {}
},
"comment": "",
"items": [
{
"_id": "84b7f7d6-8a70-4613-bfab-e706d76a6560",
"sku": "10100700",
"barcode": [
"04809010955487"
],
"name": "Harvester's Thai Jasmine Rice 5kg",
"pricing": {
"pricing_type": "UNIT",
"unit_price": 583,
"vat_percent": 0,
"total_price": 583,
"quantity": 1,
"min_quantity": 0,
"max_quantity": 1
},
"original_pricing": {
"pricing_type": "UNIT",
"unit_price": 583,
"vat_percent": 0,
"total_price": 583,
"quantity": 1,
"min_quantity": 0,
"max_quantity": 1,
"list_price": 583
},
"container_deposit": 0,
"discount": 0,
"instructions": "",
"status": "NOT_PROCESSED",
"image_url": "https://images.deliveryhero.io/image/darsktores-ph/food/4809010955487.png",
"promotion": [],
"replacement_preferences":{
"reconciliation_option":"SUGGESTED_ITEMS",
"products":[
{
"sku":"sku",
"name":"name",
"unit_price":1.0,
"image_url":"http://www.example.org/pizza-salami.jpg"
"max_quantity": 10
}
]
}
}
],
"order_type": "",
"transport_type": "VENDOR_DELIVERY",
"payment": {
"sub_total": 583,
"order_total": 583,
"delivery_fee": 0,
"service_fee": 0,
"difference_to_minimum": 0,
"discounts": [],
"discount": 0,
"container_charge": 0,
"total_taxes": 0,
"type": "CASH_ON_DELIVERY"
},
"cancellation": {
"reason": "",
"cancelled_by": ""
},
"status": "RECEIVED",
"sys": {
"created_at": "2025-05-12T02:39:00.631Z",
"created_by": "Order Fulfilment",
"updated_at": "2025-05-12T02:39:00.874Z",
"updated_by": "Order Fulfilment",
"webhook_status": ""
},
"accepted_for": "2025-05-12T02:59:00.631Z",
"promised_for": "2025-05-12T02:54:55.000Z",
"isPreorder": false,
"promotion_status": "AVAILABLE"
}

What is Promotion information at item level?#

You can track promotions applied to individual items in the order. promotion information is sent to the partners in items object of order payload.

  • Campaign/promotion name

  • Promotion Type

    • Strikethrough

    • Same item bundle

  • Discount sponsor (VENDOR)

    • sponsor amount

    • Discount amount

What are different way for testing the integrations?#

  1. Sandbox testing: During development stage Partner can utilise this environment to test directly from Partner Portal. To be used only for testing the communication between Partner API and your webhook

  2. E2E testing: After Partner completes the development they can perform live End to End integration testing coordinating with Platform teams. We have list of test cases which can be covered.

How can I use a Sandbox environment for order management integrations?#

  • We have a sandbox environment which will be enabled automatically when a webhook is configured in the Partner Portal(Prerequisite: store POS integrations to be enabled & webhook should be configured in Partner Portal ).

  • Orders created from the sandbox environment can also be modified via PUT endpoint.

  • You can support the AM by identifying a test store or onboarding a new test store that can be utilised for testing purposes before going Live.

  • The Sandbox environment will push simulated statues i.e. expect to receive RECEIVED, READY_FOR_PICKUP, CANCELLED and DISPATCHED statuses.

  • However in E2E testing you are expected to receive order statuses RECEIVED READY_FOR_PICKUP DISPATCHED and CANCELLED to your webhook

How End to End live testing performed?#

In order to perform E2E live integration testing, you’ll need to do the following: 

  1. Identify a test store and enable the integration configurations 

  2. Coordinate with KAIT, AM & Partner teams, to place an new order on platform and fulfill it from Pelican picking device  

  3. Follow the Integration Test cases document to test the integration usecases

What is Partner Portal and how do I get access?#

Partner Portal is a back office tool by which you can manage your stores. When you are onboarded to our platform our Account Management team will be providing you the access. Depending on your use privileges you can also manage the webhook.

Following activities can be managed from Partner portal:

  • Integration configurations

    • Store operations

    • Create promotions

    • Update product availability & prices

    • Review orders across your stores

    • Identify issues and perform initial troubleshooting

How do I access the Shops Integrations Plugin?#

  1. All current Shops Partners of any size can access the Shops Integrations plugin in Partner Portal, you will be given access by your Account Manager or during registration with us.

  2. It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e webhook configurations 

  3. Please reach out to your account manager if you do not know how to gain access to Partner Portal

Where can I go for further support?#

If you have any questions regarding the integration or if you are facing errors, please contact your Account Manager or drop an email to Key Account integration Team: keyaccountsQC@deliveryhero.com

Catalog Management through API#

Frequently Asked Questions about Catalog Management through API

How do I generate credentials to use Partner API /Catalog?#

Please see the token management section here

How many tokens can I generate?#

There are no limitation of the amount of tokens. However they have an expiry time, each token can be used for 2 hours.

If an existing chain wants to onboard new outlets or scale, what is the process to integration?#

To scale the integration at chain level, following things are to be considered from your side

  • Verify access to your new stores in Partner Portal and review webhook configurations

  • (Optional) If you have any internal mapping for your store, it is possible for you to configure directly from the Shop Integrations plug-in. Use the new configured store-id or vendor id in your API requests.

Can I generate API tokens myself?#

Yes, you can generate tokens on your own. You just need to have client ID and client Secret , which you can get from your Account Manager.

How do I find my Foodpanda Vendor/store ID?#

You can get it directly Partner Portal>Shop Integrations>Settings>Vendor Identifier section or check with your Account manager.

What If I already have internal storeID and I don't want to use Platform storeID?#

You can configure your internal storeID in Partner Portal>Shop Integrations>Settings>Vendor Identifier section. Please note to use the newly mapped storeID in your API requests.

How to configure webhook and secret?#

To secure your webhook communication between DH and Partner– a secret can be utilised for the purpose, it can be any string or its possible to have basic authentication mechanism. Secret is mandatory field in enabling the integrations.

Example of Basic authentication:

If your webhook service uses "partner" as the username and randompassword as the password, then the value in Base64 encoding of partner: randompassword, is cmFuZG9tcGFzc3dvcmQ=

Basic cmFuZG9tcGFzc3dvcmQ= needs to be added to the secret field in the Partner Portal to enable the integrtaions.

Can I use SKU or Barcode for updates?#

Yes, SKU and Barcode are both supported.

How many decimal points can the price go up to?#

Only first three decimals are supported, example: 4.5555555 will lead to 4.555

How to use max_sales_quantity?#

max_sales_quantity is configured at item level, it will limit the number of items a customer can place in one order e.g if the max_sales_quantity for the milk product is set to 5, the customer can place up to 5 quantities of milk in one order.

What is the significance of the quantity field?#

We don’t store the quantity field; it acts as a reference in comparison with the already configured sales buffer in the catalog. It is used for the deactivation or activation of products when the quantity is less or more than the sales buffer respectively.

Eg. if you send quantity as 3 & sales buffer is configured as 5, the product will be deactivated on the front end becasue quantity < sales_buffer

How many SKUs can _PUT /catalog_ request accommodate in a single request?#

We don’t have estimates on the number of SKUs, our services can consume data of 100MB which is a fairly large assortment size for a single store.

How frequently can vendors push assortment API updates?#

The decision regarding frequency of pushing updates lies with the vendor. We suggest to use bulk updates if Partner want to update multiple products, as it provides visibility to Partners on update logs to the configured webhook. Partner can push entire assortment once a day and during the day share only delta changes. Please make sure that your API requests don’t exceed more than 60 per minute.

How much time is required for product updates to be reflected on the frontend?#

Assortment changes will take up to 15 minutes to sync to the Platform App.

How can vendors check the status of the API updates?#

In the Partner Portal shops integration plugin, vendors can get an overview of jobs, any error with respect to SKU will be listed there, if SKU is not found please review the request body for SKUs available on catalog. Assortment API is used for updating the existing products in catalog not for creating new products. If the vendor configures the webhook, they can receive the status of updates at SKU level.

Where can I check my product prices?#

We offer the Store Management plugin, accessible through the store's Partner Portal account that will allow you to check the current product prices.

What is Partner Portal and how do I get access?#

Partner Portal is a back office tool by which you can manage your stores. When you are onboarded to our platform our Account Management team will be providing you the access. Depending on your use privileges you can also manage the webhook.

Following activities can be managed from Partner portal:

  • Integration configurations

    • Store operations

    • Create promotions

    • Update product availability & prices

    • Review orders across your stores

    • Identify issues and perform initial troubleshooting

How do I access the Shops Integrations Plugin?#

  1. All current Shops Partners of any size can access the Shops Integrations plugin in Partner Portal, you will be given access by your Account Manager or during registration with us.

  2. It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e webhook configurations

  3. Please reach out to your account manager if you do not know how to gain access to Partner Portal

Where can I go for further support?#

If you have any questions regarding the integration or if you are facing errors, please contact your Account Manager or drop an email to Key Account integration Team: keyaccountsQC@deliveryhero.com

Promotion Management through API#

Frequently Asked Questions about Promotion Management through API

How do I generate a token to use Partner API/Promotions?#

Please see the token management section here

If I already have an integration and I want to onboard new outlets, how can I integrate them?#

Your integration setting is on chain level. If new outlets are onboarded to the existing integrated chains, there will not be a need for the additional development. You just need to inform your Account Manager that you have a new store and he will create it in our systems. Then, you can use the right identifier for the new outlet (vendor id) when sending the request.

Can I get the token myself?#

Yes, you can generate tokens on your own. You just need to have client ID and client Secret , which you can get from your Account Manager.

How do I find my Vendor ID?#

Please reach out to your Account Manager to get the Vendor ID.

How many tokens can I generate?#

There are no limitation of the amount of tokens. However they have an expiry time, each token can be used for 2 hours.

What If I already have internal Vendor IDs and I don’t want to use Delivery Hero IDs for Store Identifiers?#

If you have your own Vendor IDs, you are welcome to use them. Simply map your IDs in the Partner Portal under the "Vendor Identifier" section, as shown in the screenshot below, and link your external Vendor ID to the Delivery Hero Vendor ID.

Can I create the same promotion for multiple vendors?#

Yes. It can be done in “vendors” parameter (can be platform id or partner’s external id mapped in Partner Portal). If vendors = [*] promotion will be applied to all vendors associated with the chain.

What types of promotions can I create?#

Strikethrough Discounts (Absolute Value off, Percentage off, Final Price).

If I send two requests for the same SKU: one for strikethrough one for BOGO promotion with different overlapping dates, what will be visible on the front end?#

The promotion that has a later start_time will be visible after it overlaps the first promotion.

Can I modify the end date of an active promotion?#

You should first deactivate the old promotion "active": false and send a new request with new dates.

Can I remove just one or few SKUs from the promotion?#

Yes, by adding the relevant SKUs to the “discount” parameter and then set the “active” as “false”.

Can I use SKU or Barcode for updates?#

No, only SKU is supported.

What are the limitations of Partner API/Promotions?#

  • Promotions created via API must be modified via API

  • To modify/delete a promo, the same body request is required

  • Currently, there is no item-level error visibility when using Partner API/Promotions

  • It is not possible to create promotions for different skus and different vendors in a single request

Is it possible for me to deactivate promotions?#

Yes, it is possible to do with the PUT request, setting the “active” parameter as “false”.

What is the campaign size limit?#

Partner can create up to 2 M promotions in one request (skus*vendors)

When should I expect the promotion to be visible on the front end after creating it via API?#

The promotion creation can take maximum up to 50 minutes if the request reaches the maximum capacity

Can I create a promotion for all vendors inside the chain?#

If vendors = [*] promotion will be applied to all vendors associated with the chain.

Discount price changes during the campaign, do we have to deactivate the first campaign or can replace it with a new discount price?#

If the discount price changes during the campaign, you can send the request for the SKU which price was changed with new dates and new prices, in this case our system will prioritise the latest start date and activate the new promotion.

How do I disable a Campaign?#

Vendors can disable the campaign by sending "active": false in the request.

What happens if the same SKU is included in multiple promotions?#

The promotion with the latest start date will override previous ones.

Why did my promotion not show on the front end?#

Check if:

  • discounted_price < original price

  • start_date is in the future and the format is correct

  • SKU is active in catalog

  • The sync time (up to 50 min) has passed

How do I access the Shops Integrations Plugin?#

  • You can access the Shops Integrations plugin in Partner Portal, you will be given access by your account manager or during registration with us.

  • It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e. webhook configurations, secret

  • Please reach out to your account manager if you do not know how to gain access to Partner Portal

Where can I check my promotions?#

We offer Shops Promotions plugins accessible through the store's Partner Portal account that will allow you to check the current promotions.

Where can I go for further support?#

If you have any questions regarding the integration or if you are facing errors, please contact the Key Account integration Team via keyaccountsQC@deliveryhero.com or your Account Manager.

Catalog Management through SFTP#

Frequently Asked Questions about Catalog Management through SFTP

Who should generate the SFTP credentials?#

Your Account Manager should generate them for access and troubleshooting visibility.

How do I find my Vendor ID?#

Please reach out to your Account Manager to get the Vendor IDs.

What If I already have internal Vendor IDs and I don’t want to use Delivery Hero IDs for Store Identifiers?#

If you have your own Vendor IDs, you are welcome to use them. Simply map your IDs in the Partner Portal under the "Vendor Identifier" section, as shown in the screenshot below, and link your external Vendor ID to the Delivery Hero Vendor ID.

If I already have an integration and I want to onboard new outlets, how can I integrate them?#

Your integration setting is on chain level. If new outlets are onboarded to the existing integrated chains, there will not be a need for the additional development. You can use the same credentials. Please ensure that you send the file for the new outlet with the right vendor code in the file name.

Contrary to common sense, more uploads does not mean better out of stock values. We advise you to run an upload close to the actual stock updates and send deltas (only products that were updated) for faster update times.

Can I use SKU or Barcode for updates?#

Yes, SKU and Barcode are both supported.

How many decimal points can the price go up to?#

Only first three decimals are supported, example: 4.5555555 will lead to 4.555

How to use max_sales_quantity?#

max_sales_quantity is configured at item level, it will limit the number of items a customer can place in one order e.g if the max_sales_quantity for the milk product is set to 5, the customer can place up to 5 quantities of milk in one order.

What is the significance of the quantity field?#

We don’t store the quantity field; it acts as a reference in comparison with the already configured sales buffer in the catalog. It is used for the deactivation or activation of products when the quantity is less or more than the sales buffer respectively.

Eg. if you send quantity as 3 & sales buffer is configured as 5, the product will be deactivated on the front end becasue quantity < sales_buffer

What should be the expected sync time for Assortment?#

Assortment changes will take up to 15 minutes to sync to the Platform App.

Where can I check my product prices?#

We offer the Store Management plugin, accessible through the store's Partner Portal account that will allow you to check the current product prices.

Do I use the vendor ID as the file name to run a multi-vendor assortment update?#

No, the file naming should be set as <prefix.csv> no special identifier needs to be specified. Important: Do not use “_” as part of the prefix as it will stop the file from reading the “vendors” column.

I sent the same SKU twice in an SFTP file. What happens?#

Duplicate SKUs will result in both lines being ignored.

Why is the price not updating for a product?#

Check the SFTP files you have uploaded in Shops Integration Plugin in Partner Portal Common causes:

  • SKU not in catalog → Fix: Add SKU via POST /catalog or Partner Portal.

  • Price = 0 or < sales buffer → Fix: Ensure price > 0 and optionally raise sales buffer.

  • Duplicated SKU in file → Fix: Remove duplication.

What are the common errors observed for failed processed SFTP updates?#

  • Incorrect Name Format (example of common errors)

    • qa_v4ft.csv → system will not read the vendor column in the file.

    • qa.csv → no vendor id is found in the file name → we fallback to vendor column search → if found → it proceeds , else it fails.

  • Incorrect Folder in foodpanda SFTP Server was used to drop the file- in this case the file will be rejected.

  • If you send price 0 or negative - the line will be ignored

  • SKU does not exist in Catalog- if you have not added particular SKU to your Catalog - there is nothing to update, therefore the line will be ignored and you will see “Missing SKU” error

  • Duplicated SKU sent - in this case both lines will be ignored.

How do I view Assortment updates in the Partner Portal?#

The Assortment Files can be viewed in Shops Integration Plugin in the Partner Portal. Moreover, you are able to download the files that have been uploaded and see the errors if any occurred on the item level.

What is Partner Portal and how do I get access?#

The Partner Portal is a back-office tool designed to help partners efficiently manage their stores on our platform. It serves as a central hub where you can review and control various functions of your store operations. Once you're onboarded, our Account Management team will provide you with access to the portal.
Through the Partner Portal, you will be able to :

  • View your product catalog

  • Set up and configure store integrations

  • Monitor promotions

  • Define store opening and closing times

  • Review orders across all your stores

  • Identify issues and perform initial troubleshooting

Key Plugins:
Shops Integration Plugin
This plugin enables you to manage and review your integrations. You can:

  • Review the daily job updates for both Promotion and Assortment SFTP files

  • View existing integrations and their status

  • Access uploaded SFTP files

  • Review SFTP file contents and check for any errors that occurred during the upload process

  • Pause the integration

Shops Promotions Plugin
This plugin gives you a complete overview of all promotions created for your store(s). You can:

  • Review all active and historical promotions

  • See how each promotion that was created (e.g., via SFTP or API)

  • View detailed information including creation date, time, and affected SKUs

  • Check promotional prices and scheduling

How do I access the Shops Integrations Plugin?#

  • You can access the Shops Integrations plugin in Partner Portal, you will be given access by your account manager or during registration with us.

  • It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e. webhook configurations, access tokens

  • Please reach out to your account manager if you do not know how to gain access to Partner Portal

Where can I go for further support?#

If you have any questions regarding the integration or if you are facing errors, please contact the Key Account integration Team via keyaccountsQC@deliveryhero.com or your Account Manager.

Promotion Management through SFTP#

Frequently Asked Questions about Promotion Management through SFTP

Who should generate the SFTP credentials?#

Your Account Manager should generate them for access and troubleshooting visibility.

How do I find my Vendor ID?#

Please reach out to your Account Manager to get the Vendor ID.

What If I already have internal Vendor IDs and I don’t want to use Delivery Hero IDs for Store Identifiers?#

If you have your own Vendor IDs, you are welcome to use them. Simply map your IDs in the Partner Portal under the "Vendor Identifier" section, as shown in the screenshot below, and link your external Vendor ID to the Delivery Hero Vendor ID.

If I already have an integration and I want to onboard new outlets, how can I integrate them?#

Your integration setting is on chain level. If new outlets are onboarded to the existing integrated chains, there will not be a need for the additional development. You can use the same credentials. Please ensure that you send the file for the new outlet with the right vendor code in the file name.

What types of promotions can I create?#

Strikethrough Discounts (Absolute Value off, Percentage off, Final Price)

Can I use barcode instead of SKU?#

Yes, SKU and Barcode are both supported, but if you want to use barcodes- please inform your Account Manager beforehand

How many decimal points can the price go up to?#

Only first three decimals are supported, example: 4.5555555 will lead to 4.555

Can I create the same promotion for multiple vendors?#

Yes. By sending “all” in the vendors column all stores inside the chain will be part of the promotion.

Can I modify the end date of an active promotion?#

You should first deactivate the old promotion by sending the files including the products you want to deactivate with campaign_status =0. Or send a new file with later start_date, in this case our system will overlap the previous promotions and prioritise the second one.

Can I remove just one or few SKUs from the promotion?#

Yes, by adding the SKUs you want to remove from the promotions to file and use campaign_status= 0 to deactivate these particular products.

Do I use the vendor ID as the file name to run a multi-vendor assortment update?#

No, the file naming should be set as “prefix.csv” (the prefix can be anything) no special identifier needs to be specified. Important: Do not use “_” as part of the prefix as it will stop the file from reading the “vendors” column.

File name scenarios: Qa_v4ft.csv → do not read vendor column in file. Qa.csv → no vendor id found → we fallback to vendor column search → if found → we proceed , else we fail.

If I send two requests for the same SKU: one for strikethrough one for BOGO promotion with different overlapping dates, what will be visible on the front end?#

The promotion that has a later start_time will be visible after it overlaps the first promotion.

Is it possible for me to deactivate promotions?#

Yes, it is possible to do with additional file adding campaign_status =0 in the column for all lines

What is the campaign size limit?#

The Limit for the size of each campaign is 19,999 SKUs.

When should I expect the promotion to be visible on the front end after creating it via SFTP?#

The promotion creation can take maximum up to 50 minutes.

How do I view Promotion updates in the Partner Portal?#

Promotion Files can be viewed in Shops Integration Plugin in Partner Portal. Moreover, you are able to download the files that have been uploaded and see the errors if there are any occurred on the item level.

Can I change the start and end dates of a campaign, and what happens if they remove a specific SKU from a running campaign?#

By sending the updated promotions file with later start dates, our system will prioritise this file over the previous one, and the old promotions will be overridden by the new ones. If you only want to deactivate a single SKU, you can set the “campaign status”= 0, and that SKU will be removed from the promotion.

Discount price changes during the campaign, do we have to deactivate the first campaign or can replace it with a new discount price?#

If the discount price changes during the campaign, you can send the same file with the new dates and new prices, in this case our system will prioritise the latest start date and activate the new promotion.

I sent the same SKU twice in an SFTP file. What happens?#

We will process the 1st row and remove remaining duplicated rows.

#Why did my promotion not show on the front end?

Check if:

  • discounted_price < original price

  • start_date is in the future and the format is correct

  • SKU is active in catalog

  • The sync time (up to 50 min) has passed

What are the common errors observed for Promotions?#

  • Incorrect Name Format (example of common errors)

    • qa_v4ft.csv → system will not read the vendor column in the file.

    • qa.csv → no vendor id is found in the file name → we fallback to vendor column search → if found → it proceeds , else it fails.

  • Past date for the promotion- the line will fail if the date in the past is sent. You will see “Filtered by SFTP” when downloading the file

  • The discount price is larger than the original price- the line will not be processed, if other lines are correct - they will be processed

  • Incorrect Date format- the lines will fail. If you want to use different date format- please let your Account Manager know, we can accommodate that

  • SKU does not exist in Catalog- if you have not added particular SKU to your Catalog - there is nothing to create a promotion for, therefore the line will be ignored and you will see “Missing SKU” error

  • If you send discounted_price 0 or negative - the line will be ignored

  • Incorrect Folder in foodpanda central was used to add the file- in this case the file will be rejected

  • Duplicated SKU sent - in this case both lines will be ignored.

What is Partner Portal and how do I get access?#

The Partner Portal is a back-office tool designed to help partners efficiently manage their stores on our platform. It serves as a central hub where you can review and control various functions of your store operations. Once you're onboarded, our Account Management team will provide you with access to the portal.
Through the Partner Portal, you will be able to :

  • View your product catalog

  • Set up and configure store integrations

  • Monitor promotions

  • Define store opening and closing times

  • Review orders across all your stores

  • Identify issues and perform initial troubleshooting

Key Plugins:
Shops Integration Plugin
This plugin enables you to manage and review your integrations. You can:

  • Review the daily job updates for both Promotion and Assortment SFTP files

  • View existing integrations and their status

  • Access uploaded SFTP files

  • Review SFTP file contents and check for any errors that occurred during the upload process

  • Pause the integration

Shops Promotions Plugin
This plugin gives you a complete overview of all promotions created for your store(s). You can:

  • Review all active and historical promotions

  • See how each promotion that was created (e.g., via SFTP or API)

  • View detailed information including creation date, time, and affected SKUs

  • Check promotional prices and scheduling

How do I access the Shops Integrations Plugin?#

  • You can access the Shops Integrations plugin in Partner Portal, you will be given access by your account manager or during registration with us.

  • It is advised to limit the access to Shops plugins in Partner Portal to only those who need to perform a function for your business - this is because Partner Portal can contain sensitive information i.e. webhook configurations, access tokens

  • Please reach out to your account manager if you do not know how to gain access to Partner Portal

Where can I check my promotions?#

We offer Shops Promotions plugins accessible through the store's Partner Portal account that will allow you to check the current promotions.

Where can I go for further support?#

If you have any questions regarding the integration or if you are facing errors, please contact the Key Account integration Team via keyaccountsQC@deliveryhero.com or your Account Manager.