Channel Advisor API Flows
How does it work ?
Basically
- Channel Advisor has a SKU record with lots of attributes
- One attribute is a Label (TAG) of the marketplaces it is live on - a single field with multiple comma delimited tabs
- Labels trigger rules to put the product live on the marketplace nominated > BDirect made these rules and included the TAGS to manage the multiple marketplaces. no Label it is not live - label it is live.
- For each marketplace - there is attributes used for related prices - or the default is used
- The stock level available is shown on all marketplaces
- Distribution centres have stock levels - have two now (sydney and melbourne) - usually products are only in one warehouse so not a problem
- Amazon is an option but not used.
- Stock changes can be absolution or incremental etc.
- One attribute is a Label (TAG) of the marketplaces it is live on - a single field with multiple comma delimited tabs
- Stock levels are tracked by Channel Advisor as sales come in from the marketplaces
- Absolute re-setting of stock levels is required regularly
- To avoid the stock levels getting out of sync
- When stock levels move on products that may run out - may need to send an incremental stock adjustment
- ie - 7 sold via another channel
- Useful if orders coming in quickly and stock levels are low to avoid orders already in Channel Advisor but not yet in SaaS
- Absolute re-setting of stock levels is required regularly
This is the channel advisor API requirements
A typical integration https://developer.channeladvisor.com/a-typical-integration Note in this image all deals are tracked in channel advisor....
Deals are turned on in a marketplace when a Flag of the marketplace is added to the SKU.
Channel advisor flows
Labels (eBay, Amazon Seller Central - AU, etc ) - trigger a rule (signing of a template) to put the product live - until inventory reaches qty of 1 (or date) . Different rules can be setup
Listing can have multiple SKU's
- Templates >
SKus have multiple prices - on attributes - these are updated and then push to the marketplaces. Typically hold details for 9 days minimum.
Link to code details https://developer.channeladvisor.com/soap-api-documentation/code-samples/inventory-service-examples/synchinventoryitemlist-examples
API examples and code samples
https://developer.channeladvisor.com/soap-api-documentation/code-samples
SKU information
We need to
- Create new SKU's - Create SKU WPF
- Update information on SKU's Create SKU WPF
- Delete SKU's Create SKU WPF
Request
Code to syn inventory item | SaaSplications Field | |
---|---|---|
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="http://api.channeladvisor.com/webservices/"> | ||
<soapenv:Header> | ||
<web:APICredentials> | ||
<web:DeveloperKey>?</web:DeveloperKey> | host company > Channel advisor API > developer key | |
<web:Password>?</web:Password> | host company > Channel advisor API > password | |
</web:APICredentials> | host company > Channel advisor API > APICredentials | |
</soapenv:Header> | ||
<soapenv:Body> | ||
<web:SynchInventoryItemList> | ||
<web:accountID>?</web:accountID> | host company > Channel advisor API > AccountID | |
<web:itemList> | ||
<web:InventoryItemSubmit> | ||
<web:Sku>?</web:Sku> | SKU | |
<web:Title>?</web:Title> | SKU: Name | |
<web:Subtitle>?</web:Subtitle> | SKU: subtitle field (new field default on SKU EBAY only MAX55) | |
<web:ShortDescription>?</web:ShortDescription> | SKU: Short Description | |
<web:Description>?</web:Description> | SKU: Description | |
<web:Weight>?</web:Weight> | SKU: Shipping Carton Weight | |
<web:SupplierCode>?</web:SupplierCode> | SKU: Supplier code | |
<web:WarehouseLocation>?</web:WarehouseLocation> | ||
<web:TaxProductCode>?</web:TaxProductCode> | SKU: Price-GST | |
<web:FlagStyle>?</web:FlagStyle> | ||
<web:FlagDescription>?</web:FlagDescription> | ||
<web:IsBlocked>?</web:IsBlocked> | SKU: Shopping Cart Status = Hidden | |
<web:BlockComment>?</web:BlockComment> | "Hidden" if blocked | |
<web:ASIN>?</web:ASIN> | ||
<web:ISBN>?</web:ISBN> | ||
<web:UPC>?</web:UPC> | SKU: Barcode (if UPC) | |
<web:MPN>?</web:MPN> | SKU: SKU Code | |
<web:EAN>?</web:EAN> | SKU: Barcode (if EAN) | |
<web:Manufacturer>?</web:Manufacturer> | ||
<web:Brand>?</web:Brand> | SKU: Brand | |
<web:Condition>?</web:Condition> | SKU: New | |
<web:Warranty>?</web:Warranty> | SKY: Warrantee | |
<web:ProductMargin>?</web:ProductMargin> | Deal: Buy it now price - Av cost - Freight ($) | |
<web:SupplierPO>?</web:SupplierPO> | ||
<web:HarmonizedCode>?</web:HarmonizedCode> | SKU: HS Tariff code for international shipments (optional) | |
<web:Height>?</web:Height> | SKU: Height | |
<web:Length>?</web:Length> | SKU: Length | |
<web:Width>?</web:Width> | SKU: Width | |
<web:Classification>?</web:Classification> | SKU: Product Category | |
<web:DistributionCenterList> | ||
<web:DistributionCenterInfoSubmit> | ||
<web:DistributionCenterCode>?</web:DistributionCenterCode> | Warehouse: ID | |
<web:Quantity>?</web:Quantity> | SKU: Available Quantity in warehouse | |
<web:QuantityUpdateType>?</web:QuantityUpdateType> | "Absolute quantity" including unshipped orders for CA | |
<web:WarehouseLocation>?</web:WarehouseLocation> | ||
<web:ReceivedInInventory>?</web:ReceivedInInventory> | ||
<web:ShippingRateList> | ||
<web:ShippingRateInfo> | ||
<web:DestinationZoneName>?</web:DestinationZoneName> | Shipping Zone ID | |
<web:CarrierCode>?</web:CarrierCode> | Carrier Code | |
<web:ClassCode>?</web:ClassCode> | SKU: Carrier Class Code "Standard" | |
<web:FirstItemRate>?</web:FirstItemRate> | SKU: Carrier $ per item | |
<web:AdditionalItemRate>?</web:AdditionalItemRate> | SKU: Carrier $ per additional item | |
<web:FirstItemHandlingRate>?</web:FirstItemHandlingRate> | ||
<web:AdditionalItemHandlingRate>?</web:AdditionalItemHandlingRate> | ||
<web:FreeShippingIfBuyItNow>?</web:FreeShippingIfBuyItNow> | Deal: Free shipping if buy it now flag ? | |
<web:FirstItemRateAttribute>?</web:FirstItemRateAttribute> | ||
<web:FirstItemHandlingRateAttribute>?</web:FirstItemHandlingRateAttribute> | ||
<web:AdditionalItemRateAttribute>?</web:AdditionalItemRateAttribute> | ||
<web:AdditionalItemHandlingRateAttribute>?</web:AdditionalItemHandlingRateAttribute> | ||
</web:ShippingRateInfo> | ||
</web:ShippingRateList> | ||
</web:DistributionCenterInfoSubmit> | ||
</web:DistributionCenterList> | ||
<web:PriceInfo> | ||
<web:Cost>?</web:Cost> | ||
<web:RetailPrice>?</web:RetailPrice> | SKU: RRP | |
<web:StartingPrice>?</web:StartingPrice> | ||
<web:ReservePrice>?</web:ReservePrice> | ||
<web:TakeItPrice>?</web:TakeItPrice> | Deal: Buy it now price | |
<web:SecondChanceOfferPrice>?</web:SecondChanceOfferPrice> | ||
<web:StorePrice>?</web:StorePrice> | ||
</web:PriceInfo> | ||
<web:AttributeList> | ||
<web:AttributeInfo> | ||
<web:Name>?</web:Name> | SKU:Attribute name - used for by marketplace prices, multiple categories by marketplace, | |
<web:Value>?</web:Value> | SKU:Attribute value | |
</web:AttributeInfo> | ||
</web:AttributeList> | ||
<web:VariationInfo> | ||
<web:IsInRelationship>?</web:IsInRelationship> | SKU: group (yes/no) | |
<web:RelationshipName>?</web:RelationshipName> | SKU: Group Name | |
<web:IsParent>?</web:IsParent> | SKU: Is Group SKU | |
<web:ParentSku>?</web:ParentSku> | SKU: Group SKU | |
</web:VariationInfo> | ||
<web:StoreInfo> | ||
<web:DisplayInStore>?</web:DisplayInStore> | ||
<web:Title>?</web:Title> | ||
<web:Description>?</web:Description> | ||
<web:CategoryID>?</web:CategoryID> | ||
</web:StoreInfo> | ||
<web:ImageList> | ||
<web:ImageInfoSubmit> | ||
<web:PlacementName>?</web:PlacementName> | SKU: Image - Placement (eg itemimageURL1) | |
<web:FolderName>?</web:FolderName> | SKU: SKU | |
<web:FilenameOrUrl>?</web:FilenameOrUrl> | SKU:Image URL | |
</web:ImageInfoSubmit> | ||
</web:ImageList> | ||
<web:LabelList> | ||
<web:string>?</web:string> | Marketplaces to be sold on - set values | |
</web:LabelList> | ||
<web:MetaDescription>?</web:MetaDescription> | Set in system already | |
</web:InventoryItemSubmit> | ||
</web:itemList> | ||
</web:SynchInventoryItemList> | ||
</soapenv:Body> | ||
</soapenv:Envelope> </web:StoreInfo> |
Update Quantity Information using Absolute value
Update quantity information for all DC in a single request and set quantity to absolute value. This will be a triggered request for a number of SKU's in a data grid.
Get Order List
We need to:
- Get orders that need to be fulfilled (Export Orders) and we have not yet retrieved and mark the ones we have as exported already Get Order AND update order WPF
- Update orders with a tracking number Get Order AND update order WPF
- Ship Order, Cancel Order, Refund Order - all single order calls https://developer.channeladvisor.com/working-with-orders see Get Order AND update order WPF
https://developer.channeladvisor.com/soap-api-documentation/code-samples/orderservice-getorderlist
Request Using visual studio.net
Request | SaaSplications Field |
---|---|
using System; | |
using System.Collections.Generic; | |
using System.Text; | |
namespace WindowsApplication13 | |
{ | |
public class OrderRetriever | |
{ | |
public List<string> GetSkuList() | |
{ | |
// | |
// 1. For this sample to work you will need create a web reference in | |
// your VS.Net project by pointing to this URL: | |
// https://api.channeladvisor.com/ChannelAdvisorAPI/v6/InventoryService.asmx?wsdl | |
// Accept the default reference name of com.channeladvisor.api.OrderService | |
// | |
// 2. You will most likely need to change the namespace above (WindowsApplication13) to match | |
// your projects default namespace so that it can see the web reference. | |
// 3. Update the code to use your DeveloperKey, password, and AccountKey. | |
const string developerApiGuid = "MyDeveloperKey"; | |
const string password = "myPassword"; | |
const string sellerAccountGuid = "MyAccountKey"; | |
com.channeladvisor.api.OrderService orderService = new com.channeladvisor.api.OrderService(); | |
com.channeladvisor.api.APICredentials apiCredentials = new com.channeladvisor.api.APICredentials(); | |
apiCredentials.DeveloperKey = developerApiGuid; | |
apiCredentials.Password = password; | |
orderService.APICredentialsValue = apiCredentials; | |
com.channeladvisor.api.OrderCriteria orderCriteria = new com.channeladvisor.api.OrderCriteria(); | |
// Only grab items that are marked has Shipped | |
orderCriteria.ShippingStatusFilter = "Shipped"; | |
//Only grab orders created from Mar 17, 2013 to Mar 18, 2013 | |
orderCriteria.OrderCreationFilterBeginTimeGMT = new System.DateTime(2013, 3, 17); | |
orderCriteria.OrderCreationFilterEndTimeGMT = new DateTime(2013, 3, 18); | |
// Set other properties required by call | |
orderCriteria.DetailLevel = "High"; | |
orderCriteria.PageSize = 50; // Show 50 orders per page | |
orderCriteria.PageNumberFilter = 0; | |
List<string> skuList = new List<string>(); | |
bool moreResults = true; | |
// Call the API several times to retrieve a list of all matches | |
while (moreResults) | |
{ | |
orderCriteria.PageNumberFilter += 1; // Get the next page each time through the loop | |
com.channeladvisor.api.APIResultOfArrayOfOrderResponseItem orderResponse = orderService.GetOrderList(sellerAccountGuid, orderCriteria); | |
if (orderResponse.Status == com.channeladvisor.api.ResultStatus.Success) | |
{ | |
com.channeladvisor.api.OrderResponseItem[] orderResponseList = orderResponse.ResultData; | |
if (orderResponseList.Length == 0 || orderResponseList.Length < orderCriteria.PageSize) | |
{ | |
moreResults = false; | |
} | |
//step through each order in our returned array | |
foreach (com.channeladvisor.api.OrderResponseDetailHigh order in orderResponseList) | |
{ | |
System.Diagnostics.Debug.WriteLine("OrderID = " + order.OrderID.ToString()); | |
//step through each item in this Order | |
foreach (com.channeladvisor.api.OrderLineItemItem invoiceLine in order.ShoppingCart.LineItemSKUList) | |
{ | |
System.Diagnostics.Debug.WriteLine("LineItemID = " + invoiceLine.LineItemID.ToString()); | |
// Grab a list of all SKUs from invoices on this page | |
skuList.Add(invoiceLine.SKU); | |
} | |
//step through each Promo. | |
foreach (com.channeladvisor.api.OrderLineItemPromo promo in order.ShoppingCart.LineItemPromoList) | |
{ | |
System.Diagnostics.Debug.WriteLine(string.Format("Promo code of {0} had a value of {1}", promo.PromoCode, promo.UnitPrice)); | |
} | |
//step through each ItemInvoice in this Order. These are subtotal categories | |
foreach (com.channeladvisor.api.OrderLineItemInvoice line in order.ShoppingCart.LineItemInvoiceList) | |
{ | |
if (line.LineItemType == "Shipping") | |
{ | |
System.Diagnostics.Debug.WriteLine(string.Format("Shipping charge of {0}",line.UnitPrice)); | |
} | |
else if (line.LineItemType == "VATShipping") | |
{ | |
System.Diagnostics.Debug.WriteLine(string.Format("VAT Shipping charge of {0}", line.UnitPrice)); | |
} | |
else if (line.LineItemType == "SalesTax") | |
{ | |
System.Diagnostics.Debug.WriteLine(string.Format("Sales Tax charge of {0}", line.UnitPrice)); | |
} | |
else if (line.LineItemType == "ShippingInsurance") | |
{ | |
System.Diagnostics.Debug.WriteLine(string.Format("Shipping Insurance charge of {0}", line.UnitPrice)); | |
} | |
else | |
{ | |
System.Diagnostics.Debug.WriteLine("Unexpected line type of " + line.LineItemType); | |
} | |
} | |
} | |
} | |
else | |
{ | |
int errorCode = orderResponse.MessageCode; | |
string errorMessage = orderResponse.Message; | |
System.Diagnostics.Debug.WriteLine(string.Format("An unexpected error occured. ErrorCode={0}, ErrorMessage={1}", errorCode, errorMessage)); | |
} | |
} | |
return skuList; | |
} | |
} | |
} | |
Python | |
from suds.client import Client | |
import logging | |
| |
logging.basicConfig(level=logging.INFO) | |
logging.getLogger('suds.client').setLevel(logging.DEBUG) | |
| |
# Specify Login Information | |
developer_key = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' | |
password = 'xxxxxxxx' | |
account_guid = 'xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx' | |
| |
# Specify URLs | |
wsdl_url = 'https://api.channeladvisor.com/ChannelAdvisorAPI/v6/OrderService.asmx?WSDL' | |
service_url = 'https://api.channeladvisor.com/ChannelAdvisorAPI/v6/OrderService.asmx' | |
| |
# Initialize client. | |
client = Client(wsdl_url, location = service_url) | |
| |
login = client.factory.create('APICredentials') | |
login.DeveloperKey = developer_key | |
login.Password = password | |
client.set_options(soapheaders=login) | |
| |
# Instantiate our GetOrderList Object | |
getOrderList = client.factory.create('GetOrderList') | |
getOrderList.orderCriteria.OrderCreationFilterBeginTimeGMT = '2000-01-01T00:00:00' | |
getOrderList.orderCriteria.OrderCreationFilterEndTimeGMT = '2012-09-05T00:00:00' | |
getOrderList.orderCriteria.StatusUpdateFilterBeginTimeGMT = None | |
getOrderList.orderCriteria.StatusUpdateFilterEndTimeGMT = None | |
getOrderList.orderCriteria.JoinDateFiltersWithOr = None | |
getOrderList.orderCriteria.DetailLevel = 'High' | |
getOrderList.orderCriteria.ExportState = None | |
getOrderList.orderCriteria.OrderIDList = None | |
getOrderList.orderCriteria.ClientOrderIdentifierList = None | |
getOrderList.orderCriteria.OrderStateFilter = 'Active' | |
getOrderList.orderCriteria.PaymentStatusFilter = 'Cleared' | |
getOrderList.orderCriteria.CheckoutStatusFilter = 'Completed' | |
getOrderList.orderCriteria.ShippingStatusFilter = 'Unshipped' | |
getOrderList.orderCriteria.RefundStatusFilter = None | |
getOrderList.orderCriteria.DistributionCenterCode = None | |
getOrderList.orderCriteria.PageSize = 20 | |
getOrderList.orderCriteria.PageNumberFilter = 1 | |
| |
continueRequests = True | |
while continueRequests is True: | |
print 'Page', getOrderList.orderCriteria.PageNumberFilter | |
result = client.service.GetOrderList(account_guid, getOrderList.orderCriteria) | |
| |
ordersInResult = len(result.ResultData.OrderResponseItem) | |
print ' Orders In Page:', ordersInResult | |
| |
for order in result.ResultData.OrderResponseItem: | |
print ' ', order.OrderID | |
if ordersInResult < 20: | |
continueRequests = False | |
else: | |
getOrderList.orderCriteria.PageNumberFilter += 1 |
Result
SaaSplications field | |
---|---|
<?xml version="1.0" encoding="UTF-8"?> | |
<SOAP-ENV:Envelope xmlns:tns="http://api.channeladvisor.com/webservices/" xmlns:ns0="http://api.channeladvisor.com/webservices/" xmlns:ns1="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns2="http://api.channeladvisor.com/datacontracts/orders" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> | |
<SOAP-ENV:Header> | |
<tns:APICredentials> | |
<tns:DeveloperKey>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</tns:DeveloperKey> | |
<tns:Password>xxxxxxxx</tns:Password> | |
</tns:APICredentials> | |
</SOAP-ENV:Header> | |
<ns1:Body> | |
<ns0:GetOrderList> | |
<ns0:accountID>xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx</ns0:accountID> | |
<ns0:orderCriteria> | |
<ns2:OrderCreationFilterBeginTimeGMT>2000-01-01T00:00:00</ns2:OrderCreationFilterBeginTimeGMT> | |
<ns2:OrderCreationFilterEndTimeGMT>2012-09-05T00:00:00</ns2:OrderCreationFilterEndTimeGMT> | |
<ns2:StatusUpdateFilterBeginTimeGMT xsi:nil="true"/> | |
<ns2:StatusUpdateFilterEndTimeGMT xsi:nil="true"/> | |
<ns2:JoinDateFiltersWithOr xsi:nil="true"/> | |
<ns2:DetailLevel>High</ns2:DetailLevel> | |
<ns2:OrderStateFilter>Active</ns2:OrderStateFilter> | |
<ns2:PaymentStatusFilter>Cleared</ns2:PaymentStatusFilter> | |
<ns2:CheckoutStatusFilter>Completed</ns2:CheckoutStatusFilter> | |
<ns2:ShippingStatusFilter>Unshipped</ns2:ShippingStatusFilter> | |
<ns2:PageNumberFilter>1</ns2:PageNumberFilter> | |
<ns2:PageSize>20</ns2:PageSize> | |
</ns0:orderCriteria> | |
</ns0:GetOrderList> | |
</ns1:Body> | |
</SOAP-ENV:Envelope> |
Create a new Fulfillment
Used to indicate shipping numbers AND mark as shipped at same time Get Order AND update order WPF
May need to split an order into individual fulfillments
https://developer.channeladvisor.com/working-with-orders/fulfillments/create-a-new-fulfillment