Overview
The goal of the Managing Orders stage is to ensure you are able to successfully ship products.
Understanding some important concepts up-front will make this easier.
Order Status
Every order has a status, which updates throughout the lifecycle of the order. If the order status values used in your system do not have a suitable correlate in the order status values provided by iQmetrix, you can use the 8 (Other) status and provide your own label in the Message property.
When the Dropship order is created, the order is automatically assigned a status of 0 (PendingSupplier) by the Dropship service.
It’s important for you, the supplier, to note that when you receive the order in your system it is your responsibility to update the status of the order to 1 (Ordered). Updating the status of an order updates the status of each item in the order.
Order Status Values and Order Flow
The set of status values that can be set for orders maps onto the order lifecycle flow in the ordering lifecycle. The flow showing all potential status values for a complete order is shown below.
Avoiding Duplicate Orders
The iQmetrix architecture is distributed, and to ensure that messages are never lost the system employs an “at-least-once” delivery mechanism. “At-least-once” means that message delivery is reliable; however, occasionally messages may be duplicated.
To avoid processing the same order more than once, your system should track the identifier for the Dropship order. In the order feed, this information is captured in the order-created.order-id
field.
The Order Notifications Feed
The Supplier Orders API produces an Order Notifications Feed that records that captures all Dropship order events from the supplier’s point of view. Newly created orders are prepended to the beginning of the notification feed. You can use this feed to track or verify order events arriving from the iQmetrix system.
The Order Notifications Feed is provided in “Atom Syndication Format” using “Archived Feeds” and is encoded as atom+xml
. Each page of the feed contains up to 50 events.
- To access the Order Notification Feed, use the request Get Dropship Orders from the Feed
Create Shipping Provider API
Suppliers typically want to present customers with their options for shipping the order after the customer has selected their items for purchase. This might include options for shipping providers (for example, Fedex, UPS, or the postal service) or other options (for example, free shipping vs. faster shipping). These options will vary with individual supplier shipping practices.
To specify shipping options for your customers, you implement your own version of an API, the Shipping Options. Specifying a Shipping Options API gives iQmetrix the ability to request your shipping options for a given delivery address and set of products.
For your shipping options to interoperate correctly with iQmetrix Dropship product, your implementation of the Shipping Options API_ must exactly match the API specifications, shown on the Shipping Options page.
Once an order has been created, shipping options are displayed using the Shipping Aggregator service.
Create Backup Shipping Provider API
To prevent service interruptions, iQmetrix strongly recommends suppliers provide a secondary shipping options API to be used as a failover if the original service is taken down accidentally or for maintenance.
If provided, this must be in the form of a list of options with flat rate shipping fees.
Provide Shipping Provider API Details
Once you have created the Shipping Provider API, provide iQmetrix with the following information for all available environments:
- URL
- Authentication type
- Authentication credentials
Request Test Orders
When you are ready to start testing orders, contact your Launch Specialist to create Test Orders for your integration.
Access the Order Feed
Once orders have been placed in iQmetrix applications, you can view them using the Order Notifications Feed
.
You may also use Dropship Webhooks as an alternative to polling the Dropship API.
When reading the order entry, one of two shipping addresses are given: the store address or the customer address, determined by the shipping-address.type
field.
Order notifications are an archive of all your orders, regardless of retailer or location.
Each page of the feed will contain up to 50 events. If a page has 50 events and a new event occurs, then those 50 events are pushed into an archived page. The current feed will contain the new event at this time. This feed must be monitored by the supplier and when a new order is placed the supplier can process this order. It is up to the supplier’s system to keep track of the orders that have been processed and their current status.
It is also possible to get historical archives from the order feed, see Parse Order Archives.
The Order Feed is divided into two order types: order-created
, generated by the client (i.e. RQ), and order-status-updated
, generated by the supplier. Each resource has its own list of fields and is set up as a separate entry in the Order Feed.
The order-id
is found in the Order Notifications Feed under the order type. This order-id
is separate from the order ID that is generated by the retailer. Use the order-id
when updating the status of your orders.
To get the latest Order Notification Feed entries, use the request Getting the Order Feed and the following parameters:
SupplierId
- Supplier identifier, provided in Onboarding Package
Example Request
GET https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Notifications
Authorization: Bearer b0k0dY70N3Vv9jR1b9oEdW9IeT5WIn85WCYFJRo6AiIKLEMBFwNbEQsfeCUeM3gdPA1gAAVxWTJacX8mJyBaGRcFVwQOEV49NgBz
Accept: application/atom+xml
Example Response
HTTP 200 Content-Type: application/json
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="https://www.w3.org/2005/Atom">
<title type="text">Dropship Order Event Feed</title>
<id>urn:uuid:477d9f09-2965-4452-8770-bfbc24328b21</id>
<updated>2017-08-04T21:57:25Z</updated>
<author>
<name>iQmetrix</name>
</author>
<link rel="current" href="https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Notifications" />
<link rel="self" href="https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Notifications/Pages(477d9f09-2965-4452-8770-bfbc24328b21)" />
<entry>
<id>urn:uuid:659a9f09-0d1d-46da-8899-aff5ebd758b8</id>
<title type="text">Dropship Order Status Updated</title>
<published>2017-08-04T21:52:33Z</published>
<updated>2017-08-04T21:52:33Z</updated>
<content type="application/xml">
<order-status-updated xmlns:i="https://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iQmetrix:dropship">
<company-id>14066</company-id>
<items>
<item-information>
<catalog-id>cec02f3f-22d7-4504-83a8-5afda2dfc1a0</catalog-id>
<info>www.ups.com</info>
<message></message>
<quantity>1</quantity>
<reference-name i:nil="true" />
<reference-value i:nil="true" />
<shipping-provider>UPS</shipping-provider>
<sku>9101AGAP6</sku>
<status>Shipped</status>
<tracking-info>23923408863</tracking-info>
</item-information>
</items>
<order-id>0ff6f9f7-9e31-4039-8365-ff5471dbee7e</order-id>
<supplier-id>14107</supplier-id>
</order-status-updated>
</content>
</entry>
<entry>
<id>urn:uuid:f01bbbda-c0b5-4a77-9563-5d62d3f8dc08</id>
<title type="text">Dropship Order Created</title>
<published>2015-12-03T23:36:22Z</published>
<updated>2015-12-03T23:36:22Z</updated>
<content type="application/xml">
<order-created xmlns:i="https://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iQmetrix:dropship">
<items>
<order-item>
<catalog-id>b85cb879-bb5f-4847-a856-8287de0a92d5</catalog-id>
<description>Samsung Galaxy S4 Standard Battery</description>
<quantity>1</quantity>
<selling-price>39.99</selling-price>
<sku>B00LAOKN4S</sku>
</order-item>
</items>
<order-id>abe6a66f-7009-4af4-b02d-3aaf08dba043</order-id>
<seller>
<company-id>14146</company-id>
<location-id>14223</location-id>
<po-reference>TT101IN18</po-reference>
<printable-id>7400009</printable-id>
</seller>
<ship-to-store>false</ship-to-store>
<shipping-address>
<address-id>a08b0640-606a-41f0-901a-facaf50e75dd</address-id>
<attention-to i:nil="true" />
<business-name i:nil="true" />
<country>Canada</country>
<country-code>CA</country-code>
<locality>Yellowknife</locality>
<notes i:nil="true" />
<phone i:nil="true" />
<post-office-box-number i:nil="true" />
<postal-code>X1A 3X7</postal-code>
<region>Northwest Territories</region>
<region-code>NT</region-code>
<street-address-1>4702 Anderson-Thomson Blvd</street-address-1>
<street-address-2 i:nil="true" />
<type>Home</type>
</shipping-address>
<shipping-customer>
<alternate-name i:nil="true" />
<customer-id>659c2a38-d083-4421-9330-46d779702f85</customer-id>
<family-name>Jasmine</family-name>
<middle-name i:nil="true" />
<notes>Interested in iPhone 6</notes>
<primary-name>Princess</primary-name>
<title>Ms</title>
<type>Person</type>
</shipping-customer>
<shipping-entity-id>0</shipping-entity-id>
<shipping-method>1716</shipping-method>
<supplier-id>14107</supplier-id>
</order-created>
</content>
</entry>
</feed>
Example Request (C#)
using System;
using System.Configuration;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.ServiceModel.Syndication;
using System.Xml;
using System.Xml.Linq;
using System.Xml.Serialization;
public void GetAtomFeedFirstPage(string authToken, int supplierId)
{
var stream = GetAtomFeed(authToken, supplierId);
var reader = XmlReader.Create(stream);
var feed = SyndicationFeed.Load(reader);
// Note: this example does not include logic to recursively navigate through previous feed pages until the last processed order is found.
foreach (var item in feed.Items)
{
// process feed items
// this could include using an XmlSerializer to deserialsize
var textContent = item.Content as XmlSyndicationContent;
if (textContent != null)
{
var element = textContent.ReadContent<XElement>();
using (var reader = element.CreateReader())
{
var serializer = new XmlSerializer(typeof(AtomFeedOrder));
var order = (AtomFeedOrder)serializer.Deserialize(reader);
}
}
}
}
public Stream GetAtomFeed(string authToken, int supplierId, string
archiveUrl = null)
{
Stream result = null;
HttpClient client = new HttpClient();
var baseUrl = "https://dropshiprc.iqmetrix.net/";
var url = archiveUrl == null
? string.Format("v1/Suppliers({0})/Notifications", supplierId)
: archiveUrl;
client.BaseAddress = baseUrl;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/atom+xml"));
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", authToken);
return client.GetStreamAsync(url).GetAwaiter().GetResult();
}
Parse Order Archives
Each order feed archive, including the current order feed, contains a link to the previously archived 50 events.
We recommend storing the ID of the last order retrieved to access the next batch of orders.
To get the latest Order Notification Archives, use the request Getting the Order Feed Archives and the following parameters:
SupplierId
- Supplier identifier, provided in Onboarding PackagePageId
- Identifier for a Page, obtained from Accessing the Order Feednext-archive
(next 50) orprev-archive
(previous 50) property
Example Request
GET https://dropshiprc.iqmetrix.net/v1/Suppliers(14017)/Notifications/Pages(477d9f09-2965-4452-8770-bfbc24328b21)
Authorization: Bearer b0k0dY70N3Vv9jR1b9oEdW9IeT5WIn85WCYFJRo6AiIKLEMBFwNbEQsfeCUeM3gdPA1gAAVxWTJacX8mJyBaGRcFVwQOEV49NgBz
Accept: application/atom+xml
Example Response
Example response truncated for brevity.
HTTP 200 Content-Type: application/json
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="https://www.w3.org/2005/Atom">
<title type="text">Dropship Order Event Feed</title>
<id>urn:uuid:477d9f09-2965-4452-8770-bfbc24328b21</id>
<updated>2017-08-04T21:57:25Z</updated>
<author>
<name>iQmetrix</name>
</author>
<link rel="current" href="https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Notifications" />
<link rel="self" href="https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Notifications/Pages(477d9f09-2965-4452-8770-bfbc24328b21)" />
<entry>
<id>urn:uuid:dc43a5eb-b9dd-4dce-b2a2-39ecfef3c090</id>
<title type="text">Dropship Order Status Updated</title>
<published>2017-08-04T21:57:24Z</published>
<updated>2017-08-04T21:57:24Z</updated>
<content type="application/xml">
<order-status-updated xmlns:i="https://www.w3.org/2001/XMLSchema-instance" xmlns="urn:iQmetrix:dropship">
<company-id>14066</company-id>
<items>
<item-information>
<catalog-id>cec02f3f-22d7-4504-83a8-5afda2dfc1a0</catalog-id>
<info>www.ups.com</info>
<message></message>
<quantity>1</quantity>
<reference-name i:nil="true" />
<reference-value i:nil="true" />
<shipping-provider>UPS</shipping-provider>
<sku>9101AGAP6</sku>
<status>PartiallyShipped</status>
<tracking-info>23923408863</tracking-info>
</item-information>
</items>
<order-id>0ff6f9f7-9e31-4039-8365-ff5471dbee7e</order-id>
<supplier-id>14107</supplier-id>
</order-status-updated>
</content>
</entry>
</feed>
Shipping an Order
It is recommended to hold the order (i.e. BackOrdered
) until all items are available and in-stock to reduce any overhead involved with partial shipments.
Partial shipments are supported but are currently limited. It is highly recommended to ship a complete order, rather than a partially shipped order. See (Optional) Partially Ship an Order for more information.
Notifying the End Customer
Once the order, or one or more items, are set to a Shipped
status, an email is automatically generated by iQmetrix and sent to the end customer. In the case of item status updates, an email is sent for each unique batch of items set to the Shipped
status.
It is the responsibility of the courier to notify the end customer when their shipment is en route. The end customer’s phone number is provided via the shipping-customer
under the Order Created
resource in the Order Notifications Feed.
Should the end customer not provide a phone number, we recommended contacting the store via the seller.location-id
property under the Order Created
resource.
Update Shipping Status for an Order
Once you have processed an order, you must update the status of the Order - which will generate an email for the consumer.
To perform a status update use the request Update the Status of a Dropship Order and the following parameters:
SupplierId
- Supplier identifier, provided in Onboarding PackageOrderId
- Identifier for a dropship order. For a list of values, seeorder-id
for each order after Accessing the Order FeedId
- SeeOrderId
aboveStatus
- Defaults to 0 (PendingSupplier)Info
- General information about the item(s), such as tracking site, additional reference info, etcMessage
- A reason for the status of an orderShippingProvider
- Shipping carrier for the orderTrackingInfo
- Tracking number for a shipped order
Example Request
PUT https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Orders(0ff6f9f7-9e31-4039-8365-ff5471dbee7e)/OrderStatusUpdate
Authorization: Bearer b0k0dY70N3Vv9jR1b9oEdW9IeT5WIn85WCYFJRo6AiIKLEMBFwNbEQsfeCUeM3gdPA1gAAVxWTJacX8mJyBaGRcFVwQOEV49NgBz
Accept: application/json
Content-Type: application/json
{
"Id": "0ff6f9f7-9e31-4039-8365-ff5471dbee7e",
"Info": "www.ups.com",
"Message": "",
"ShippingProvider": "UPS",
"Status": 2,
"TrackingInfo": "23923408863"
}
Example Response
HTTP 202 Content-Type: application/json
{
"Id": "0ff6f9f7-9e31-4039-8365-ff5471dbee7e",
"Status": "Shipped",
"TrackingInfo": "23923408863",
"ShippingProvider": "UPS",
"ReferenceName": null,
"ReferenceValue": null,
"Info": "www.ups.com",
"Message": ""
}
(Optional) Partially Ship an Order
There are two scenarios when updating the status of an order:
- All items are available and a full shipment is sent to the end customer.
- One or more items are not available but partial shipment to the end customer is possible.
iQmetrix recommends avoiding partial shipments wherever possible. However, while partial shipment is not recommended, the Dropship service does support multiple tracking numbers for a single order item.
To let Dropship know that quantities on a single order item are being shipped separately, use "Status": 6
(PartiallyShipped) when updating item status until all quantities have been shipped, then use "Status": 2
(Shipped).
Clients subscribed to iQmetrix shipping notification emails are notified when the ItemStatus is updated to "Status": 2
(Shipped).
Multiple tracking numbers may be put in the TrackingInfo field delimited by commas, e.g. 1Z863YY60392796356,1Z863YY60393998
. Note that quantities in each shipment will not be indicated to customer.
'TrackingInfo': '1Z863YY60392796356,1Z863YY60393998'
). This will prevent overriding existing tracking numbers on the order.If an order has items that are currently unavailable but must be shipped, then you must contact iQmetrix Support to coordinate with the partial shipments.
There are two main cases when handling partial shipments, choose the most appropriate case that applies to you:
Incremental Shipments
In this scenario, the supplier would continue to update the status of individual items up to and including the final partial shipment.
For example, an order has 3 different items that have different levels of availability. One of the items is currently available, and so a partial shipment is made with that item stated as Shipped
. This occurs two more times, when each product becomes available, including the final partial shipment. The Shipped
status needs to be repeated for each subsequent partial shipment.
Partial Shipments followed by a Complete Order
In this scenario, the supplier would continue to update the status of individual items, and send a complete order for the final shipment.
For example, an order has 3 different items that have different levels of availability. One of the items is currently available, and so a partial shipment is made with that item stated as Shipped
. This occurs one more time when one of the products becomes available. The final shipment is a complete order shipment, requiring only one status update. The Shipped
status needs to be repeated for each partial shipment.
Updating Item Status
For Partial Shipments, use the request Update the Status of an Item on an Order and the following parameters:
SupplierId
- Supplier identifier, provided in Onboarding PackageOrderId
- Identifier for a Dropship order. For a list of values, seeorder-id
for each order after Accessing the Order FeedId
- SeeOrderId
aboveItemInformation
CatalogId
- From Accessing the Order Feed,item-information.catalog-id
Status
- StatusSku
- VendorSKU, as mentioned in Determine Product IdentifierInfo
- General information about the item(s), such as tracking site, additional reference info, etcMessage
- A reason for the status of an orderProductName
- Product nameQuantity
- Quantity shippedShippingProvider
- Shipping carrier for the orderTrackingInfo
- Tracking number for a shipped order
Example Request
PUT https://dropshiprc.iqmetrix.net/v1/Suppliers(14107)/Orders(0ff6f9f7-9e31-4039-8365-ff5471dbee7e)/ItemStatusUpdate
Authorization: Bearer b0k0dY70N3Vv9jR1b9oEdW9IeT5WIn85WCYFJRo6AiIKLEMBFwNbEQsfeCUeM3gdPA1gAAVxWTJacX8mJyBaGRcFVwQOEV49NgBz
Accept: application/json
Content-Type: application/json
{
"Id": "0ff6f9f7-9e31-4039-8365-ff5471dbee7e",
"ItemInformation": [
{
"Status": 6,
"Sku": "9101AGAP6",
"Info": "www.ups.com",
"Message": "",
"ProductName": "239234SMS L720 BLU SPT RTD8863",
"Quantity": 5,
"ShippingProvider": "UPS",
"TrackingInfo": "23923408863"
}
]
}
Example Response
HTTP 202 Content-Type: application/json
{
"Id": "0ff6f9f7-9e31-4039-8365-ff5471dbee7e",
"ItemInformation": [
{
"Sku": "9101AGAP6",
"CatalogId": "cec02f3f-22d7-4504-83a8-5afda2dfc1a0",
"Quantity": 1,
"Status": "PartiallyShipped",
"TrackingInfo": "23923408863",
"TrackingUrl": "https://wwwapps.ups.com/etracking/tracking.cgi?tracknum=23923408863",
"ShippingProvider": "UPS",
"ReferenceName": null,
"ReferenceValue": null,
"Info": "www.ups.com",
"Message": ""
}
]
}
Cancel an Order
Order cancellations require human interaction and are a manual process between a retailer and supplier to provide a refund to an end customer.
There are three possible scenarios when cancelling an order:
Supplier Cancels Order
Two concurrent processes occur when a supplier cancels an order.
First, they must communicate with their retailer’s support contact who handles orders and cancellations. It is assumed that suppliers will have the company’s support contact information and that all support-related inquiries are handled at the corporate level, rather than individual store locations.
Second, the supplier must update the Dropship item or order status to Cancelled
. This will notify iQmetrix to update records for the order.
Retailer Cancels Order
A supplier has the exclusive ability to cancel a Dropship order, as the retailer is unaware of the current status of the Dropship order at the supplier level (picked, packed or shipped).
This scenario follows the same process as a supplier cancelling an order.
Customer Cancels Order
Customers cannot cancel orders with a supplier, they must cancel with the retailer, who will contact the supplier to cancel the order.