Promotion Craft – The Art of Creating Successful Online Promotions

She wants what your site is selling. Really wants it. Wants it so much she’s comparing colors, reading reviews, scouring social media, and watching videos on YouTube about it. So why isn’t she buying? You haven’t given her enough motivation to pull the trigger. She’s almost ready, she just needs a gentle nudge. That’s where successful online promotions come in.

Right now, you have a group of customers who emotionally want your products. More of them would purchase if you would give them enough reasons to justify the decision to buy now. When you start with this premise in mind, then successful promotions become easier to craft. In essence, you are creating a scenario where your customers and prospects will likely say, “OK, I’ll buy now” rather than waiting a week, a month, or a few months.

Here are 6 things to keep in mind that will help you become a master of crafting successful promotions.

1. Start with an irresistible offer.

Most promotions fail because the offers behind them are, well, resistible. Pedestrian offers like save 10% will do little to generate customer excitement and motivate immediate spending. Before you cry out, “but my margins are slim! I can’t offer big discounts,” never fear. You might not need to discount at all to create an irresistible offer. Here are 3 categories of irresistible offers to consider:

Deal/Discount Based – If you ask a merchant to craft an irresistible offer, their minds will almost certainly gravitate toward big discounts. Irresistible offers are less about how big the discount is, and more about how creative you are in the execution of the promotion. Sure, big discounts command attention, but you don’t have to give 50% off to have an irresistible deal offer. You can do straight discounts – and sometimes odd discounts work well. Let’s say you’re celebrating your 13th anniversary. Offering 13% off all orders on your 13th anniversary can be a fun and motivating sale. You can also bundle products which are a form of discounting but doesn’t feel like you are cheapening your products. You can offer to double reward points on certain days if you offer a rewards points program. My favorite local smoothie joint offers double punch Tuesdays and they are usually slammed on Tuesdays. Then, of course, you can offer the big discounts if you have the margins to allow for it. I’m a big fan of the buy-one-get-one (BOGO) or buy one get one 25-50% off. You could also offer a spend X and get a free gift card. That gift card could then be sent to a friend or relative which could bring in a new customer for you, or the gift card could be used by the original buyer.

Experience Based – Customers don’t just buy for utility. Experience is a big driver of purchases especially for older and/or more affluent buyers or just in certain product categories. Why shell out $75 per person at a nice Sushi restaurant when Wendy’s is right around the corner? It’s the experience, not just the filling of the belly that’s dictating the decision. What can you do as an online merchant? Consider upgrades to better shipping options. Or, consider offering personal shoppers available via chat or phone who will do the initial shopping for you. What about virtual events like cooking classes with a famous sushi chef if you sell cookware, or video demonstrations from tournament champion fishermen if you selling fishing equipment? What about doing something crazy for big B2B accounts who spend a lot with you? I know a B2B company with decent margins who runs a promotion every few years for their top 15 customers that if they spend 15-20% more than they did the year prior they get to go on an all-expenses-paid cruise. The decent margins and the resulting increase in spending make this a good deal for the B2B merchant. It’s important to note that the cruises have a strangely appealing effect on buying – more so than a discount of the same value. Here are some fun experience-based offers to consider:

Marketing Multipliers – What is something that, when purchased or experienced, causes customers to consume or buy more of what you offer. For Amazon, it’s their Prime membership that offers a Netflix-like selection of streaming movies and TV shows and then free 2-day shipping on almost any item. Conservatively, Prime members spend nearly twice as much as non-members. In some places, I’ve seen Prime members say their spending went up 2-9x after becoming a member. When Amazon offers a free trial of Amazon Prime or when they throw in an annual Prime membership with the purchase of the Amazon Fire TV or Amazon Fire Phone (which turned out to be a pretty resistible phone product, initially) they are giving away something that will multiply consumption. How could you craft a membership similar to that of Amazon Prime, and use it mainly as an offer and a marketing multiplier?

Wishlist event – This is one of my favorite event ideas. I don’t know of anyone online who are doing this right now. Here’s the premise. Have customers fill out a wish list. Run the promotion for 2-4 weeks to maximize sign ups. Then at the end of the contest randomly select someone to win their entire wish list for free. You can cap this at $500, $2,500, or whatever you want, but make sure it makes signing up irresistible. Then, for those who don’t win, email them and offer a discount for a limited time on their wish list items that they want to purchase. Better yet, make part of the registration process entering the name of the boyfriend or girlfriend or spouse of the person registering. Then after the promotion, you can send an email to that significant other, saying “good news we know what she wants this Holiday Season.” I originally helped craft this idea for an offline jewelry store. It worked like gangbusters.

Contests – Contests can range from the basic, enter-to-win sweepstakes, to something that takes a little more effort from participants. Encourage customers to write the best product description for your new product, or create a demonstration video of your product in action. The winner get’s $250 in store credit (or whatever amount you can offer that will foster excitement).

Information Based – Some product categories warrant the consumption of information. Hobby-related products like golf, cooking, hunting or “hot button” issues like financial planning or survival planning, or zombie apocalypse planning all lend themselves well to information offers. Offering How-to guides, eBooks, or a “How to Bag the Biggest Buck” video series when you buy $200 at XYZsportinggoods.com can be truly motivating offers. What information can you offer that your market is clamoring for that could also entice them to buy more of your stuff?

How do you know if you have an irresistible offer? Crafting a truly irresistible offer takes some practice and experimentation. Here are a few litmus tests to see if your offer is on the right track:

The Squirm Test – Does it make you a bit uncomfortable? Does it make the owners or CFO squirm just a little? Then you’re likely on the right track to creating something irresistible.
The Shrug Test – Share the offer with people in your office or, better yet, your target market and watch their reaction. Does it create wide-eyed excitement or dull stares and shrugs? If you get the shrug, your offer is very resistible. The Share Test – Does your offer lend itself to sharing? If customers are inclined to share your offer and if you encourage the sharing of your offer, you can seriously leverage the communication of your offer.

2. Reason why copy

Don’t just run a sale or promotion without sharing why. People always want to know why. If you don’t give them a reason, they will invent one or simply become skeptical of your offer. Don’t worry, people don’t need much of a reason. Often simply naming your event will take care of the why question. Call it a Customer Appreciation Event, or Cyber Monday Sale, or Back-to-School event. That gives your customers the ability to see why you are offering something. Sounds simple, but it is important.

3. Leverage your platform

Magento, Shopify, BigCommerce – they all have native functionality or functionality easily available through extensions that can greatly boost your promotion’s performance. Don’t miss out of the benefits of this functionality.
If you’re using Magento consider some of these features:

  • Rewards Points: Double your points for the weekend. (as a side note, we love rewards points and the native functionality that Magento offers, but you have to consider fraud mitigation with rewards points.)
  • Private Sales and invitations
  • Flexible coupons and tiered pricing – buy x get y, buy x get fixed amount discount, tiered discounts
  • Shopping cart upsells

Some platforms offer cool gift card features that allow for balance checking, personal email messages, and unique gift amounts. Want to give someone a $22.87 gift card just for fun? You can with several platforms and extensions.

4. Leverage your communication

Always go multi-channel unless your promotion is strictly limited to your current VIPs. Even then, you’ll likely want to use a couple of channels. Make sure you have a multitouch plan for email (usually no less than 3 emails per promotion). Don’t hesitate to use remarketing ads (why not convert your remarketing ads to promote your offer while it’s available), Facebook ads, Twitter, and even your blog to leverage the offer. Also, look for people who will amplify and share the promotion and encourage them to do so.

5. Think customer development, not just one-time sales bump

What long-term effect will this promotion have on my customer relationships? Extend the life of the sale by asking customers to share their story of what they bought with the best story shared socially earning a free T Shirt or something fun.

6. Experiment

Test. Not every promotion will be a winner. Sometimes the promotion you think will be mediocre will actually drive huge sales numbers. Conversely, the promo that you think is a can’t miss might turn out to be a dud. We just had a client who offered free shipping for a weekend to everyone on their email list. That might not sound earth-shattering, but it was their biggest promotion to date. Sometimes really simple stuff has a big impact. Test, tweak and test some more.

So don’t just run the same old canned and tired promotions that most merchants run. Get creative. There are a lot of would-be customers out there, wallet in hand, waiting for you to help them make a decision to buy. Don’t let them down.

Enjoyed this post?

You’ll love our recent Llama Commerce Show dedicated to this topic. Classy Llama CEO, Kurt Theobald, and Lead Strategist, Brett Curry, discuss and debate the fundamentals of rock solid online promotions.

Debugging Complex Problems

Recently, I posted about avoiding common coding problems. These practices can help to reduce debugging overall time. Even after common coding issues have been reduced, you are often still left with a need to debug more complex problems. These are the bugs that you either didn’t write, which are sometimes buried in the core of the framework or application on which you are working (in our case, Magento), or that stem from incorrect or incomplete logic. These types of problems can often require a variety of techniques to debug, especially when the bug is in the code you neither wrote nor have seen.

Example

The Problem

A client was having a problem where no product on a grouped product page was able to be added to the cart. All qty text boxes were hidden, and it was ultimately represented the same way an out of stock grouped product was represented.

Debugging Methodology

  1. Start Simple
  2. Check for common mistakes
  3. Check the quickest things first
  4. Isolate the specifics of the problem
  5. Isolate the source of the problem
  6. Determine the factors that could possibly impact the source of the problem
  7. Create logs to determine which factor is the culprit
  8. Fix the bug whether code, user, or data related

Solution

1. Capture the Current State

The first step before doing any debugging is to create a copy of the database. Sometimes, especially with complex eCommerce sites with multiple integrations, a problem can be difficult to isolate. If I accidentally “fix” the problem while debugging it, my efforts at fixing the problem long term can be delayed until the problem occurs again. It is also good practice to debug apart from production if the problem can be reproduced in a development environment.

2 & 3. Check for Quick Fixes & Common Mistakes

Once I had that backup, I start by checking things in the Magento admin like stock, qty, product status, product websites, product visibility, etc. of the parent grouped product and its child simple products. In this case, I determined that according to the admin, all of the products had satisfactory attribute values. There were at least a few products that were enabled, in the appropriate website, in stock, with a qty greater than the out of stock qty level, and attached correctly to the grouped product. Next, I went to the code that determines whether a product is eligible to be purchased. This code is somewhat spread out, but I determined with a fair degree of certainty that there should have been products eligible to purchase.

4. Isolate the Specifics

Because I had determined that this problem was most likely not caused by a simple mistake and I had checked the quickest things, I moved on to isolate the specifics of the problem. Since the quantity text boxes were hidden, I knew that whatever logic was causing the products to not be able to be added to the cart was associated with the grouped product page. I opened up lib/Zend/Db/Adapter/Abstract.php, the file that processes most of the actual SQL calls that Magento uses and their bindings before the query is sent to the DB, and added some log statements. I logged every query that was made along with its associated bindings. I then created a log before the products on the grouped product page were loaded and a log after they were loaded. By doing this, I was able to determine which queries were most likely responsible for determining whether the products should be eligible for addition to the cart.

A new tool from Zend, called Z-Ray, would have made this query logging process simpler since it automatically displays all queries when enabled. I highly recommend using this tool for debugging your applications since it makes your debugging information available to you without having to add any logging or enable profiling.

5. Isolate the Source

Next, I then looked for a query that looked like it was dealing with stock. With this query in hand, I went to the database and ran the query to see its results. There were no valid results from this query. I now had the specifics of the problem (no valid stock items being returned from the DB), so I started removing filters from the query until it would return rows. By using this method, I was able to determine that the problem was related to the stock status that was set on the grouped product itself. I had isolated the source of the problem.

6. Determine Factors Affecting the Source

I next investigated where in the code this stock status was set and what conditions were used to determine whether the stock status should be in stock or out of stock. I determined that the stock status was supposed to be “in stock” based on the conditions in the code where stock status was updated. According to the code, the conditions should have produced an “in stock” status, but the grouped product was nevertheless “out of stock.” This explained why I had not found anything wrong with the attributes of grouped and associated simple products when I had done my initial debugging in my “check the quickest things” first step. Since I knew that in this case, stock, which is stored on the simple product, was being updated dynamically through the Magento API, I looked at the logic that determined stock status from this stock information. Sure enough, there was a separate set of logic for generating stock status compared to if the stock item were updated through the product admin section. Since the stock status code was distinct for updating stock via the API and I was not able to reproduce the problem by saving the same stock levels on the product in the admin, I determined that I needed to either create sandbox API calls or log the live integration. Saving in the product actually was fixing the problem, which gave me clear evidence that I needed to find out what the API was doing differently.

7. Create Logs to Identify the Culprit

Because the budget was more of a constraint than the timeline, I opted to log data on the live integration and wait for the next time this was broken. I fixed the data temporarily by saving a few grouped products and set up logging statements that would allow me to see the API parameters, the stock items, the stock status, and the sql queries for each API call. By doing this, I was able to determine the exact API call/parameters used to allow me to create a non-API based sandbox call and step through the stock status update process in a debugger since I had determined the factors that impacted the source of the problem and logged their values. Since I was trying to identify why a grouped product’s stock status was false, I identified the array that was supposed to contain a list of the child simple products stock statuses keyed by their ids. The array that was returned for the child products statuses was an array with only a single key/value pair where the key was a 1 and the value was a seemingly random number.

By looking at the code that was generating the child product stock statuses, I was able to identify the problem. The query that was getting statuses from the database was switching the order of the keys and the values. The stock status, which was a 1, was being represented as the key and the key was being represented as the value. Since the stock status for each child product was 1, the resulting array was a key of 1 and a value of the final child product id. The children products’ stock statuses were then being used to update the parent stock status and since there was no valid child product stock status marked as in stock, the parent product was being marked as out of stock.

If you would like to view the relevant methods where I found this problem, you can look at Mage_CatalogInventory_Model_Resource_Stock_Status::saveProductStatus and Mage_Catalog_Model_Resource_Product_Status::getProductStatus in the else section under the $select and $rows variable assignment. I was working with EE 1.12.0.2 but the error likely exists in or around CE 1.7.0.2 as well.

8. Resolve the Issue

I was able to fix the problem with a simple rewrite of the Mage_Catalog_Model_Resource_Product_Status class by changing the order of the columns in the select in the getProductStatus() method.

Ultimately, by following the steps listed in the debugging methodology section above, I was able to identify the problem relatively quickly. The order of the steps I followed is important because at any point I may have identified the problem and not had to continue debugging the problem. I highly recommend using the above methodology or similar to arrive at a solution most quickly and ultimately save time, money, and frustration.

Contact Us