WCS 8 is here!

It’s  a long time since I don’t update this blog, but now I put my hands in the brand new WCS 8!! With a lot of cool features!!

In the next couple of weeks, I will start to bring the new features and cool tricks of WCS!

For now, just a snack: Widget Library in Layout Composer!!

Widgets in WCS 8

Widgets in WCS 8

“Ribbon Ad” attribute property!

WCS and Attributes 2!

In the first post of this blog, I talked about the power of attributes in WCS and how business users can take advantage of this feature to transform a category page in a product self service system. You can check this here.

With the brand new FEP 7, business users won a powerful new way to use the attributes, it is the “Use as ribbon ad” property.

wcs Attribute propeties

wcs Attribute properties

*Notice that the old Facetable was renamed to “Use in faceted navigation”, Searchable to “Searchable in storefront” and “Use In merchandising” from FEP 6 is still there.

Now imagine the following scenario: Your store closes an exclusivity deal with an industry, and you will be the only reseller of a specific product.

Or your store will be making a presale of a tablet. Imagine you’d be able to inform that to the shopper in the vitrine display, in your category page or inside a e-marketing spot. Now this is possible with this new property “Use as ribbon ad”.

Check how it looks like:

WCS presale ribbon ad

WCS presale ribbon ad

WCS Exclusive Ribbon Ad

WCS Exclusive Ribbon Ad

Creating this nice effect is a piece of cake, you just have to follow these steps:

How to

  1. Access the Management Center, Catalog tool.
  2. Chose your Asset store.
  3. Search for the product.
  4. Go to the Descriptive attribute tab, in the product properties.
  5. Create a new attribute, or pick an already existing one.
  6. Define the attribute value to this product.
  7. Double click at the attribute, and flag the “Use as ribbon ad” checkbox.
  8. Wait for the next index build and “voilà”!

I showcased the 2 examples: Presale and exclusive, but we can use this cool feature to:

  • Advertise a promotion.
  • Advertise a special payment condition
  • Highlight a specific property like a brand.
  • Put a “New” stamp in the recent arrived products.
  • Put a “Last items” stamp
  • Put a “special sizes” stamps in clothes with special sizes.
  • Whatever else your e-commerce needs.

Hope you liked this new feature, and if you have any questions, please let me know, or leave a comment!

Source: http://pic.dhe.ibm.com/infocenter/wchelp/v7r0m0/topic/com.ibm.commerce.management-center.doc/concepts/cpnribbonad.htm

WCS and Attributes links:

Unleash the power of attributes: http://blog.bazilio.me/wcs-attributes

WCS Attribute Ribbon Property: http://blog.bazilio.me/wcs-attribute-ribbon

FEP 7 – e-commerce in a state of art!

I can’t deny how excited I am with the new features from FEP 7.

This next weeks will  be full of work writing about it. It so many features such as Page Composer, Page Layout, Product Ranking, Integration with comment system, Ribbon text, Attributes, Recursive Pages, New Preview, Widgets and others that I don’t now which one to choose.

For now, a sneak peek from the new aurora site,  and some CMC screens, that are incredible amazing!

mobilepreviewfep7 FEP7CMC




WCS and mobile SEO

WCS and mobile SEO

Search Engine Optimization nowadays is definitively something that we have to care about. In a recent implementation of WCS, we were able to bring the search engine results for a Brazilian retailer from the twentieth to the first page in google’s organic searches.

As we know, since FEP 3,  WCS bring some features that help with Search Engine Optimization issues.

Out of the box, we have some  cool features like:

Simple URLs:

With that, we can easily  replace “webapp/wcs/stores/servlet” by a token, like “shop”.


Improvements like Page title, Meta description, Meta Keywords (Keywords have no influence in page ranking) and Image alt text. Automatically added by the template or managed by the business user through Management Center.


Site map generation by WebSphere Commerce job.

Url Keywords

Product, category and static pages keywords URL, managed by the business user in the Management Center.

Extended Site support.

If an extended site demands a different keyword for a product or a category, the business user can change this keyword in the store.

If the business user did not set any specific keyword to this specific extended site, the keyword from the CAS (catalog asset store) is imported.


Automatically 301 redirects for changed URLs.

If a business user change a product or a category keyword, the old URL still works with 301 redirect, avoiding score problems with index engines.

Better 404 error handling.

The ability to forward customers that landed in a nonexistent page to the home page (default) or a search page for example.

Canonical URL

As we know, web sites loses score when they have multiple URLs to the same content. With the ability to define the canonical URL, the search engine bots understand that all URLs should be mapped to a single (canonical) URL.

All these features are OK when we are talking about desktop, but there are several things that we have to keep in mind when we talk about mobile.

Building Smartphone-Optimized Websites

Tablets are not Mobile – According to google, Tablets users expect to see tablet optimized pages, or desktop-optimized pages, due to some reasons, such as the large screen. So, if you are developing a mobile page for your site, do not redirect tablet traffic to this new store, unless your entire site is responsive.
Source: https://developers.google.com/webmasters/smartphone-sites/tablets

Strategy – We have 3 different ways to build specific (mobile / tablet) contents for our website. Some require more, some require less effort.

Responsive: Serves the same HTML for one URL and uses CSS media queries to determine how the content is rendered on the client side. This removes the possible glitches of user-agent detection and frees users from redirects. This method does not require different sitemaps, or extra attention with canonical URL. This is the recommended approach by Google, but can be a challenge in terms of code.

According to the official announcement for WCS FEP 7, the Starter store will come with a responsive design.

Dynamic serving: serves different HTML for an URL depending on the user-agent. Use the Vary HTTP header to indicate you’re doing this. This method does not require different sitemaps, or extra attention with canonical URL.

To manage that in WCS, my suggestion is to use struts, to create device groups (User agent groups), and route these groups to the correct view.


Device group creation in wc-devices.xml:

<_config:DeviceGroup impl="com.ibm.commerce.foundation.server.services.httpdevice.CookieDeviceGroupImpl" keyName="WC_MOBILEDEVICEID">
<_config:Device name="Forced Desktop" value="0" internalID="-1" channelID="-1"/>
<_config:Device name="Forced Smartphone" value="1" internalID="-21" channelID="-6"/>
<_config:Device name="Forced Tablet" value="2" internalID="-31" channelID="-6"/>

Source: http://pic.dhe.ibm.com/infocenter/wchelp/v7r0m0/topic/com.ibm.commerce.webservices.doc/tutorial/twv_devdetectionpdatedevicesxml.htm

Creating the detection and redirects to specific views and JSP’s

<forward className="com.ibm.commerce.struts.ECActionForward" name="GenericProductPageLayoutView/10101" path="/Layouts/ProductDisplay.jsp"/>
<forward className="com.ibm.commerce.struts.ECActionForward" name="GenericProductPageLayoutView/10101/-21" path="/mobile20/ShoppingArea/CatalogSection/CatalogEntrySubsection/ProductDisplay.jsp"/>

<action path="/GenericProductPageLayoutView" type="com.fastshop.commerce.action.ExtendedBaseAction">
<set-property property="credentialsAccepted" value="10101:P"/>

Source: http://pic.dhe.ibm.com/infocenter/wchelp/v7r0m0/topic/com.ibm.commerce.webservices.doc/tutorial/twv_devicedetection1.htm


Separate mobile site: redirects users to a different URL depending on the user-agent. Use bidirectional link annotations to indicate the relationship between the two URLs for search engines. Requires a specific sitemap, and an extra attention with canonical URL tag.

In this approach, my suggestion is that we have to check if all keywords point to the same page. For example, “m.domain.com/ProductA“, should point to the same product / content (in the mobile version) of “www.domain.com/ProdctA“. We lose score if we do not do that. We should also avoid multiple keywords for the same page.

How to redirect pages

How to redirect pages

How to not redirect pages

How to not redirect pages

We should also guarantee that in our desktop pages, we will insert the special link rel=”alternate” tag pointing to the corresponding mobile URL. This helps Googlebot discover the location of your site’s mobile pages. The Sitemap will also help with this.

Likewise, to avoid losing points by duplicated contents, our mobile pages should have the link rel=”canonical” tag pointing to the corresponding desktop URL.

Defined the strategy, we should guarantee some points, that will help us increase our score with search engines:

Canonical URL’s.

When we have multiple URL’s to the same content, or product page, we lose score in the search engines. The way to avoid this is using the Canonical Tag.

This tag will tell the bots to identify what is the “canonical” or “preferred” version of the page.

According to Google, the canonical link element is not considered to be a directive, but a hint that the web crawler will “honor strongly”. So, the best thing to do is avoid multiple URL to the same page / content as much as possible, even using the canonical tag.

URL Parameters are indexed!

Instead of what most of people think, search engines care about and index the URL variables. If you have all canonical tags defined, this should not be a problem. But anyway, I recommend that we set all variables our page have to not be indexed in the Webmaster Tools.

Source: https://support.google.com/webmasters/answer/1235687?hl=en

Besides all these rules, my recommendation for mobile pages is: Be SoLoMo!

SoLoMo is the acronym to Social + Local + Mobile., so, you are developing your mobile store now, keep that in mind. People use mobile devices because this is fun, doesn’t matter if they are, or aren’t at home. They want to have a good time; Then, create something funny, relaxing and integrated with all social medias, location services etc. In the mobile device, an app notification is enough to remove the user attention from your store.

Keep your Telesales number accessible every time. If the customer for any reason don’t close an order on your site, they can “click” in your number and buy by phone. This is Omni channel!

Be social, integrate your pages with Pinterest, Facebook, Twitter etc.

Create a mobile APP, use worklight for this!

If you have any question, please let me know! Leave a comment!



A few days ago, IBM release an announcement with some of the new WCS FEP 7 Features.

Take a look at:


Some of the features I particularly liked:

Starter store responsive design: New responsive design techniques help enable business users quickly and easily create and manage mobile-optimized and tablet-optimized stores. WebSphere Commerce recognizes the type and size of the device the visitor is using and automatically optimizes and delivers content for that device. With responsive design, business users no longer have to manage individual stores for each device type. Responsive design helps:

  • Optimize the browsing experience in Aurora starter stores by leveraging responsive web design across devices with different screen sizes.
  • Lower the implementation cost by providing sample hybrid web applications for mobile phones and tablets, with responsive web content in WebSphere Commerce and mobile application management in IBM Worklight®.

Web Content Manager integration: With Web Content Manager integration, marketers and merchandisers can more quickly and easily create and manage content and incorporate content into a store for an improved customer experience. Web Content Manager gives Management Center users the ability to manage all WebSphere Commerce content within an integrated content management system. It provides users with rich text editing tools, content workflow, multilingual support, and content pre-rendering support. The prebuilt integration uses a punch-out mechanism to give Management Center users direct access to the Web Content Manager user interface for content editing.

Which features did you like? Leave a comment!


WCS Tip: Content carousel in any spot.

In this post we will show the power of E-Marketing spots. With a small knowledge in JS coding, we can produce a carousel in any spot, to rotate your contents, and obtain results like this:

carrousselTo do this, we must follow 3 basic steps:

  1. Enable cross-site scripting in spots
  2. Upload the jQuery lib to an accessible path in your domain.
  3. Create the content carousel and associate it to the spot.

1 – Enable Cross-Site scripting is spots.

By default, cross-site scripting is disabled in WCS. To enable this, we just have to change a property in the wc-server.xml file. This change allows uscreating advanced HTML and JS code inside spots. If you are in a production environment, ask your System Administrator to follow the steps from Infocenter:


If you are in your local environment, just change a wc-server.xml line:

<PasswordProtectedCmds display="false" enabled="true" retries="3"/>


<PasswordProtectedCmds display="false" enabled="false" retries="3"/>

Restart the server and you will be able to start coding inside the spots.


2 – Upload the jQuery lib to an accessible path in your domain.

To use the code template I provided below, we need to load the jQuery lib.

You can download it from here:


After downloading it, just use the asset tool to upload your jQuery lib to any valid path. This jQuery must be in a valid URL, accessible from your browser.

3 – Create the content carousel and associate it to the spot.

To make this simple carousel, I created the following (sample) code:

Content switcher code  (quoted at the end of the post)


  • <script type=”text/javascript” src=”http://localhost/webapp/wcs/preview/Aurora/jquery-1.9.1.min.js”></script>

Must be replaced for the full qualified path for the jQuery lib.

  • prefix_spot : ‘ContentAreaESpotImg_MenRow1_Content_’, //spot prefix

Must be replaced by the ID of the spot that you want the carousel in.

But how do I get my spot’s id?

That’s very simple. With Google Chrome Inspector opened, just look for the spot you want, and copy the ID. Don’t forget to “delete” the Content_X, this way, you can put as many contents as you want in the carousel.

spotidAfter competing the code changes with your jQuery Lib and your Spot’s ID, create a new content, and paste the code inside it. Don’t forget to mark it as HTML code.

carrousselcontentOnce your content is saved, just drag and drop it to the Web Activity’s “Recommend Content” action, in the last position.

draganddropscriptPut as many contents as you want, and the script will automatically make the carroussel.

multipleNote that you can also change the position and time between frame displays by editing the following values:

  • PlayerHome.container.setAttribute(‘style’, ‘position:relative;width:710px;height:351px;’);
  • container.setAttribute(‘style’, ‘position:absolute;right:6px;top:320px;’);
  • player_interval : 5, //in seconds 

If you have any questions or doubts, please, feel free to contact me or leave a comment.

Following the code quoted: (by facebook.com//terravilor)


<script type="text/javascript" src="http://localhost/webapp/wcs/preview/Aurora/jquery-1.9.1.min.js"></script>
<script type="text/javascript">
var PlayerHome = {
prefix_spot : 'ContentAreaESpotImg_MenRow1_Content_', //spot prefix
player_interval : 5, //in seconds
contents : Array(),
curr_spot : 0,
container : null,
interval : 0,
initPlayer : function() {
getInstances : function() {
var i = 1;
while (LibUtils.isInDocument(document.getElementById(PlayerHome.prefix_spot + i))) {
PlayerHome.contents.push(document.getElementById(PlayerHome.prefix_spot + i));

initNav : function() {
for (var i = 0; i < PlayerHome.contents.length; i++) {
var el = PlayerHome.contents[i];
el.style.position = 'absolute';
el.style.top = '0';
el.style.left = '0';
el.style.display = 'none';

var nav = document.getElementById('button_player_' + i);
if (i == PlayerHome.curr_spot) {
LibUtils.addClass(el, 'active');
LibUtils.addClass(nav, 'active');
nav.style.background = '#4a6580';
} else {
LibUtils.removeClass(el, 'active');
LibUtils.removeClass(nav, 'active');
nav.style.background = '#b2b2b2';

createNavPlayer : function() {
var item = PlayerHome.contents[0];
var par = item.parentNode;
PlayerHome.container = par.parentNode;
PlayerHome.container.setAttribute('style', 'position:relative;width:710px;height:351px;');

//cria o player
if (PlayerHome.contents.length > 1) {
//eventos do timer
LibUtils.addEventListener(PlayerHome.container, 'mouseover', PlayerHome.onOverContainer);
LibUtils.addEventListener(PlayerHome.container, 'mouseout', PlayerHome.onOutContainer);
window.onfocus = function (event){ PlayerHome.handleFocus(event) };
window.onblur = function (event){ PlayerHome.handleFocus(event) };

var container = document.createElement('div');
container.setAttribute('style', 'position:absolute;right:6px;top:320px;');
for(var i = 0; i < PlayerHome.contents.length; i++) {
var link = document.createElement('a');
link.setAttribute('id', 'button_player_' + i);
link.setAttribute('href', i);
link.setAttribute('style', 'border-radius:50%;width:13px;height:13px;background:#b2b2b2;display:block;float:left;margin-right:5px;');
LibUtils.addEventListener(link, 'click', PlayerHome.handleClick);
LibUtils.addEventListener(link, 'mouseover', PlayerHome.onOverPlayer);
LibUtils.addEventListener(link, 'mouseout', PlayerHome.onOutPlayer);

PlayerHome.interval = setInterval(PlayerHome.handleInterval, PlayerHome.player_interval * 1000);
hideOthers : function() {
for (var i = 0; i < PlayerHome.contents.length; i++) {
var el = PlayerHome.contents[i];
handleClick : function(e) {

var evt = e || window.event;
var el = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
var activate = el.getAttribute('href');

PlayerHome.curr_spot = activate;
onOverPlayer : function(e) {

var evt = e || window.event;
var el = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
el.style.background = '#4a6580';
onOutPlayer : function(e) {

var evt = e || window.event;
var el = (evt.currentTarget) ? evt.currentTarget : evt.srcElement;
if (!LibUtils.hasClass(el, 'active')) el.style.background = '#b2b2b2';
handleInterval : function() {
if (PlayerHome.curr_spot > PlayerHome.contents.length - 1) PlayerHome.curr_spot = 0;

onOverContainer : function(evt) {
onOutContainer : function(evt) {
PlayerHome.interval = setInterval(PlayerHome.handleInterval, PlayerHome.player_interval * 1000);
handleFocus : function(evt) {
if (evt.type == 'blur') {
} else {
if (PlayerHome.contents.length > 1) PlayerHome.interval = setInterval(PlayerHome.handleInterval, PlayerHome.player_interval * 1000);

var LibUtils = {
isInDocument : function(el) {
var html = document.body.parentNode;

while (el) {
if (el === html) {
return true;
el = el.parentNode;

return false;
hasClass : function(el, name) {
return new RegExp('(\\s|^)' + name + '(\\s|$)').test(el.className);
addClass : function(el, name) {
if (!LibUtils.hasClass(el, name)) { el.className += (el.className ? ' ' : '') +name; }
removeClass : function(el, name) {
if (LibUtils.hasClass(el, name)) {
el.className = el.className.replace(new RegExp('(\\s|^)' + name + '(\\s|$)'),' ').replace(/^\s+|\s+$/g, '');
addEventListener : function (html_element, event_name, event_function) {
if(html_element.attachEvent) { //IE
html_element.attachEvent("on" + event_name, function() {event_function.call(html_element);});
} else if(html_element.addEventListener) { //outros
html_element.addEventListener(event_name, event_function, false);
cancelDefaultEvent : function(e) {
var evt = e || window.event;

if (evt.preventDefault) {
} else {
evt.cancelBubble = true;
evt.returnValue = false;
fade : function(el) {
var op = 1;

if (!LibUtils.hasClass(el, 'active')) {
var timer = setInterval(function () {
if (op <= 0.1){
el.style.display = 'none';
el.style.opacity = op;
el.style.filter = 'alpha(opacity=' + op * 100 + ")";
op -= op * 0.1;
}, 10);
} else if (LibUtils.hasClass(el, 'active')) {
el.style.display = 'block';

var op = 0.1;
var timer = setInterval(function () {
if (op >= 1.0){
el.style.opacity = op;
el.style.filter = 'alpha(opacity=' + op * 100 + ")";
op += op * 0.1;
}, 5);


WCS FEP 6 new features – Spot Title

After a while without any posts, due to a complex project delivery, I will start to write again about an exciting topic. FEP 6 new features.

In this first post, we will start with a very simple feature that wasn’t in the business user control in FEP 5, and has a huge business value to the website.

The “E-Marketing Spot Title”.

e-marketingspottitleSimple as the name suggest, this feature allows the business user to provide a specific “title” for any E-Marketing spot he desires, through a web activity.

The effect of this is really nice, specially because we can use an asset as title, an HTML (to do something more elaborate) or a simple text edited by the WYSIWYG editor.

Lets choose as an example this spot from Aurora starter store, as default, it has the “New this Week” title.

spot Using the new preview (We will talk about these exciting new features from preview in a next post), we can see all related information of the E-Marketing Spot.spot preview

Then we have:

Title: HomeRow2_CatEntries

Type: Catalog entry spot.

Web Activity: HomeRow2_CatEntries

spot detailsClicking on “EDIT” the WebActivity, we see a simple “Recommend Catalog Entry” action.

To insert the title we desire, we have to drag and drop the action “E-Marketing Spot Title” before the content recommendation. Remember that in order to do this, you have to deactivate the Web Activity.

drag and drop actionAfter this, we have to create a new content or use an existing one to set as the Spot Title. Remember that we can use Assets or HTML, but for this example, lets create a simple title using the editor.


newtitleSave your content with your new title, and drag and drop it to the action area.

dragnewtitleSave and activate your Webactivity.  Use the preview to see the results.
It should look like this:

finalresultIf you have any questions regarding how to use any feature from WCS, please, feel free to post a comment!






Taking WCS to the edge with Akamai (Or other CDN solution)

First of all, you should be asking yourself what a CDN is?

CDN means Content delivery network, and it is a  is a large distributed system of servers deployed in multiple data centers across the internet. The goal of a CDN is to serve content to end-users with high availability and high performance.

This contents are all sort of static contents you may have in your store, like  .CSS, . HTML Files, .JS Scripts  all medias (Images, movies, flashes, documents) and etc.

Instead of having all users downloading these static files from your servers, in a CDN these files are propagated to servers across the globe, and users can download it from the best available server, granting  high availability and high performance to our store.

File:NCDN - CDN.png

The main benefits to our business are:

  • SEO – Since Google announced that site speed affects the page rank, have a fast site is mandatory to business. Better page rank means more exposition, more exposition means more conversion, and conversion means revenue.
  • Best Content Delivery – Since CDNs place servers as close to a group of users as possible, latency and packet loss are minimized due to a shorter distance traveled. Theoretically, the closer the content is to the user, the faster the delivery. Therefore, users will experience less jitter when streaming, fewer network spikes, and an overall improved streaming quality. Due to the reliability, operators can deliver high quality content with a high level of service, low network server loads, and thus, lower costs. Additionally, many CDN providers offer TCP acceleration technology which boosts performance, thus improving user experience. Since CDNs decrease latency, the acceleration working in conjunction with an already high-performing network results in explosive content.
  • 100% Availability – (For static assets on Akamai)Due to the distribution of assets across many regions, CDNs have automatic server availability sensing mechanisms with instant user redirection. As a result, CDN websites experience 100% availability, even during massive power outages, hardware issues or network problems.
  • Analytcs – Another beneficial feature of CDN technology is that more control of asset delivery and network load is awarded. Operators have the ability to deliver real-time load statistics, optimize capacity per customer, display active regions, indicate which assets are popular, and report viewing details to their customers. These details are extremely important, since usage logs are deactivated once the server source has been added to the CDN.
  • E-Commerce Overall performance booster – Our site will have best exposition in search engines, will open faster and have a better availability. All these items combined will reflect in more traffic and more orders.

Now that we know what CDN is, how do we setup and integrate a our Aurora Store with a  CDN service?

In this post, we will use as example Akamai, that is very popular CDN provider on the marketing.

Default Behavior:

As we know, by default, in Aurora Starter Store when a business user uploads an attachment asset file, the file is initially copied to the WebSphere Commerce database. When certain criteria are met, the attachment asset file is copied from the WebSphere Commerce database to the WebSphere Commerce EAR file.

Until the attachment asset is available in the WebSphere Commerce EAR file (Copied every 30 minutes)., you can view the attachment file only in a store page using the preview function in WebSphere Commerce Accelerator.

Expected Behavior:

To use Akamai, all assets should be stored in a  static HTTP server (IHS Prefered), and to do that, we have to:

 1 – Override the implementation in CMDREG table, to FileSystemCopy.

  • FileSystemCopy
     update cmdreg set className='com.ibm.commerce.wc.appmanagement.commands.UpdateStaticEARContentUsingFileSystemCmdImpl' where interfaceName='com.ibm.commerce.wc.appmanagement.commands.UpdateStaticEARContentCmd';

2 – FileSystem.xml – We have to edit this file, located in the “WC/xml/config” directory. In this file we have to pint where the assets will be copied.

  • proceedOnlyWhenAllServersAreWorkingSet –  Set this value to false. This attribute is only applicable to the root element of FTP servers.
  • FSLocation – A local directory on the WebSphere Commerce system which is mapped or mounted to a remote directory on the Web server system.
<FSLocations xmlns="http://www.ibm.com/xmlns/prod/WebSphereCommerce" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.ibm.com/xmlns/prod/WebSphereCommerce xsd/FileSystem.xsd" proceedOnlyWhenAllServersAreWorking="false">

<FSLocation dir="/temp/filehold"/>


3 – Schedule ScheduledContentManagedFileEarUpdate (Commerce Scheduled Job) to run every 15 minutes only on dedicated staging appserver.

4 – Schedule Shell scripts jobs to copy the  files and folders created by the business user, from this folder in the app server to our webserver. This script can use rsync or other technology. You may also allow the app to save the asset directly on the web server, mounting a folder with NFS, but I don’t like this solution.

*We can define type of files that will be copied in the UpdateEARFilter.properties file.


Reviewing, now, we have the following scenario.



  1. Business user uploads assets and have created specific folder structure in the asset toll, inside CMC.
  2. These assets and folder structure where created inside the database.
  3. A combination of jobs, Shell Scripts, XML Changes and updates in the CMDREG table copied these assets and folders to  our web server.


Lets assume that our webserver, has a Virtual Directory that answer to the following sub domain name:


If a user uploads a structure like:


Then, we should have:


But, our goal isn’t  allow the users to download the images from our webserver, then we have to:

  1. Create a subdomain, to point to Akamai servers. For example: images.aurora.com
  2. Create a rule, where if Akamai serves are hit, and don’t have the asset, get it from “localimages.aurora.com/*”.
  3. Change our store JSP’s to bring all assets from “images.aurora.com”

This way, we will have all shoppers downloading images from the CDN network, when visiting our store. This applies to all images, like, Marketing Assets, Catalog Assets and others.

It’s important to remember that WCS allows dynamic eSpots (“What the heck is an eSpot”  from my friend Bob Balfe), so the requests will still hit the APP server in these dynamic cases, but after receive the decision of what asset will be displayed, the browser will download the asset from the CDN.

At the end, this will be the scenario:



  1. Shopper access the store
  2. Browser queries application server to know what assets shoud be displayed on the eSpots.
  3. Browser downloads all assets from the Akamai CDN. (images.aurora.com)
  4. If Akamai does not have this asset cached yet (normal situation for first time requests), it will be query the local image repository we  set in our HTTP Server (localimages.aurora.com).

The concepts of using Akamai are very easy, but setting all these things is not so trivial. If you need any help about how to make this set up, in terms of JSPs, shell scripts and others, please, fell free to contact me.



Changing managed file WebSphere Commerce EAR updater parameters


Updating static Web assets to a remote Web server


Configuring the scheduler to run a job on an instance or cluster member








Meet, know and Connect with your customer

Your customers are not only a segmentation, or a bunch of data like many companies see it.

Are you capable of knowing what are your customers’ expectations? Style? Who inspires them? Who they inspire?

All that is possible with IBM Smarter Commerce Solutions, such as Coremetrics, WCS and Unica.

Here are some really nice videos, that show what IBM Smarter Commerce solutions can do for you and your customer.




How to schedule price changes in WCS?

UPDATE: This become obsolete with FEP 6, commerce now have the date fields in the price list! =)

Here’s a regular picture of a Price List in WCS, as you can see, we have the fields:

  • Name
  • Description
  • Type (Product / Item)
  • Code
  • Minimum Quantity
  • Maximum Quantity
  • Value ( in the possible currencies of the e-commerce site)


We can also add three more fields by right clicking on the Price List header, and choosing configure columns, we can add:

  • Thumbnail
  • Qualifier
  • Unique ID


Then, how should we be able to schedule offers with these fields?

The answer is: We can’t.

In the most recent version of WCS 7, Fix Pack 6 FEP 5, we can only do that through CSV upload, which allows us access to more fields. (Without customization)

Using the CSV file upload (which is the best way to manage price list data), we can set the StartDate and EndDate fields to achieve the following effect:

At 10:30

pricefromlistprice epl


Note that the offer Price List is empty,  the Price Rule brings the value of $50 from the List Price.

At 10:35

newprice vlpNote that the offer Price List now have a value, and  the Price Rule brings the value of $60 from the Offer Price List.

For this to happen automatically,I used the following CSV template.

Download Link: PriceList

Info Center CSV Format page

Follow the description of each field in the CSV Price List upload template:

  • PriceListUniqueId – (Optional, String) The identifier of the price list. When there is a data mapping for price list UniqueID in the price list data load configuration file, then the uniqueID is mandatory in the CSV file.
  • PriceListName – (Optional, String) The name of the price list that contains this offer. When loading an offer, you can provide either the PriceListName or the PriceListUniqueId, or both. If both of them are provided in the CSV file, the PriceListUniqueId is used to load. If neither of them are provided in the CSV file, the store’s default price list name is used to load.
  • CatentryUniqueId – (Optional, String) The unique identifier of the catalog entry that this offer is for. When loading an offer, you must provide either the CatentryPartNumber or CatentryUniqueID. If both of them are provided in CSV file, the CatentryUniqueID is used to load. If neither of them are provided in the CSV file, the offer will not load.
  • CatentryPartNumber – (Optional, String) The part number of the catalog entry that this offer is for. When loading an offer, you must provide either the CatentryPartNumber or CatentryUniqueID. If both of them are provided in CSV file, the CatentryUniqueID is used to load. If neither of them are provided in the CSV file, the offer will not load.
  • Identifier – (Optional, String) The identifier of the offer. If the identifier is not provided in the CSV file, a random identifier is generated for the offer.
  • Precedence – (Optional, Double) When more than one offer is effective at a particular time, the one with the highest precedence is used. If the precedence value is not provided in the CSV file, the default value of 0.0 is used.
  • StartDate – (Optional, Timestamp) The start of the time range during which this offer is effective. Use this format: yyyy-mm-dd hh:mm:ss.millis
  • EndDate – (Optional, Timestamp) The end of the time range during which this offer is effective. Use this format: yyyy-mm-dd hh:mm:ss.millis
  • QuantityUnitIdentifier – (Optional, String) The unit of measure for Minimum Quantity and Maximum Quantity.
  • MinimumQuantity – (Optional, Double) The minimum quantity that can be purchased in a single order under this offer.
  • MaximumQuantity – (Optional, Double) The maximum quantity that can be purchased in a single order under this offer.
  • LastUpdate – (Optional, Timestamp) The last time that the offer is updated. Use the format yyyy-mm-dd hh:mm:ss.millis
  • Description – (Optional, String) The description for this offer.
  • PriceIn*** – (Optional, Decimal) The price in each of your e-commerce currency.
  • Delete – (String) Indicates whether to delete this offer. The value 0 means do not delete. The value 1 means delete.

If you have any question about price list, please, fell free to ask in the comments.


Unleash the power of facets and attributes!

Imagine what if your customers were able to “build” their own Shirts on your store? Or if they could assemble their preferred glass style without having to browse your store?

That is possible with WebSphere Commerce,  using the power of attributes as facets to achieve things beyond the imagination.

Look at this example, where your customer can virtually “build” his own glass, just like a self service system.


So, how can we do that?

The first step is understanding the types, variations and applications of attributes we have on the platform.

1 – Types:

 Predefined AttributesAttributes with predefined values – These attributes are best applied for common types, with repetitive values, like Screen Size for example. The Business User can define a range of possible values for this attribute (45″, 32″) and also a default one.

Assigned AttributesAttributes with assigned values – These attributes are best applied for very dynamic and not “predictable” values, in this kind of attributes, the business user is  able to insert virtually any kind of value.


2 – Main parameters:


Displayable – This parameter defines if the attribute will be appearing in the product detailed description or not. With that, you can hide the attribute from a crawler or a user.
Comparable – This parameter defines if this attribute will be shown in the product comparison screen or not. A comparison screen rich in information helps the customer to make decisions.
Facetable –  This parameter dictates that the attribute values can be used as  “filters” in product lists, in order to improve shoppers’ experience. With facetables attributes, shoppers can filter multiples values of same attributes to check the products, almost building their own item. We can also use images to represent the attribute values in the left navigation bar, what allow us to create almost a “self service” system in the navigation of our store. This feature is really awesome!
Searchable – This parameter enables the attribute values or attribute name to be “found” using the store search functionality.

3 – Main Applications:

Descriptive attributes – These are attributes that are common for all product’s SKUs.      Perfect for facets and comparison.  Business Users have to define it just once, in the product level, and all SKUs inherit these values.
Example: All iPhone 5 have a 4 Inch screen size.

Descriptive attribute

Descriptive attribute

Defining attributes – These are attributes that change the products’ SKUs. They are also perfect for facets and comparison. Business users have to define it just once, on product level, and WCS automatically creates one SKU for each value of the attribute. Defining attributes can only be of the Predefined Values type. Assigned Values are not allowed.
Example. iPhone 5 can have Color Black&Slate or White&Silver
Also, capacity can be 16, 32 or 64 gb.

Defining attributes

Defining attributes

Now, that we know the types, parameters and applications of attributes, let’s see how to create a “self-service” system to choose a tablet, using facets and multiple choice attributes.

The first step is to identify the main attributes of our tablet products, and create the attributes, so let’s take as example: Size, Battery life and Storage.

To create a new attribute, we have to do the following, inside the catalog engine:

File -> New -> Attribute dictionary attribute with predefined values.


Then, we have to create our attribute, filling the name and general description, and we cannot forget to mark that this attribute will be Facetable, Comparable and Displayable.

*After save a attribute as Facetable, you can not undo this action without IT support.


Then, we have to define all the possible values for each attribute. Like this example.


If you want to associate images to represent values and provide the following effect, we have to associate an asset with each value. For that, right click the attribute value column title, configure columns, and mark image path.

*Remember that we always can change the order of values with the sequence field




After that, our attributes are created  with all values filled.

Now, we have to associate these attributes to products and the values to the SKUs.

So, in our product details page, inside CMC, let’s go to the defining attributes tab, type the attribute name on the text field, then hit “find and add”.


Now, our last step is to generate the SKUs for our tablet product. For that, right click the product on “active work” and choose generate SKUs.


And this is the result:


Then, after your Staging Propagation job, and re-index prop job, your product category should looks like that:


*Remember that you can always change the sequence facets are displayed with a right click on the product category, choosing “show  facets” an changing the sequence value.

I hope that you have liked this post, so if you need any help, have question, want to suggest something or a new topic for the next post, please, leave a comment 😉