May 18, 2012

ChannelAdvisor's Developer Choice Days: Two Winners!

One of my favorite traditions at ChannelAdvisor is something we call “Developer Choice Days.” Every quarter we set aside a few days for the engineers to work on anything they want. Lots of tech companies do something similar; Google’s “20% time” is probably the most famous example, but our program is more like Yahoo’s “Hack Days.”

Like Yahoo, we also have a review where the engineers show off their work and compete for prizes. We have a panel of “celebrity judges” who hand out a Best Project prize. Then there’s a prize for the project that is most useful to our services and support teams. Finally, there’s the “people’s choice” award, voted on by the audience members (generally the other engineers).

We’ve been doing this for four years now, and while the format and frequency have changed slightly over the years, we always have lots of innovative projects, many of which “ship” as part of our production software. In fact, we’ve shipped nearly 50 of these projects, and while many of them are infrastructure changes or internal tools that aren’t visible to most users, quite a few are customer-facing features---big ones, in some cases.

Our latest Dev Choice review was Episode XXIX (which gives you an idea of how long we’ve been doing this). The celebrity judges were celebrities indeed: CEO Scot Wingo, President & COO David Spitz, and Directory of Global Services Greg Ives. We had 10 projects, most of which are going to production in a month or two. While all the projects were excellent, we all know There Can Be Only One. Well, in this case, four.

Developers Day
There was a two-way tie for Best Project: QA Engineer Sean Miller’s project (Left in Picture), a “test grid” that speeds up our automated testing; and Database Administrator Justin Jaeschke’s project (Right in Picture), a demonstration of SqlServer Reporting Services for internal reporting. Runner-up for Best Project was Software Engineer Marshall Scott’s prototype of an integration with Fulfillment by Amazon. The winner of the Most Useful Project for Support and Services was Web Developer Jeromie Walters’s project, an internal tool for examining checkout error logs. And the People’s Choice award also went to Sean Miller’s test grid: we love projects that save time!

Our next episode of Developer Choice Days is scheduled for early August. Stay tuned!

Blog post by Anthony Alford, The Feed Doctor. 

May 04, 2012

Three-and-a-Half New Functions from the Feed Doctor

TheFeedDoctorIt’s been a busy month for the Doctor. Besides attending Catalyst US (which was DYNAMITE), I also managed to write THREE new functions, plus an improvement to an old one. Here’s how it happened...

I was answering a business rule question on one of our forums when I realized we were missing two really handy functions: MAX and MIN. These functions accept two to eight numeric inputs and give you back the largest and smallest values, respectively. For example, MAX(2,1,8,4) would output 8, while MIN(2,1,8,4) would output 1.

One of our readers left a comment that inspired a change to the IFTOOLONG function. This function had three inputs: the “normal” text, a maximum length, and a “fallback” text. If the normal text is shorter than the maximum length, then the function outputs that. Otherwise, it outputs the fallback text. The problem is that sometimes the fallback text is also too long. So our reader suggested we allow the function to accept multiple fallback text values, and output the first one that’s not too long. This makes a lot of sense, so I made it so.

She also suggested we create a function that would truncate an input text so that it had no more than a given number of words. This is similar to the LEFTWORD function I wrote about a little while ago, only instead of the maximum total length, you specify the maximum number of words. I called this function NWORDS, and here’s an example:NWORDS(“The quick brown fox jumped over the lazy dog”,4,” ”)

Notice the “ “ after the 4. This is the delimiter between words; you could also use something else, such as a comma in a comma-separated list of words. In this example, the result would be “The quick brown fox”.

Look for these changes and more in our next software update!

Blog post by Anthony Alford, The Feed Doctor; Image courtesy of Zee Khan, Customer Support Manager

_____________________________________________________________________

Find out more about our Comparison Shopping Solution with our Guide to Comparison Shopping

Us-shopping-feed-guide



 

May 02, 2012

Upcoming Webinar: Flex Feeds

Spring-release

Join us Thursday, May 3 for the Flex Feeds webinar to learn how our new solution allows you to send completely customized product data feeds to satisfy the needs of virtually any commerce partner. 

Thursday, May 3, 2012
11:00 am ET, 4:00 pm GMT

Register now for the Flex Feeds webinar!


Apr 24, 2012

Upcoming Webinar: 2012 Spring Release Webinar Series

Spring-release

Be sure to check out the Upcoming Webinar: 2012 Spring Release Webinar Series blog post for more information about our new Facebook Campaigns, Flex Feeds and Rich Media solutions.

 

Apr 09, 2012

The Feed Doctor Unveils a New Business Rule Function: JOINNB

We’ve got quite a few business rule superstars here at ChannelAdvisor. I was talking to two of them, Alisyn Collins and Carol Scheible, about a rule they had written. They had used JOIN to splice together a bunch of fields with a delimiter between them. But some of the fields were blank sometimes, so they had extra delimiter characters they had to get rid of. To fix this, they were using a pretty scary regular expression. They suggested that we needed a new function:

“What we really need is a join that skips blanks, so you don't end up with duplicate delimiters in the first place.” 

This was definitely a facepalm moment on my part: of course we need a function for this! You might even argue that that’s the way JOIN ought to work by default. But since it’s kind of risky to change the behavior of things that aren’t, strictly speaking, broken, I decided to make this a new function. I let Carol and Alisyn pick the name: JOINNB. The “NB” is for “no blanks.” 

Here’s an example of how it works. Let’s say that $sku is “ABC,” $brand is blank, and $mpn is “123.”

If you wrote this rule:
JOIN(“~”,$sku,$brand,$mpn)

 you’d get this output:
ABC~~123 

But if you use the new function:
JOINNB(“~”,$sku,$brand,$mpn)

you get this:
ABC~123

This new function will ship with the April release, just in time for Catalyst. Speaking of Catalyst: I’ll be there myself, so if you get a chance, come by and say hello!

Blog post by Anthony Alford, The Feed Doctor. 

 

Mar 09, 2012

The Feed Doctor's New Business Rule Functions

Have you ever wondered how we decide on the different functions that we build into the business rule system? Today I’ll tell you the story of two brand new ones.

I get asked to help write lots of complex business rules. Usually, I can figure out a solution, but sometimes it’s not pretty. If it’s a problem that comes up a lot, sometimes I like to create a brand new function to help make it simpler. Here's a recent example where I was asked for help on writing a rule. The input to the rule is a comma-separated list of values. The rule should output as many whole values in the list as possible so that the total length of the output is less than 50 characters. So for example, if the input is:

abc11,def11,ghi11,jkl11,mno11,abc22,def22,ghi22,jkl22,mno22

Then the output should be:

abc11,def11,ghi11,jkl11,mno11,abc22,def22,ghi22

You can easily do the part about "less than 50 characters" using the LEFT function, but if you do that, you get this:

abc11,def11,ghi11,jkl11,mno11,abc22,def22,ghi22,j

So, you have to do some REGEX magic to cut off that last comma and letter j, and it can get messy. It turns out, I've helped people with this very problem several times; I even wrote a blog post on it LONG ago: The Feed Doctor Makes a Long Story Short.

Finally, I decided it was time to build this function into the system. I created a new function, LEFTWORD. You give it the input text, the maximum length, and a "delimiter," which can be anything; in our example, it would be a comma. If you have a list of words and you want to “chop” it on word boundaries, you can use a space. If you have several sentences and you want to chop at sentence boundaries, use a period.

Another thing I like to do from time to time is take a look at some of the patterns of business rules that people write. If I see that numerous people are writing long, complex rules to solve the same problem, it’s obvious that there's an opportunity to create new functions. Here’s a pattern that we’ve had, basically forever: Write a rule that outputs value #1, unless it's blank, in which case it outputs value #2, unless that's blank, in which case it outputs value #3, unless...you get the picture. You can do this with the IFBLANK function, but since IFBLANK only allows two inputs, you have to "nest" the IFBLANK calls, like this:

IFBLANK(IFBLANK(IFBLANK("value #1","value #2"),"value #3"), "Value #4")

What a pain! Why can’t IFBLANK be more like CONCATENATE and JOIN, which can accept a variable number of inputs? Why indeed. So, I decided to fix that, too. Now IFBLANK will accept up to 8 inputs, and will output the first (i.e., "leftest") one that is not blank:

IFBLANK("value #1","value #2","value #3","Value #4")

These changes rolled out yesterday along with other updates that are included here in the complete Release Notes.

For more information on comparison shopping best practices, download 16 Common Comparison Shopping Mistakes to Avoid at All Costs.

Blog post by Anthony Alford, (a.k.a. The Feed Doctor), Technical Lead

Feb 22, 2012

E-Commerce superstars are coming to Vegas!

Vegas sign

This year’s Catalyst conference is stacking up to be the best ever.

This is largely due to the superstar line-up we’re bringing to Las Vegas in April. Marketplaces Newegg and Walmart.com are the most recent additions to the sponsorship list that also includes Amazon, eBay, Google, Buy.com, ShipWorks, PayPal, Terapeak and many more. We’ll have Sebastian Gunningham from Amazon, Michael Jones from eBay, Matt Eichener from Google, and now Gary Vaynerchuk and Zia Daniell Wigder have joined the list of keynote presenters as well.

If you haven’t heard of Vaynerchuk, this video will give you a little insight into what Catalyst attendees have to look forward to: Turning up the Tweet.

Gary V

Online marketing expert and author of The Thank You Economy Gary Vaynerchuk

Zia Wigder of Forrester will join us in Vegas as well to share her thoughts on the hot topic of international expansion, with a focus on the fastest growing global e-commerce markets: Latin America and China. 

Zia

Forrester Research, Inc. Vice President and Research Director Zia Wigder

Stay tuned—we’ve got more exciting announcements about Catalyst coming in the next few weeks.  Our event space is limited, so you should probably go ahead and secure your ticket now before Catalyst is sold out!

Catalyst is sure to be a valuable opportunity for anyone in online retail. Don’t miss out, register for Catalyst NOW!

For more details and a full list of speakers and sponsors, read Best and Brightest Of E-Commerce To Participate In ChannelAdvisor Catalyst Conference.

Drawing a record number of participants and attendees, the Catalyst theme, NewCommerce, is proving to be top of mind for the leading retailers and companies in the e-commerce industry.

NewCommerce defines trends that span social media to cross-border trade, tablet computing and “couch commerce,” new smartphone capabilities and more, all of which create an ‘anytime, anywhere’ level of accessibility for shoppers and represents the accelerating complexity for retailers and manufacturers trying to reach consumers.

 

 

 

Dec 14, 2011

A Dose of Tips from The Feed Doctor

Much of the wisdom of software development is expressed as wry---nay, even cynical---aphorisms. My favorite (attributed to Hamming) is: "Mathematicians stand on each other's shoulders while computer scientists stand on each other's toes." That one is merely descriptive, but the most important ones are prescriptive, like this one from Knuth:

"Premature optimization is the root of all evil"

Programmers obsess over "optimization." Mostly they mean they want their programs to run faster, because everybody hates waiting. In case you haven't noticed, business rules ARE little programs, and as my gift to you, I'm going to give you 3 tips that could make your business rules run faster.

IF vs. SELECTCASE

Let's say you've got a rule that has three possible outputs:

1. If brand is "Acme," output "Free Overnight Shipping"
2. If brand is "X," output "Free Shipping"
3. Otherwise, output "See Site for Shipping Cost" 

I usually advise people to use SELECTCASE when dealing with more than one condition, like this:

SELECTCASE($brand="Acme","Free Overnight Shipping",$brand="X","Free Shipping","See Site for Shipping Cost")

I think this looks cleaner than the alternative, using nested IFs:

IF($brand="Acme","Free Overnight Shipping",IF($brand="X","Free Shipping","See Site for Shipping Cost"))

These two rules have exactly the same output, and I assumed they took about the same time to run. I was surprised to find out that the 2nd rule is TEN TIMES faster! Here's the fundamental truth of "optimization:" it's always a trade-off. In this case you are trading clarity (first rule) for speed (2nd rule). Choose wisely!

IFBLANK vs ISINLIST

Here's a pattern I've seen a few times:

IF(ISINLIST("Some list",$brand),LOOKUP("Some list",$brand),"Default text")

This rule checks to see if brand (it could be any attribute, of course) is the left-hand or "name" column of a list. If so, the rule outputs the corresponding data from the right-hand or "value" column. Otherwise, it outputs some default text. This is perfectly fine. However, if ALL the entries in the list have a non-blank "value" column, the rule could be this:

IFBLANK(LOOKUP("Some list",$brand),"Default text")

The second rule is twice as fast! The reason is that the first rule ALWAYS looks up the value in the list TWICE, whereas the second rule only does it once. Now, again, there's a trade-off: if your list has blank entries in the "value" column, the rules are NOT the same.

Regular Expressions

Ah, who doesn't love a regex? (By the way, here's another aphorism “Some people, when confronted with a problem, think ‘I know, I'll use regular expressions.’   Now they have two problems.’) However many problems you wind up with, you'll have this one at least: regexes can be SLOW. And given two regexes that do more-or-less the same thing, one could be MUCH slower than the other. For example, here are two rules that remove html tags from a description:

REGEXREPLACE($description,"<.+?>","")

REGEXREPLACE($description,"<[^>]+>","")

I won't go into the details of these; instead I will note that the second one is faster by about 50%. Be very careful with your regexes. Most of the tradeoff is in the time it takes you to write the thing; sometimes you have to be pretty clever.

There you go friends: 3 tips for faster rules. With all the time you save, you might be able to watch all 35 bowl games this year.

Blog post by Anthony Alford, (a.k.a. The Feed Doctor), Technical Lead

Nov 18, 2011

Countdown to Cyber Monday: Daily Tip 4

In exactly one week, thousands will rise at ungodly hours, camp out and form store-wrapping lines to kick off the Cyber 5! And for online shoppers the dedication to deals is just as intense!

Make the most of the rush by enhancing your visibility on Comparison Shopping Engines.

Tip #4: Comply with Google Product Search Changes

We’ve got a secret…Google Product Search is going to be HUGE this Holiday Season. Aside from its ever-increasing popularity as a shopping starting point, a number of apps, like RedLaser (found to be the most widely used barcode scanner by our Global Consumer Shopping Habits Survey), now use GPS data to compare prices and locate products. 

GPS iphone

Get on board with the most recent GPS specifications and check the requirement list—twice—to optimize on traffic and sales. Apparel retailers will want to pay special attention to include product variation data (color, material, pattern and size) as well as unique images for items that vary (by color, pattern or material). For more details, check out Google’s Feed Specification Help Page.

GPS boots

Bonus Tip: Retailers should heed to Google’s wishes by listing shipping and tax costs, too. Incorrect or excluded cost data can lead to suspension and, more importantly, can deter shoppers who expect total price points at a glimpse. Still think it’s not a big deal? Check out this Search Engine Land article warning retailers against these violations, as well as the guest blog post from Google's Mayuresh Saoji on this blog. 

If you've missed our past tips here they are: 

Tip #1: Add Gift-Themed Categories

Tip #2: Offer and Highlight Free and Expedited Shipping

Tip #3: Bid Up Early and Often

Blog post by Natalie Sink, ChannelAdvisor Communications Assistant

 

Sep 30, 2011

The Feed Doctor Returns: Percentage Savings Rule

25OFF Recently I've been asked how to create a rule to generate a "percent
savings" message. Let's say your sale price is in an attribute called
$itemstoreprice, and the regular price is $itemretailprice. The formula
for percent savings is:

100 * (1 - $itemstoreprice/$itemretailprice)

Here's the result for an item that's marked down to 14.99 from 19.99:
25.0125062531266

Well, that's kind of ugly. Maybe I only want whole numbers. That's easy to
do with the FORMATNUMBER function:

FORMATNUMBER (100 * (1 - $itemstoreprice/$itemretailprice), "F0")

That "F0" means to output a Fixed number of digits to the right of the
decimal; in this case, zero digits.

And here's the result: 25

If you wanted two digits to the right of the decimal instead of "F0" you'd
have "F2" and the result would be 25.01.

Let's stay with "F0," and some text:

CONCATENATE ("Save ", FORMATNUMBER (100 * (1 -
$itemstoreprice/$itemretailprice), "F0"),"% off retail!")

Here's the result:

Save 25% off retail!

Blogpost by Anthony Alford: The Feed Doctor