Creating a contest

I’ve been planning a big contest for later this year, and thought I’d get my feet wet by running a small contest first.  ShortStack allows you to make online contests which use Facebook for identifying voters. I used ShortStack to make a contest where contestants upload their best photo, then the winner is the one who gets the most votes.

I don’t like that ShortStack uses monthly billing, as I doubt I’m going to run a campaign every month. Another alternative I considered is EasyPromos.

The current photo contest.

A record month. Finding people to sponsor isn’t easy.

You would think that it would be easy to find people who:
1. have an audience or following AND

2. want free waterjet cutting

Alas, this is proving elusive so far. Some already get free waterjet cutting, another guy was taking a break from building.

On a brighter note, sales are better than ever. It looks like a record month. I suspect it’s mostly due to SEO, better sales followup, regular newsletters, and not due to the ongoing AdWords experiments.

Using AddThis to encourage viral sharing of products and help purchasing managers

Sometimes my customers who want to buy stuff are not the ones who hold the credit cards. It’s often the case in medium to large companies that this is the job of the purchasing manager. So I needed a way to help get the products to the purchasing manager. I’m having a little trouble getting the whole cart sent in Mijoshop, so the next best thing is to allow customers to send a link to the individual products.

Also, I’ve gotten quite a few sales recently from a particular forum where customers figured out how to share their specialized products. I want to encourage this sort of thing.

To make it easy, I did the sharing links with AddThis.

Identifying forums where your customers hang out

If you’re looking to find out where your customers hang out online, it can be difficult, especially if your customers aren’t all into one thing. For example, I wanted to find customers who need waterjet or laser cutting.These people could be into anything: lighting, cars, bicycles, oil pipelines, etc.

One technique I use is to search for relevant terms using Boardreader. Boardreader searches hundreds (thousands?) of online forums for whatever terms you specify.

If you do a search for forum posts and then click the “Show tools…” link on the results page, you can subscribe to be e-mailed every time there is a new result. However, I have found subscribing via e-mail using BoardReader is unreliable.

The good news is that “Show tools” section you get an RSS link.  You can use your favorite RSS reader to see the latest on your topics across forums. Or, you can do like I do and use Blogtrottr to notify you via e-mail every time your keywords show up on a forum somewhere.

Figuring out why customers aren’t buying from your e-commerce website

My e-commerce conversion rates went down significantly over the course of the past year. One challenge is to figure out why that is.

In order to get inside the heads of your potential customers, I set up a popup form that appears during the quoting and ordering process. It asks one simple question: “What one thing is preventing you from ordering today?” After the customer dismisses the box twice, it doesn’t show up again for a couple days. The results have been very enlightening.

A large plurality of customers so far have mentioned cost as the #1 factor preventing them from buying. So I’ve implemented a couple changes that emphasize the value of what they’re getting. We’ll see if this makes a big difference.

The popup was implemented using Ajax Contact Form for Joomla .

Advice on… advice.

A useful tip I received recently: if someone offers you useful advice/mentoring FOLLOW UP with them to let them know you’re putting their advice into action. It helps them know they’ve done something useful and builds the relationship.

Creating a backup snapshots of my website over time using Page2Images and Google Apps Script

Recently I wanted to dive deeply into some trends I had spotted on my business website. I wanted to see if changes I had made to various pages over time were affecting the way users interacted with the website.

Now, I do use source control and back up the website daily, but all the content is trapped inside a CMS. Restoring from a backup just to take a look at button text from 6 months ago is too much of a hassle. Instead, I wanted an easy way to browse changes over time.

Enter the Page2Images service. It lets you take a screenshot of your website and even lets  you set parameters like screen size, image size, and so on. It’s free to use for the first couple thousand screenshots every month. There’s even an API to let you access everything from inside a program.

Great. Now I just had to set up a script to grab the images a couple times a week. Rather than maintaining this on my own infrastructure, I found that Google has a service called Google Apps Script that lets you write Javascript code that runs on Google’s servers. It allows you to access and manipulate your Google Drive files. And usefully, in my case, it features time based triggers that, in effect, let you kick off your scripts like cron jobs.

I wrote a little script that grabs screenshots and HTML of certain key pages from the target website. I set up time based triggers to run 3 times a week. Everything gets written to my Google Drive account. The script is shown below:

function getWebsiteImage() {
  storeOneUrlImage("http://www.example.com");
  storeOneUrlImage("http://www.example.com/2.html");
 // ... add more URLs here if you want
}

function storeOneUrlImage(url) {
 var url1 = "http://api.page2images.com/restfullink?p2i_url="+encodeURIComponent(url)+"&p2i_device=6&p2i_screen=1200x1024&p2i_size=1200x1024&p2i_key=YOUR_PAGE2IMAGES_API_KEY";
  var response = UrlFetchApp.fetch(url1);
  var responseText = response.getContentText();
  
  var responseHtml = UrlFetchApp.fetch(url);
  var responseHtmlText = responseHtml.getContentText();
  
  var data = JSON.parse(responseText);
  if (data.estimated_need_time) {
    Utilities.sleep(data.estimated_need_time * 2000);
    response = UrlFetchApp.fetch(url1);
    responseText = response.getContentText();
    data = JSON.parse(responseText);
  }
  if (data.image_url) {
    var response2 = UrlFetchApp.fetch(data.image_url);
    var blob = response2.getBlob();
    var d = new Date();
    var folder1 = createOrReturnFolder(DriveApp.getRootFolder(), "Website Image Backups");
    var folder2 = createOrReturnFolder(folder1, d.getYear()+"-"+(d.getMonth()+1));    
    folder2.createFile(blob);
    folder2.createFile(d.getYear()+"-"+(d.getMonth()+1)+"-"+d.getDate()+"-"+blob.getName()+".html" , responseHtmlText);
  }
}

function createOrReturnFolder( parent,  folderName) {
  var folders1 =  parent.getFoldersByName(folderName);
    if (!folders1.hasNext()) {
      var newFolder = parent.createFolder(folderName);
      return newFolder;
    }
  return folders1.next();
}