Multiple Pricing Channels

Some retailers sell their products via multiple channels or outlets, each with different pricing logic and constraints.

A prime example of multiple retail channels is a retailer that sells the same inventory both online via an eCommerce store and offline in a physical location.

Another such example is a retailer that sells its inventory online with locale-specific pricing logic and constraints based on the geographic location of the end-user. In this example a retailer might have an EU pricing channel for EU-based users, and a US pricing channel for USA-based users.

In QL parlance a support for retailers with multiple pricing channels is called Omni-Channels. Please contact our Customer Success team if you want to enable support for multiple pricing channels on your account.

SDK events in omni-channel capable systems

If the omni-channel support is already setup and enabled on your QL account, then using the SDK to send us views and conversions from your online store only requires you to add another parameter to the SDK event arguments object.

The examples below are based on the Basic integration example, with server-side code written in Ruby. You may adapt it to your use-case and backend stack.

Product Page

app/controllers/products_controller.rb

class ProductsController < ApplicationController
  
  # GET /products/:id - renders product page
  def show
    @product = Product.find(params[:id]) # find product in DB
    # set view variables for SDK
    @productId = @product.ean # use the product's ean as the productId variable
    @shelfPrice = @product.shelfPrice
    @clientKey = 'myvirtualstore'
    @channels = ['online'] # pricing channels associated with this product
    
    render('show') # explicit call to render the product page view
  end
  
end

app/views/products/show.erb

<div>
  <h1><%= @product.name %></h1>
  <!-- rest of HTML is redacted for simplicity --> 
</div>
<!-- ADD QL's SDK at the bottom of the page template -->
<script>
  window.QLAsync = function(QL){
    var clientKey  = '<%= @clientKey %>',
        productId  = '<%= @productId %>',
        shelfPrice = '<%= @shelfPrice %>',
        channels = <%= @channels.to_json.html_safe %>,
        permalink = '<%= product_url(@product.id) %>'; // product_url is a function provided by Rails to get the product's permalink
    QL.init(clientKey);
    QL.sendProductEvent(productId, {
      price: parseFloat(shelfPrice, 10),
      permalink: permalink,
      channels: channels
    });
  }
</script>
<script src="//d3jdlwnuo8nsnr.cloudfront.net/sdk/v3.0/ql.js"></script>

Payment Confirmation Page

app/controllers/checkout_controller.rb

class CheckoutController < ApplicationController
 
  # GET /checkout/finish - renders successful checkout
  def finish
    id = session[:productId] # read checked-out product id from session
    @product = Product.find(id) # find product in DB
    # set view variables for SDK
    @productId = @product.ean
    @salePrice = session[:salePrice] #read product sale price from session
    @clientKey = 'myvirtualstore'
    @channel = 'online' # pricing channel associated with this purchase
    
    render('finish') # explicit call to render the payment confirmation view
  end
 
end

app/views/checkout/finish.erb

<div>
  <p>Your payment has been received!</p>
  <!-- rest of HTML is redacted for simplicity --> 
</div>
<!-- ADD QL's SDK at the bottom of the page template -->
<script>
  window.QLAsync = function(QL){
    var clientKey  = '<%= @clientKey %>',
        channel  = '<%= @channel %>',
        productId  = '<%= @productId %>',
        salePrice  = '<%= @salePrice %>';
    QL.init(clientKey);
    QL.sendConfirmationEvent(productId, {
      price: parseFloat(salePrice, 10),
      channel: channel
    });
  }
</script>
<script src="//d3jdlwnuo8nsnr.cloudfront.net/sdk/v3.0/ql.js"></script>

Channels vs. Channel - Views vs. Conversions

You will note that the SDK sendProductEvent function accepts an array of pricing channels, while the sendConfirmationEvent accepts a single pricing channel.

This is intentional and merits extra care and attention.

It's quite possible that one or more of your pricing channels are not directly connected to the SDK. For example, a physical store or a legacy mobile application.

If (and only if) you want to use product page views from one pricing channel in another pricing channel (like online vs. physical stores) you may pass a list all the pricing channels that should be associated with a particular product page view. Otherwise, you should only pass the relevant (current) pricing channel the product page view is associated with.

Conversion events are different - A sale in your online store, is not the same as a sale in your physical store. For that reason, the sendConfirmationEvent only accepts a single channel parameter, rather than a list.