Channel Advisor API Flows

How does it work ?

Basically

  1. Channel Advisor has a SKU record with lots of attributes
    1. One attribute is a Label (TAG) of the marketplaces it is live on - a single field with multiple comma delimited tabs
      1. 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.
    2. For each marketplace - there is attributes used for related prices - or the default is used
    3. The stock level available is shown on all marketplaces
      1. Distribution centres have stock levels - have two now (sydney and melbourne) - usually products are only in one warehouse so not a problem
      2. Amazon is an option but not used.
      3. Stock changes can be absolution or incremental etc.
  2. Stock levels are tracked by Channel Advisor as sales come in from the marketplaces
    1. Absolute re-setting of stock levels is required regularly
      1. To avoid the stock levels getting out of sync
    2. When stock levels move on products that may run out - may need to send an incremental stock adjustment
      1. ie - 7 sold via another channel
      2. Useful if orders coming in quickly and stock levels are low to avoid orders already in Channel Advisor but not yet in SaaS


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

  1. 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

  1. Create new SKU's - Create SKU WPF
  2. Update information on SKU's Create SKU WPF
  3. Delete SKU's Create SKU WPF

https://developer.channeladvisor.com/soap-api-documentation/code-samples/inventory-service-examples/synchinventoryitemlist-examples


Request

Code to syn inventory itemSaaSplications 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 Available Quantity WPF

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.

https://developer.channeladvisor.com/working-with-products/quantity/update-quantity-choose-update-type-multi-dc-update

Get Order List


We need to:

  1. 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
  2. Update orders with a tracking number Get Order AND update order WPF
  3. 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

https://developer.channeladvisor.com/working-with-orders/retrieve-orders/common-order-retrieval-methods 

Request Using visual studio.net

RequestSaaSplications 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